diff --git a/llvm/lib/CodeGen/SwiftErrorValueTracking.cpp b/llvm/lib/CodeGen/SwiftErrorValueTracking.cpp --- a/llvm/lib/CodeGen/SwiftErrorValueTracking.cpp +++ b/llvm/lib/CodeGen/SwiftErrorValueTracking.cpp @@ -253,6 +253,24 @@ setCurrentVReg(MBB, SwiftErrorVal, PHIVReg); } } + + // Create implicit defs for upward uses from unreachable blocks + MachineRegisterInfo &MRI = MF->getRegInfo(); + for (auto UseIt = VRegUpwardsUse.begin(), End = VRegUpwardsUse.end(); + UseIt != End; ++UseIt) { + const MachineBasicBlock *UseBB = UseIt->first.first; + Register VReg = UseIt->second; + if (!MRI.def_begin(VReg).atEnd()) + continue; + + assert(std::find(RPOT.begin(), RPOT.end(), UseBB) == RPOT.end() && + "Reachable block has VReg upward use without definition."); + + MachineBasicBlock *UseBBMut = MF->getBlockNumbered(UseBB->getNumber()); + + BuildMI(*UseBBMut, UseBBMut->getFirstNonPHI(), DebugLoc(), + TII->get(TargetOpcode::IMPLICIT_DEF), VReg); + } } void SwiftErrorValueTracking::preassignVRegs( diff --git a/llvm/test/CodeGen/AArch64/swift-error-unreachable-use.ll b/llvm/test/CodeGen/AArch64/swift-error-unreachable-use.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/swift-error-unreachable-use.ll @@ -0,0 +1,30 @@ +; RUN: llc < %s +; +; Regression test for https://github.com/llvm/llvm-project/issues/59751 + +target triple = "aarch64-unknown" + +define void @"func"(i32** swifterror %0) #0 { + br label %thirtyeight + +five: + br label %UelOc2l.exit + +common.ret: + ret void + +UelOc2l.exit: + %a = getelementptr inbounds [754 x i8*], [754 x i8*]* undef, i32 undef, i32 undef + %b = load i8*, i8** %a, align 8 + %c = bitcast i8* %b to void ()* + call void %c() + br label %common.ret + +thirtythree: + br i1 false, label %UelOc2l.exit, label %thirtythree + +thirtyeight: + br i1 undef, label %thirtyeight, label %thirtythree +} + +attributes #0 = { noinline optnone } \ No newline at end of file