[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