[llvm] b16c5f7 - [NVPTX] Clear unsafe kill flags in NVPTXProxyRegErasure (#198143)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 20 07:33:16 PDT 2026


Author: yinghao
Date: 2026-07-20T16:33:11+02:00
New Revision: b16c5f7cc88c9f41d904cc73d5618cc7453ac862

URL: https://github.com/llvm/llvm-project/commit/b16c5f7cc88c9f41d904cc73d5618cc7453ac862
DIFF: https://github.com/llvm/llvm-project/commit/b16c5f7cc88c9f41d904cc73d5618cc7453ac862.diff

LOG: [NVPTX] Clear unsafe kill flags in NVPTXProxyRegErasure (#198143)

Fixes #198142

After replacing regsiter, stale `killed` flags my leave on non-terminal
uses, breaking liveness and triggering MachineVerifier errors.
    
Fix this by conservatively dropping the `killed` flag on `ToReg`.

Added: 
    llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir

Modified: 
    llvm/lib/Target/NVPTX/NVPTXProxyRegErasure.cpp
    llvm/test/CodeGen/NVPTX/proxy-reg-erasure.mir

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/NVPTX/NVPTXProxyRegErasure.cpp b/llvm/lib/Target/NVPTX/NVPTXProxyRegErasure.cpp
index bac036f3a93ae..7daea6a840e37 100644
--- a/llvm/lib/Target/NVPTX/NVPTXProxyRegErasure.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXProxyRegErasure.cpp
@@ -20,6 +20,7 @@
 
 #include "NVPTX.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
+#include "llvm/CodeGen/MachineRegisterInfo.h"
 #include "llvm/CodeGen/TargetRegisterInfo.h"
 
 using namespace llvm;
@@ -87,17 +88,11 @@ bool NVPTXProxyRegErasure::runOnMachineFunction(MachineFunction &MF) {
     MI->eraseFromParent();
   }
 
-  // Now go replace the registers.
-  for (auto &BB : MF) {
-    for (auto &MI : BB) {
-      for (auto &Op : MI.uses()) {
-        if (!Op.isReg())
-          continue;
-        auto it = RAUWBatch.find(Op.getReg());
-        if (it != RAUWBatch.end())
-          Op.setReg(it->second);
-      }
-    }
+  // Now go replace the registers and remove kill flags conservatively.
+  MachineRegisterInfo &MRI = MF.getRegInfo();
+  for (auto [From, To] : RAUWBatch) {
+    MRI.replaceRegWith(From, To);
+    MRI.clearKillFlags(To);
   }
 
   return true;

diff  --git a/llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir b/llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir
new file mode 100644
index 0000000000000..73eabe0f50890
--- /dev/null
+++ b/llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir
@@ -0,0 +1,18 @@
+# RUN: llc %s --run-pass=nvptx-proxyreg-erasure -mtriple=nvptx64 -o - | FileCheck %s
+
+---
+name: test_proxy_reg
+tracksRegLiveness: true
+body: |
+  bb.0:
+    %0:b32 = IMPLICIT_DEF
+    %1:b16 = IMPLICIT_DEF
+
+    ; CHECK: %2:b16 = CVT_u16_u32 %0, 0
+    ; CHECK-NEXT: %4:b16 = ADD16rr %1, %2
+    ; CHECK-NEXT: %5:b16 = ADD16rr %1, %2
+    %2:b16 = CVT_u16_u32 %0:b32, 0
+    %3:b16 = ProxyRegB16 %2:b16
+    %4:b16 = ADD16rr %1:b16, killed %3:b16
+    %5:b16 = ADD16rr %1:b16, %2:b16
+...

diff  --git a/llvm/test/CodeGen/NVPTX/proxy-reg-erasure.mir b/llvm/test/CodeGen/NVPTX/proxy-reg-erasure.mir
index a84b7fcd33836..59ca24acc504c 100644
--- a/llvm/test/CodeGen/NVPTX/proxy-reg-erasure.mir
+++ b/llvm/test/CodeGen/NVPTX/proxy-reg-erasure.mir
@@ -83,7 +83,7 @@ body:             |
     %5:b32 = ProxyRegB32 killed %1
     %6:b32 = ProxyRegB32 killed %2
     %7:b32 = ProxyRegB32 killed %3
-    ; CHECK: STV_i32_v4 killed %0, killed %1, killed %2, killed %3
+    ; CHECK: STV_i32_v4 %0, %1, %2, %3
     STV_i32_v4 killed %4, killed %5, killed %6, killed %7, 0, 0, 101, 32, &func_retval0, 0 :: (store (s128), addrspace 101)
 
     %8:b32 = LD_i32 0, 0, 101, 3, 32, -1, &retval0, 0 :: (load (s32), addrspace 101)
@@ -91,7 +91,7 @@ body:             |
     %9:b32 = ProxyRegB32 killed %8
     %10:b32 = ProxyRegB32 killed %9
     %11:b32 = ProxyRegB32 killed %10
-    ; CHECK: ST_i32 killed %8
+    ; CHECK: ST_i32 %8
     ST_i32 killed %11, 0, 0, 101, 32, &func_retval0, 0 :: (store (s32), addrspace 101)
     Return
 


        


More information about the llvm-commits mailing list