aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/CodeGen/SwiftErrorValueTracking.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/SwiftErrorValueTracking.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/CodeGen/SwiftErrorValueTracking.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/SwiftErrorValueTracking.cpp b/contrib/llvm-project/llvm/lib/CodeGen/SwiftErrorValueTracking.cpp
index 83a7063de112..74a94d6110f4 100644
--- a/contrib/llvm-project/llvm/lib/CodeGen/SwiftErrorValueTracking.cpp
+++ b/contrib/llvm-project/llvm/lib/CodeGen/SwiftErrorValueTracking.cpp
@@ -253,6 +253,25 @@ void SwiftErrorValueTracking::propagateVRegs() {
setCurrentVReg(MBB, SwiftErrorVal, PHIVReg);
}
}
+
+ // Create implicit defs for upward uses from unreachable blocks
+ MachineRegisterInfo &MRI = MF->getRegInfo();
+ for (const auto &Use : VRegUpwardsUse) {
+ const MachineBasicBlock *UseBB = Use.first.first;
+ Register VReg = Use.second;
+ if (!MRI.def_begin(VReg).atEnd())
+ continue;
+
+#ifdef EXPENSIVE_CHECKS
+ assert(std::find(RPOT.begin(), RPOT.end(), UseBB) == RPOT.end() &&
+ "Reachable block has VReg upward use without definition.");
+#endif
+
+ MachineBasicBlock *UseBBMut = MF->getBlockNumbered(UseBB->getNumber());
+
+ BuildMI(*UseBBMut, UseBBMut->getFirstNonPHI(), DebugLoc(),
+ TII->get(TargetOpcode::IMPLICIT_DEF), VReg);
+ }
}
void SwiftErrorValueTracking::preassignVRegs(