diff options
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 3 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/pr26992.ll | 37 |
2 files changed, 40 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 7401cb6034a..bbd118c67b8 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -661,6 +661,9 @@ static bool canRewriteGEPAsOffset(Value *Start, Value *Base, } 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); } diff --git a/llvm/test/Transforms/InstCombine/pr26992.ll b/llvm/test/Transforms/InstCombine/pr26992.ll new file mode 100644 index 00000000000..e5bfb5c0e40 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/pr26992.ll @@ -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(...) |