[PATCH] D141053: [SwiftError] Use IMPLICIT_DEF as a definition for unreachable VReg uses
Filipp Zhinkin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 20 00:04:10 PST 2023
fzhinkin updated this revision to Diff 498744.
fzhinkin added a comment.
Rebased
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D141053/new/
https://reviews.llvm.org/D141053
Files:
llvm/lib/CodeGen/SwiftErrorValueTracking.cpp
llvm/test/CodeGen/AArch64/swift-error-unreachable-use.ll
Index: llvm/test/CodeGen/AArch64/swift-error-unreachable-use.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AArch64/swift-error-unreachable-use.ll
@@ -0,0 +1,50 @@
+; RUN: llc -mtriple aarch64-unknown-windows-msvc %s -filetype asm -o - | FileCheck %s
+; RUN: llc -mtriple aarch64-unknown-linux-gnu %s -filetype asm -o - | FileCheck %s
+; RUN: llc -mtriple aarch64-apple-macosx %s -filetype asm -o - | FileCheck -check-prefix=CHECK-APPLE %s
+; Regression test for https://github.com/llvm/llvm-project/issues/59751
+
+define void @"func"(i32** swifterror %0) #0 {
+; CHECK-LABEL: func:
+; CHECK: // %bb.0:
+; CHECK-NEXT: b .LBB0_2
+; CHECK-NEXT: .LBB0_1: // %thirtythree
+; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
+; CHECK-NEXT: b .LBB0_1
+; CHECK-NEXT: .LBB0_2: // %thirtyeight
+; CHECK-NEXT: b .LBB0_3
+; CHECK-NEXT: .LBB0_3: // %thirtythree.preheader
+; CHECK-NEXT: b .LBB0_1
+;
+; CHECK-APPLE-LABEL: func:
+; CHECK-APPLE: ; %bb.0:
+; CHECK-APPLE-NEXT: b LBB0_2
+; CHECK-APPLE-NEXT: LBB0_1: ; %thirtythree
+; CHECK-APPLE-NEXT: ; =>This Inner Loop Header: Depth=1
+; CHECK-APPLE-NEXT: b LBB0_1
+; CHECK-APPLE-NEXT: LBB0_2: ; %thirtyeight
+; CHECK-APPLE-NEXT: b LBB0_3
+; CHECK-APPLE-NEXT: LBB0_3: ; %thirtythree.preheader
+; CHECK-APPLE-NEXT: b LBB0_1
+ 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 }
Index: llvm/lib/CodeGen/SwiftErrorValueTracking.cpp
===================================================================
--- llvm/lib/CodeGen/SwiftErrorValueTracking.cpp
+++ llvm/lib/CodeGen/SwiftErrorValueTracking.cpp
@@ -253,6 +253,25 @@
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(
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D141053.498744.patch
Type: text/x-patch
Size: 2905 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230220/63db6e58/attachment.bin>
More information about the llvm-commits
mailing list