[LICM] Fix a small oversight introduced in r256763
authorDavid Majnemer <david.majnemer@gmail.com>
Mon, 4 Jan 2016 23:16:22 +0000 (23:16 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Mon, 4 Jan 2016 23:16:22 +0000 (23:16 +0000)
r256763 had promoteLoopAccessesToScalars check for the existence of a
catchswitch when the exit blocks were populated but
promoteLoopAccessesToScalars may be called with a prepopulated set of
exit blocks which would also need to be checked.

This fixes PR26019.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256788 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LICM.cpp
test/Transforms/LICM/funclet.ll

index 2d6f6cecafeaf5e2799361d4297d44e2643e7e62..e01e23f71732d045da0b0658ec383bac850c6eb9 100644 (file)
@@ -1015,15 +1015,15 @@ bool llvm::promoteLoopAccessesToScalars(AliasSet &AS,
     CurLoop->getUniqueExitBlocks(ExitBlocks);
     InsertPts.clear();
     InsertPts.reserve(ExitBlocks.size());
-    for (BasicBlock *ExitBlock : ExitBlocks) {
-      // Can't insert into a catchswitch.
-      if (isa<CatchSwitchInst>(ExitBlock->getTerminator()))
-        return Changed;
-
+    for (BasicBlock *ExitBlock : ExitBlocks)
       InsertPts.push_back(&*ExitBlock->getFirstInsertionPt());
-    }
   }
 
+  // Can't insert into a catchswitch.
+  for (BasicBlock *ExitBlock : ExitBlocks)
+    if (isa<CatchSwitchInst>(ExitBlock->getTerminator()))
+      return Changed;
+
   // Otherwise, this is safe to promote, lets do it!
   DEBUG(dbgs() << "LICM: Promoting value stored to in loop: " <<*SomePtr<<'\n');
   Changed = true;
index 10001526ffc93972e465cbd8b31ed90ab67fc71b..ef4be2969151aab221709ca1da29d4f683dec461 100644 (file)
@@ -63,7 +63,9 @@ try.cont:                                         ; preds = %catch, %while.cond
 define void @test3(i1 %a, i1 %b, i1 %c) personality i32 (...)* @__CxxFrameHandler3 {
 entry:
   %.frame = alloca i8, align 4
+  %.frame2 = alloca i8, align 4
   %bc = bitcast i8* %.frame to i32*
+  %bc2 = bitcast i8* %.frame2 to i32*
   br i1 %a, label %try.success.or.caught, label %forbody
 
 catch.object.Throwable:                           ; preds = %catch.dispatch
@@ -84,6 +86,7 @@ catch.dispatch:                                   ; preds = %else, %forbody
 
 forbody:                                          ; preds = %forcond.backedge, %0
   store i32 1, i32* %bc, align 4
+  store i32 2, i32* %bc2, align 4
   invoke void @may_throw()
           to label %postinvoke unwind label %catch.dispatch
 
@@ -95,6 +98,7 @@ else:                                             ; preds = %postinvoke
 ; CHECK-LABEL: define void @test3(
 ; CHECK:      catchswitch within none
 ; CHECK:      store i32 1, i32* %bc, align 4
+; CHECK:      store i32 2, i32* %bc2, align 4
 
 declare void @may_throw()