[llvm] 0e74d75 - [StructurizeCFG] Fix boolean not bug

Jay Foad via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 22 09:38:25 PST 2022


Author: Jay Foad
Date: 2022-02-22T17:36:20Z
New Revision: 0e74d75a295729bc145724ffa0495fee4d1b598c

URL: https://github.com/llvm/llvm-project/commit/0e74d75a295729bc145724ffa0495fee4d1b598c
DIFF: https://github.com/llvm/llvm-project/commit/0e74d75a295729bc145724ffa0495fee4d1b598c.diff

LOG: [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

Added: 
    

Modified: 
    llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
    llvm/test/Transforms/StructurizeCFG/invert-condition.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
index b3a445368537d..14c7433531e5c 100644
--- a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
+++ b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
@@ -1089,8 +1089,8 @@ bool StructurizeCFG::run(Region *R, DominatorTree *DT) {
   createFlow();
   insertConditions(false);
   insertConditions(true);
-  simplifyConditions();
   setPhiValues();
+  simplifyConditions();
   simplifyAffectedPhis();
   rebuildSSA();
 

diff  --git a/llvm/test/Transforms/StructurizeCFG/invert-condition.ll b/llvm/test/Transforms/StructurizeCFG/invert-condition.ll
index 5b6f1d8545175..aa8589563484c 100644
--- a/llvm/test/Transforms/StructurizeCFG/invert-condition.ll
+++ b/llvm/test/Transforms/StructurizeCFG/invert-condition.ll
@@ -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:


        


More information about the llvm-commits mailing list