[llvm] a0537fc - [SimplifyCFG] Fix crash in the EXPENSIVE_CHECKS build

Jon Roelofs via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 16 14:35:12 PDT 2020


Author: Jon Roelofs
Date: 2020-07-16T15:34:41-06:00
New Revision: a0537fc35f0e72123e426ced7879188aaab6f76b

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

LOG: [SimplifyCFG] Fix crash in the EXPENSIVE_CHECKS build

SimplifyCFG was incorrectly reporting to the pass manager that it had not made
changes after folding away a PHI.  This is detected in the EXPENSIVE_CHECKS
build when the function's hash changes.

Differential Revision: https://reviews.llvm.org/D83985

Added: 
    llvm/test/Transforms/SimplifyCFG/two-entry-phi-fold-crash.ll

Modified: 
    llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 5aa929fa1822..aa015ffe5622 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -2404,11 +2404,13 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
   int BudgetRemaining =
       TwoEntryPHINodeFoldingThreshold * TargetTransformInfo::TCC_Basic;
 
+  bool Changed = false;
   for (BasicBlock::iterator II = BB->begin(); isa<PHINode>(II);) {
     PHINode *PN = cast<PHINode>(II++);
     if (Value *V = SimplifyInstruction(PN, {DL, PN})) {
       PN->replaceAllUsesWith(V);
       PN->eraseFromParent();
+      Changed = true;
       continue;
     }
 
@@ -2416,7 +2418,7 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
                              BudgetRemaining, TTI) ||
         !DominatesMergePoint(PN->getIncomingValue(1), BB, AggressiveInsts,
                              BudgetRemaining, TTI))
-      return false;
+      return Changed;
   }
 
   // If we folded the first phi, PN dangles at this point.  Refresh it.  If
@@ -2443,7 +2445,7 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
        isa<BinaryOperator>(IfCond)) &&
       !CanHoistNotFromBothValues(PN->getIncomingValue(0),
                                  PN->getIncomingValue(1)))
-    return false;
+    return Changed;
 
   // If all PHI nodes are promotable, check to make sure that all instructions
   // in the predecessor blocks can be promoted as well. If not, we won't be able
@@ -2461,7 +2463,7 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
         // This is not an aggressive instruction that we can promote.
         // Because of this, we won't be able to get rid of the control flow, so
         // the xform is not worth it.
-        return false;
+        return Changed;
       }
   }
 
@@ -2474,7 +2476,7 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
         // This is not an aggressive instruction that we can promote.
         // Because of this, we won't be able to get rid of the control flow, so
         // the xform is not worth it.
-        return false;
+        return Changed;
       }
   }
   assert(DomBlock && "Failed to find root DomBlock");

diff  --git a/llvm/test/Transforms/SimplifyCFG/two-entry-phi-fold-crash.ll b/llvm/test/Transforms/SimplifyCFG/two-entry-phi-fold-crash.ll
new file mode 100644
index 000000000000..1a620617f7b3
--- /dev/null
+++ b/llvm/test/Transforms/SimplifyCFG/two-entry-phi-fold-crash.ll
@@ -0,0 +1,52 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -S -simplifycfg -debug-pass=Details 2>&1 | FileCheck %s
+
+;; Check the report from the pass manager, telling us whether simplifycfg
+;; reported the "changed" status correctly:
+; CHECK: Made Modification 'Simplify the CFG' on Function 'wibble'...
+
+declare i32 @blam(i8*, i32)
+
+define i32 @wibble(i8* %arg, i8** %arg1) {
+; CHECK-LABEL: @wibble(
+; CHECK-NEXT:  bb:
+; CHECK-NEXT:    br label [[BB2:%.*]]
+; CHECK:       bb2:
+; CHECK-NEXT:    [[BORG:%.*]] = phi i32 [ 0, [[BB:%.*]] ], [ [[BORG]], [[BB8:%.*]] ]
+; CHECK-NEXT:    [[BORG3:%.*]] = phi i32 [ 8, [[BB]] ], [ [[BORG10:%.*]], [[BB8]] ]
+; CHECK-NEXT:    [[BORG4:%.*]] = tail call i32 @blam(i8* [[ARG:%.*]], i32 [[BORG]])
+; CHECK-NEXT:    [[BORG5:%.*]] = icmp eq i32 [[BORG4]], 0
+; CHECK-NEXT:    br i1 [[BORG5]], label [[BB8]], label [[BB6:%.*]]
+; CHECK:       bb6:
+; CHECK-NEXT:    [[BORG7:%.*]] = load i8*, i8** [[ARG1:%.*]], align 4
+; CHECK-NEXT:    br label [[BB8]]
+; CHECK:       bb8:
+; CHECK-NEXT:    [[BORG10]] = phi i32 [ [[BORG4]], [[BB6]] ], [ [[BORG3]], [[BB2]] ]
+; CHECK-NEXT:    [[BORG11:%.*]] = icmp ult i32 [[BORG]], 2
+; CHECK-NEXT:    br i1 [[BORG11]], label [[BB2]], label [[BB12:%.*]]
+; CHECK:       bb12:
+; CHECK-NEXT:    ret i32 1
+;
+bb:
+  br label %bb2
+
+bb2:                                              ; preds = %bb8, %bb
+  %borg = phi i32 [ 0, %bb ], [ %borg9, %bb8 ]
+  %borg3 = phi i32 [ 8, %bb ], [ %borg10, %bb8 ]
+  %borg4 = tail call i32 @blam(i8* %arg, i32 %borg)
+  %borg5 = icmp eq i32 %borg4, 0
+  br i1 %borg5, label %bb8, label %bb6
+
+bb6:                                              ; preds = %bb2
+  %borg7 = load i8*, i8** %arg1, align 4
+  br label %bb8
+
+bb8:                                              ; preds = %bb6, %bb2
+  %borg9 = phi i32 [ %borg, %bb6 ], [ %borg, %bb2 ]
+  %borg10 = phi i32 [ %borg4, %bb6 ], [ %borg3, %bb2 ]
+  %borg11 = icmp ult i32 %borg9, 2
+  br i1 %borg11, label %bb2, label %bb12
+
+bb12:                                             ; preds = %bb8
+  ret i32 1
+}


        


More information about the llvm-commits mailing list