[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