From a3e5642aba317bf272530db77a8fcccde66e2031 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sun, 8 Nov 2015 02:36:00 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252413 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 4 ++-- test/CodeGen/X86/tail-dup-catchret.ll | 34 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/X86/tail-dup-catchret.ll diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index f5efd58e7a3..8d7712d3cd0 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -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(); diff --git a/test/CodeGen/X86/tail-dup-catchret.ll b/test/CodeGen/X86/tail-dup-catchret.ll new file mode 100644 index 00000000000..18682fb690e --- /dev/null +++ b/test/CodeGen/X86/tail-dup-catchret.ll @@ -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) -- 2.34.1