Skip to content

Commit

Permalink
[InstCombine] Teach FoldPHIArgZextsIntoPHI about EHPads
Browse files Browse the repository at this point in the history
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252377 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
majnemer committed Nov 7, 2015
1 parent d81c552 commit 38bab16
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
6 changes: 6 additions & 0 deletions lib/Transforms/InstCombine/InstCombinePHI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
42 changes: 41 additions & 1 deletion test/Transforms/InstCombine/token.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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)

0 comments on commit 38bab16

Please sign in to comment.