[llvm] r215574 - utils: Fix segfault in flattencfg

Jan Vesely jan.vesely at rutgers.edu
Wed Aug 13 13:31:54 PDT 2014


Author: jvesely
Date: Wed Aug 13 15:31:53 2014
New Revision: 215574

URL: http://llvm.org/viewvc/llvm-project?rev=215574&view=rev
Log:
utils: Fix segfault in flattencfg

v2: continue iterating through the rest of the bb
    use for loop

v3: initialize FlattenCFG pass in ScalarOps
    add test

v4: split off initializing flattencfg to a separate patch
    add comment

Signed-off-by: Jan Vesely <jan.vesely at rutgers.edu>

Added:
    llvm/trunk/test/Transforms/Util/
    llvm/trunk/test/Transforms/Util/flattencfg.ll
Modified:
    llvm/trunk/lib/Transforms/Utils/FlattenCFG.cpp

Modified: llvm/trunk/lib/Transforms/Utils/FlattenCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/FlattenCFG.cpp?rev=215574&r1=215573&r2=215574&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/FlattenCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/FlattenCFG.cpp Wed Aug 13 15:31:53 2014
@@ -238,9 +238,13 @@ bool FlattenCFGOpt::FlattenParallelAndOr
     // Do branch inversion.
     BasicBlock *CurrBlock = LastCondBlock;
     bool EverChanged = false;
-    while (1) {
+    for (;CurrBlock != FirstCondBlock;
+          CurrBlock = CurrBlock->getSinglePredecessor()) {
       BranchInst *BI = dyn_cast<BranchInst>(CurrBlock->getTerminator());
       CmpInst *CI = dyn_cast<CmpInst>(BI->getCondition());
+      if (!CI)
+        continue;
+
       CmpInst::Predicate Predicate = CI->getPredicate();
       // Canonicalize icmp_ne -> icmp_eq, fcmp_one -> fcmp_oeq
       if ((Predicate == CmpInst::ICMP_NE) || (Predicate == CmpInst::FCMP_ONE)) {
@@ -248,9 +252,6 @@ bool FlattenCFGOpt::FlattenParallelAndOr
         BI->swapSuccessors();
         EverChanged = true;
       }
-      if (CurrBlock == FirstCondBlock)
-        break;
-      CurrBlock = CurrBlock->getSinglePredecessor();
     }
     return EverChanged;
   }

Added: llvm/trunk/test/Transforms/Util/flattencfg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Util/flattencfg.ll?rev=215574&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/Util/flattencfg.ll (added)
+++ llvm/trunk/test/Transforms/Util/flattencfg.ll Wed Aug 13 15:31:53 2014
@@ -0,0 +1,26 @@
+; RUN: opt -flattencfg -S < %s | FileCheck %s
+
+
+; This test checks whether the pass completes without a crash.
+; The code is not transformed in any way
+;
+; CHECK-LABEL: @test_not_crash
+define void @test_not_crash(i32 %in_a) #0 {
+entry:
+  %cmp0 = icmp eq i32 %in_a, -1
+  %cmp1 = icmp ne i32 %in_a, 0
+  %cond0 = and i1 %cmp0, %cmp1
+  br i1 %cond0, label %b0, label %b1
+
+b0:                                ; preds = %entry
+  %cmp2 = icmp eq i32 %in_a, 0
+  %cmp3 = icmp ne i32 %in_a, 1
+  %cond1 = or i1 %cmp2, %cmp3
+  br i1 %cond1, label %exit, label %b1
+
+b1:                                       ; preds = %entry, %b0
+  br label %exit
+
+exit:                               ; preds = %entry, %b0, %b1
+  ret void
+}





More information about the llvm-commits mailing list