[llvm] [NVPTX] Print PM Event Mask value as unsigned integer. (PR #178891)
Kirill Vedernikov via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 30 05:50:01 PST 2026
https://github.com/kvederni created https://github.com/llvm/llvm-project/pull/178891
This change fixes PM Event Mask value in NVPTX BE when ID=15 is set. The PM Event Mask value is printed as the unsigned integer instead of the singed one.
>From a1e3dcaa512e56d8cf702915ea385062881ea212 Mon Sep 17 00:00:00 2001
From: Kirill Vedernikov <kvedernikov at nvidia.com>
Date: Fri, 30 Jan 2026 14:45:25 +0100
Subject: [PATCH] [NVPTX] Print PM Event Mask value as unsigned integer.
---
.../NVPTX/MCTargetDesc/NVPTXInstPrinter.cpp | 9 +++++++++
.../Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.h | 3 +++
llvm/lib/Target/NVPTX/NVPTXIntrinsics.td | 6 +++++-
llvm/test/CodeGen/NVPTX/pm-event.ll | 16 ++++++++++++++++
4 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.cpp b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.cpp
index 5ff5fa36ac467..9a19a480cea54 100644
--- a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.cpp
+++ b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.cpp
@@ -535,3 +535,12 @@ void NVPTXInstPrinter::printCallOperand(const MCInst *MI, int OpNum,
}
llvm_unreachable("Invalid modifier");
}
+
+template <unsigned Bits>
+void NVPTXInstPrinter::printUImm(const MCInst *MI, int OpNum, raw_ostream &O) {
+ const MCOperand &MO = MI->getOperand(OpNum);
+ assert(MO.isImm() && "Expected immediate operand");
+ uint64_t Imm = MO.getImm();
+ Imm &= (1 << Bits) - 1;
+ markup(O, Markup::Immediate) << formatImm(Imm);
+}
diff --git a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.h b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.h
index 3d172441adfcc..e798882c2d14b 100644
--- a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.h
+++ b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.h
@@ -56,6 +56,9 @@ class NVPTXInstPrinter : public MCInstPrinter {
void printCallOperand(const MCInst *MI, int OpNum, raw_ostream &O,
StringRef Modifier = {});
void printFTZFlag(const MCInst *MI, int OpNum, raw_ostream &O);
+
+ template <unsigned Bits>
+ void printUImm(const MCInst *MI, int OpNum, raw_ostream &O);
};
}
diff --git a/llvm/lib/Target/NVPTX/NVPTXIntrinsics.td b/llvm/lib/Target/NVPTX/NVPTXIntrinsics.td
index ad5dd356ee90f..d5723e6735146 100644
--- a/llvm/lib/Target/NVPTX/NVPTXIntrinsics.td
+++ b/llvm/lib/Target/NVPTX/NVPTXIntrinsics.td
@@ -1331,10 +1331,14 @@ def INT_NVVM_NANOSLEEP_R : BasicNVPTXInst<(outs), (ins B32:$i), "nanosleep.u32",
[(int_nvvm_nanosleep i32:$i)]>,
Requires<[hasPTX<63>, hasSM<70>]>;
+def PMEventMask : Operand<i16> {
+ let PrintMethod = "printUImm<16>";
+}
+
let hasSideEffects = 1 in {
// Performance Monitor events
def INT_PM_EVENT_MASK : BasicNVPTXInst<(outs),
- (ins i16imm:$mask),
+ (ins PMEventMask:$mask),
"pmevent.mask",
[(int_nvvm_pm_event_mask timm:$mask)]>,
Requires<[hasSM<20>, hasPTX<30>]>;
diff --git a/llvm/test/CodeGen/NVPTX/pm-event.ll b/llvm/test/CodeGen/NVPTX/pm-event.ll
index 871da6d414978..e182e4909c783 100644
--- a/llvm/test/CodeGen/NVPTX/pm-event.ll
+++ b/llvm/test/CodeGen/NVPTX/pm-event.ll
@@ -11,5 +11,21 @@ define void @test_pm_event() {
; CHECK: pmevent.mask 4096;
call void @llvm.nvvm.pm.event.mask(i16 u0x1000)
+ ; CHECK: pmevent.mask 32768;
+ call void @llvm.nvvm.pm.event.mask(i16 u0x8000)
+
+ ; CHECK: pmevent.mask 65535;
+ call void @llvm.nvvm.pm.event.mask(i16 u0xFFFF)
+
+ ;; LLVM doesn't distinguish signed and unsigned integers. So, NVVM calls with
+ ;; negative integers are functionally correct here and processed correctly
+ ;; in NVPTX backend
+
+ ; CHECK: pmevent.mask 32768;
+ call void @llvm.nvvm.pm.event.mask(i16 -32768)
+
+ ; CHECK: pmevent.mask 65535;
+ call void @llvm.nvvm.pm.event.mask(i16 -1)
+
ret void
}
More information about the llvm-commits
mailing list