[llvm] [NVPTX] Print PM Event Mask value as unsigned integer. (PR #178891)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 30 05:50:33 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-nvptx
Author: Kirill Vedernikov (kvederni)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/178891.diff
4 Files Affected:
- (modified) llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.cpp (+9)
- (modified) llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.h (+3)
- (modified) llvm/lib/Target/NVPTX/NVPTXIntrinsics.td (+5-1)
- (modified) llvm/test/CodeGen/NVPTX/pm-event.ll (+16)
``````````diff
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
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/178891
More information about the llvm-commits
mailing list