[llvm] [NVPTX] Fix incorrect kill flags in ProxyRegErasure (PR #198143)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 10 06:55:33 PDT 2026
https://github.com/andreww0210 updated https://github.com/llvm/llvm-project/pull/198143
>From a8a4ee2133041559c7778a1ea83fd5feb1c8ca6f Mon Sep 17 00:00:00 2001
From: yinghao <itsyinghao at gmail.com>
Date: Sun, 17 May 2026 11:12:43 +0800
Subject: [PATCH 1/2] [NVPTX] Clear unsafe kill flags in NVPTXProxyRegErasure
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`.
Fixes #198142.
---
.../lib/Target/NVPTX/NVPTXProxyRegErasure.cpp | 17 +++++--------
.../NVPTX/proxy-reg-erasure-kill-flag.mir | 25 +++++++++++++++++++
llvm/test/CodeGen/NVPTX/proxy-reg-erasure.mir | 4 +--
3 files changed, 33 insertions(+), 13 deletions(-)
create mode 100644 llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir
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..e56b3192ac704
--- /dev/null
+++ b/llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir
@@ -0,0 +1,25 @@
+# RUN: llc %s --run-pass=nvptx-proxyreg-erasure -verify-machineinstrs -mtriple=nvptx64 -o - | FileCheck %s
+
+--- |
+ define void @test_proxy_reg() {
+ entry:
+ ret void
+ }
+
+...
+---
+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
>From 24f57488e28c14a173ded89c6c87e69abeb28b34 Mon Sep 17 00:00:00 2001
From: yinghao <73093416+andreww0210 at users.noreply.github.com>
Date: Wed, 10 Jun 2026 21:55:24 +0800
Subject: [PATCH 2/2] Update
llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir
Co-authored-by: Matt Arsenault <arsenm2 at gmail.com>
---
llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir b/llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir
index e56b3192ac704..73eabe0f50890 100644
--- a/llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir
+++ b/llvm/test/CodeGen/NVPTX/proxy-reg-erasure-kill-flag.mir
@@ -1,12 +1,5 @@
-# RUN: llc %s --run-pass=nvptx-proxyreg-erasure -verify-machineinstrs -mtriple=nvptx64 -o - | FileCheck %s
+# RUN: llc %s --run-pass=nvptx-proxyreg-erasure -mtriple=nvptx64 -o - | FileCheck %s
---- |
- define void @test_proxy_reg() {
- entry:
- ret void
- }
-
-...
---
name: test_proxy_reg
tracksRegLiveness: true
More information about the llvm-commits
mailing list