[WinEH] Update PHIs of CATCHRET successors

The TailDuplication machine pass ran across a malformed CFG: a PHI node
referred it's predecessor's predecessor instead of it's predecessor.
This occurred because we split the edge in X86ISelLowering when we
processed the CATCHRET but forgot to do something about the PHI nodes.

This fixes PR25444.

llvm-svn: 252413
This commit is contained in:
David Majnemer 2015-11-08 02:36:00 +00:00
parent c4898504ea
commit e35244cf63
2 changed files with 36 additions and 2 deletions

View File

@ -21419,10 +21419,10 @@ X86TargetLowering::EmitLoweredCatchRet(MachineInstr *MI,
// the new block to the return destination with a normal JMP_4.
MachineBasicBlock *RestoreMBB =
MF->CreateMachineBasicBlock(BB->getBasicBlock());
assert(BB->succ_size() == 1);
MF->insert(TargetMBB->getIterator(), RestoreMBB);
BB->removeSuccessor(TargetMBB);
RestoreMBB->transferSuccessorsAndUpdatePHIs(BB);
BB->addSuccessor(RestoreMBB);
RestoreMBB->addSuccessor(TargetMBB);
MI->getOperand(0).setMBB(RestoreMBB);
auto RestoreMBBI = RestoreMBB->begin();

View File

@ -0,0 +1,34 @@
; RUN: llc < %s | FileCheck %s
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
target triple = "i686-pc-windows-msvc18.0.0"
define void @f() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
entry:
invoke void @g()
to label %try.cont unwind label %catch.dispatch
catch.dispatch: ; preds = %entry
%0 = catchpad [i8* null, i32 64, i8* null]
to label %catch unwind label %catchendblock
catch: ; preds = %catch.dispatch
catchret %0 to label %try.cont
try.cont: ; preds = %entry, %catch
%b.0 = phi i1 [ false, %catch ], [ true, %entry ]
tail call void @h(i1 zeroext %b.0)
ret void
catchendblock: ; preds = %catch.dispatch
catchendpad unwind to caller
}
; CHECK-LABEL: _f:
; CHECK: calll _g
; CHECK: calll _h
declare void @g()
declare i32 @__CxxFrameHandler3(...)
declare void @h(i1 zeroext)