[llvm] r263874 - [InstCombine] Don't insert instructions before a catch switch

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 18 21:39:53 PDT 2016


Author: majnemer
Date: Fri Mar 18 23:39:52 2016
New Revision: 263874

URL: http://llvm.org/viewvc/llvm-project?rev=263874&view=rev
Log:
[InstCombine] Don't insert instructions before a catch switch

CatchSwitches are not splittable, we cannot insert casts, etc. before
them.

This fixes PR26992.

Added:
    llvm/trunk/test/Transforms/InstCombine/pr26992.ll
Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=263874&r1=263873&r2=263874&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Fri Mar 18 23:39:52 2016
@@ -661,6 +661,9 @@ static bool canRewriteGEPAsOffset(Value
       }
 
       if (auto *PN = dyn_cast<PHINode>(V)) {
+        // We cannot transform PHIs on unsplittable basic blocks.
+        if (isa<CatchSwitchInst>(PN->getParent()->getTerminator()))
+          return false;
         Explored.insert(PN);
         PHIs.insert(PN);
       }

Added: llvm/trunk/test/Transforms/InstCombine/pr26992.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/pr26992.ll?rev=263874&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/pr26992.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/pr26992.ll Fri Mar 18 23:39:52 2016
@@ -0,0 +1,37 @@
+; RUN: opt -instcombine -S < %s | FileCheck %s
+target triple = "x86_64-pc-windows-msvc"
+
+define i1 @test1(i8* %p) personality i32 (...)* @__CxxFrameHandler3 {
+entry:
+  %a = getelementptr i8, i8* %p, i64 1
+  invoke void @may_throw()
+          to label %invoke.cont unwind label %catch.dispatch
+
+invoke.cont:
+  %b = getelementptr inbounds i8, i8* %a, i64 1
+  invoke void @may_throw()
+          to label %exit unwind label %catch.dispatch
+
+catch.dispatch:
+  %c = phi i8* [ %b, %invoke.cont ], [ %a, %entry ]
+  %tmp1 = catchswitch within none [label %catch] unwind to caller
+
+catch:
+  %tmp2 = catchpad within %tmp1 [i8* null, i32 64, i8* null]
+  catchret from %tmp2 to label %exit
+
+exit:
+  %d = phi i8* [ %a, %invoke.cont ], [ %c, %catch ]
+  %cmp = icmp eq i8* %d, %a
+  ret i1 %cmp
+}
+
+; CHECK-LABEL: define i1 @test1(
+; CHECK:  %[[gep_a:.*]] = getelementptr i8, i8* %p, i64 1
+; CHECK:  %[[gep_b:.*]] = getelementptr inbounds i8, i8* %p, i64 2
+; CHECK:  phi i8* [ %[[gep_b]], {{.*}} ], [ %[[gep_a]], {{.*}} ]
+; CHECK:  %tmp1 = catchswitch within none [label %catch] unwind to caller
+
+declare void @may_throw()
+
+declare i32 @__CxxFrameHandler3(...)




More information about the llvm-commits mailing list