Skip to content

Commit 2ac8e6b

Browse files
authored
[NVPTX] Implement __builtin_readcyclecounter on NVPTX (#81344)
Summary: This patch simply states that `__builtin_readcyclecounter` is legal on NVPTX and makes it return the value from the `clock64` sreg. The timer intrinsics are marked as having side effects, which is desireable for timing primitives and required to pattern match the instrinic DAG.
1 parent 45260bf commit 2ac8e6b

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,8 @@ NVPTXTargetLowering::NVPTXTargetLowering(const NVPTXTargetMachine &TM,
489489
setOperationAction(ISD::INSERT_VECTOR_ELT, MVT::v2f16, Expand);
490490
setOperationAction(ISD::VECTOR_SHUFFLE, MVT::v2f16, Expand);
491491

492+
setOperationAction(ISD::READCYCLECOUNTER, MVT::i64, Legal);
493+
492494
setFP16OperationAction(ISD::SETCC, MVT::f16, Legal, Promote);
493495
setFP16OperationAction(ISD::SETCC, MVT::v2f16, Legal, Expand);
494496

llvm/lib/Target/NVPTX/NVPTXIntrinsics.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6372,12 +6372,16 @@ def INT_PTX_SREG_LANEMASK_GE :
63726372
def INT_PTX_SREG_LANEMASK_GT :
63736373
PTX_READ_SREG_R32<"lanemask_gt", int_nvvm_read_ptx_sreg_lanemask_gt>;
63746374

6375+
let hasSideEffects = 1 in {
63756376
def INT_PTX_SREG_CLOCK :
63766377
PTX_READ_SREG_R32<"clock", int_nvvm_read_ptx_sreg_clock>;
63776378
def INT_PTX_SREG_CLOCK64 :
63786379
PTX_READ_SREG_R64<"clock64", int_nvvm_read_ptx_sreg_clock64>;
63796380
def INT_PTX_SREG_GLOBALTIMER :
63806381
PTX_READ_SREG_R64<"globaltimer", int_nvvm_read_ptx_sreg_globaltimer>;
6382+
}
6383+
6384+
def: Pat <(i64 (readcyclecounter)), (INT_PTX_SREG_CLOCK64)>;
63816385

63826386
def INT_PTX_SREG_PM0 : PTX_READ_SREG_R32<"pm0", int_nvvm_read_ptx_sreg_pm0>;
63836387
def INT_PTX_SREG_PM1 : PTX_READ_SREG_R32<"pm1", int_nvvm_read_ptx_sreg_pm1>;

llvm/test/CodeGen/NVPTX/intrinsics.ll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,17 @@ define i64 @test_globaltimer() {
151151
ret i64 %ret
152152
}
153153

154+
; CHECK-LABEL: test_cyclecounter
155+
define i64 @test_cyclecounter() {
156+
; CHECK: mov.u64 %r{{.*}}, %clock64;
157+
%a = tail call i64 @llvm.readcyclecounter()
158+
; CHECK: mov.u64 %r{{.*}}, %clock64;
159+
%b = tail call i64 @llvm.readcyclecounter()
160+
%ret = add i64 %a, %b
161+
; CHECK: ret
162+
ret i64 %ret
163+
}
164+
154165
declare float @llvm.fabs.f32(float)
155166
declare double @llvm.fabs.f64(double)
156167
declare float @llvm.nvvm.sqrt.f(float)
@@ -166,3 +177,4 @@ declare i32 @llvm.nvvm.read.ptx.sreg.clock()
166177
declare i64 @llvm.nvvm.read.ptx.sreg.clock64()
167178
declare void @llvm.nvvm.exit()
168179
declare i64 @llvm.nvvm.read.ptx.sreg.globaltimer()
180+
declare i64 @llvm.readcyclecounter()

0 commit comments

Comments
 (0)