Skip to content

Commit 910be4f

Browse files
authored
[flang][cuda] Lower clock64 to nvvm intrinsic (#127155)
1 parent dc79c66 commit 910be4f

File tree

4 files changed

+22
-0
lines changed

4 files changed

+22
-0
lines changed

flang/include/flang/Optimizer/Builder/IntrinsicCall.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ struct IntrinsicLibrary {
231231
void genCFProcPointer(llvm::ArrayRef<fir::ExtendedValue>);
232232
fir::ExtendedValue genCFunLoc(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
233233
fir::ExtendedValue genCLoc(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
234+
mlir::Value genClock64(mlir::Type, llvm::ArrayRef<mlir::Value>);
234235
template <mlir::arith::CmpIPredicate pred>
235236
fir::ExtendedValue genCPtrCompare(mlir::Type,
236237
llvm::ArrayRef<fir::ExtendedValue>);

flang/lib/Optimizer/Builder/IntrinsicCall.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ static constexpr IntrinsicHandler handlers[]{
209209
&I::genChdir,
210210
{{{"name", asAddr}, {"status", asAddr, handleDynamicOptional}}},
211211
/*isElemental=*/false},
212+
{"clock64", &I::genClock64, {}, /*isElemental=*/false},
212213
{"cmplx",
213214
&I::genCmplx,
214215
{{{"x", asValue}, {"y", asValue, handleDynamicOptional}}}},
@@ -3228,6 +3229,16 @@ IntrinsicLibrary::genChdir(std::optional<mlir::Type> resultType,
32283229
return {};
32293230
}
32303231

3232+
// CLOCK64
3233+
mlir::Value IntrinsicLibrary::genClock64(mlir::Type resultType,
3234+
llvm::ArrayRef<mlir::Value> args) {
3235+
constexpr llvm::StringLiteral funcName = "llvm.nvvm.read.ptx.sreg.clock64";
3236+
mlir::MLIRContext *context = builder.getContext();
3237+
mlir::FunctionType ftype = mlir::FunctionType::get(context, {}, {resultType});
3238+
auto funcOp = builder.createFunction(loc, funcName, ftype);
3239+
return builder.create<fir::CallOp>(loc, funcOp, args).getResult(0);
3240+
}
3241+
32313242
// CMPLX
32323243
mlir::Value IntrinsicLibrary::genCmplx(mlir::Type resultType,
32333244
llvm::ArrayRef<mlir::Value> args) {

flang/module/cudadevice.f90

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,5 +628,10 @@ attributes(device) pure integer function atomicdeci(address, val)
628628
end interface
629629
public :: atomicdec
630630

631+
interface
632+
attributes(device) integer(8) function clock64()
633+
end function
634+
end interface
635+
public :: clock64
631636

632637
end module

flang/test/Lower/CUDA/cuda-device-proc.cuf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ attributes(global) subroutine devsub()
99
real(8) :: ad
1010
integer(4) :: ai
1111
integer(8) :: al
12+
integer(8) :: time
1213

1314
call syncthreads()
1415
call syncwarp(1)
@@ -43,6 +44,8 @@ attributes(global) subroutine devsub()
4344
ai = atomicor(ai, 1_4)
4445
ai = atomicinc(ai, 1_4)
4546
ai = atomicdec(ai, 1_4)
47+
48+
time = clock64()
4649
end
4750

4851
! CHECK-LABEL: func.func @_QPdevsub() attributes {cuf.proc_attr = #cuf.cuda_proc<global>}
@@ -79,6 +82,8 @@ end
7982
! CHECK: %{{.*}} = llvm.atomicrmw uinc_wrap %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, i32
8083
! CHECK: %{{.*}} = llvm.atomicrmw udec_wrap %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, i32
8184

85+
! CHECK: fir.call @llvm.nvvm.read.ptx.sreg.clock64()
86+
8287
subroutine host1()
8388
integer, device :: a(32)
8489
integer, device :: ret

0 commit comments

Comments
 (0)