/// 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.
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)