[StructurizeCFG] Fix boolean not bug

D118623 added code to fold not-of-compare into a compare
with the inverted predicate, if the compare had no other
uses. This relies on accurate use lists in the IR but it
was run before setPhiValues, when some phi inputs are still
stored in a data structure on the side, instead of being
real uses in the IR. The effect was that a phi that should
be using the original compare result would now get an
inverted result instead.

Fix this by moving simplifyConditions after setPhiValues.

Differential Revision: https://reviews.llvm.org/D120312
This commit is contained in:
Jay Foad 2022-02-22 09:49:19 +00:00
parent cedc23bc86
commit 0e74d75a29
2 changed files with 4 additions and 5 deletions

View File

@ -1089,8 +1089,8 @@ bool StructurizeCFG::run(Region *R, DominatorTree *DT) {
createFlow();
insertConditions(false);
insertConditions(true);
simplifyConditions();
setPhiValues();
simplifyConditions();
simplifyAffectedPhis();
rebuildSSA();

View File

@ -29,13 +29,12 @@ bb5: ; preds = %bb2
ret void
}
; FIXME: StructurizeCFG modifies I5 in-place without updating the use of I5 in
; the phi instruction.
define void @invert_condition_phi(i32 %arg) {
; CHECK-LABEL: @invert_condition_phi(
; CHECK-NEXT: main_body:
; CHECK-NEXT: [[I5:%.*]] = icmp ne i32 [[ARG:%.*]], 0
; CHECK-NEXT: br i1 [[I5]], label [[IF1:%.*]], label [[ENDIF1:%.*]]
; CHECK-NEXT: [[I5:%.*]] = icmp eq i32 [[ARG:%.*]], 0
; CHECK-NEXT: [[I5_INV:%.*]] = xor i1 [[I5]], true
; CHECK-NEXT: br i1 [[I5_INV]], label [[IF1:%.*]], label [[ENDIF1:%.*]]
; CHECK: if1:
; CHECK-NEXT: br label [[ENDIF1]]
; CHECK: endif1: