[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