diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-11-07 00:52:53 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-11-07 00:52:53 +0000 |
commit | eafa28a0d9274d9cdd9f02ac4a42ea9ee76d3313 (patch) | |
tree | 10cb94ef46df61b7e0cc925e22fd0b50a2f15fba | |
parent | 48684b073e37211594d0eb0155aea8bb44214e94 (diff) | |
download | bcm5719-llvm-eafa28a0d9274d9cdd9f02ac4a42ea9ee76d3313.tar.gz bcm5719-llvm-eafa28a0d9274d9cdd9f02ac4a42ea9ee76d3313.zip |
[InstCombine] Teach FoldPHIArgZextsIntoPHI about EHPads
FoldPHIArgZextsIntoPHI cannot insert an instruction after the PHI if
there is an EHPad in the BB. Doing so would result in an instruction
inserted after a terminator.
llvm-svn: 252377
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp | 6 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/token.ll | 42 |
2 files changed, 47 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp b/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp index a9f8f49d2f1..f1aa98b5e35 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp @@ -401,6 +401,12 @@ Instruction *InstCombiner::FoldPHIArgLoadIntoPHI(PHINode &PN) { /// require special-casing a cast from the 'i1' type. See the comment in /// FoldPHIArgOpIntoPHI() about pessimizing illegal integer types. Instruction *InstCombiner::FoldPHIArgZextsIntoPHI(PHINode &Phi) { + // We cannot create a new instruction after the PHI if the terminator is an + // EHPad because there is no valid insertion point. + if (TerminatorInst *TI = Phi.getParent()->getTerminator()) + if (TI->isEHPad()) + return nullptr; + // Early exit for the common case of a phi with two operands. These are // handled elsewhere. See the comment below where we check the count of zexts // and constants for more details. diff --git a/llvm/test/Transforms/InstCombine/token.ll b/llvm/test/Transforms/InstCombine/token.ll index c8f1dc1bc31..e47109b6164 100644 --- a/llvm/test/Transforms/InstCombine/token.ll +++ b/llvm/test/Transforms/InstCombine/token.ll @@ -48,10 +48,50 @@ endpad: catchendpad unwind to caller } - ; CHECK-LABEL: define void @test2( ; CHECK: %X = zext i8 %A to i32 ; CHECK: %Y = zext i8 %B to i32 ; CHECK: %phi = phi i32 [ %X, %bb ], [ %Y, %cont ] +define void @test3(i8 %A, i8 %B) personality i32 (...)* @__CxxFrameHandler3 { +bb: + %X = zext i8 %A to i32 + invoke void @g(i32 0) + to label %cont + unwind label %catch + +cont: + %Y = zext i8 %B to i32 + invoke void @g(i32 0) + to label %cont2 + unwind label %catch + +cont2: + invoke void @g(i32 0) + to label %unreachable + unwind label %catch + +catch: + %phi = phi i32 [ %X, %bb ], [ %Y, %cont ], [ %Y, %cont2 ] + %cl = catchpad [] + to label %doit + unwind label %endpad + +doit: + call void @g(i32 %phi) + unreachable + +unreachable: + unreachable + +endpad: + catchendpad unwind to caller +} + +; CHECK-LABEL: define void @test3( +; CHECK: %X = zext i8 %A to i32 +; CHECK: %Y = zext i8 %B to i32 +; CHECK: %phi = phi i32 [ %X, %bb ], [ %Y, %cont ], [ %Y, %cont2 ] + + declare void @g(i32) |