[clang][NVPTX] Fix SM requirement of f32-tf32 rna satfinite conversion (#167836)
This change fixes the SM requirement of the f32 to tf32 conversion with `rna` rounding mode and `.satfinite` modifier. The current requirement specified is `sm_89` but this conversion is supported from `sm_80` onwards after it was added in PTX 8.1. PTX Spec Reference: https://docs.nvidia.com/cuda/parallel-thread-execution/#data-movement-and-conversion-instructions-cvt
This commit is contained in:
parent
b3c54914ef
commit
35a95fe9e9
@ -615,7 +615,7 @@ def __nvvm_f2bf16_rz : NVPTXBuiltinSMAndPTX<"__bf16(float)", SM_80, PTX70>;
|
||||
def __nvvm_f2bf16_rz_relu : NVPTXBuiltinSMAndPTX<"__bf16(float)", SM_80, PTX70>;
|
||||
|
||||
def __nvvm_f2tf32_rna : NVPTXBuiltinSMAndPTX<"int32_t(float)", SM_80, PTX70>;
|
||||
def __nvvm_f2tf32_rna_satfinite : NVPTXBuiltinSMAndPTX<"int32_t(float)", SM_89, PTX81>;
|
||||
def __nvvm_f2tf32_rna_satfinite : NVPTXBuiltinSMAndPTX<"int32_t(float)", SM_80, PTX81>;
|
||||
def __nvvm_f2tf32_rn : NVPTXBuiltinSMAndPTX<"int32_t(float)", SM_90, PTX78>;
|
||||
def __nvvm_f2tf32_rn_relu : NVPTXBuiltinSMAndPTX<"int32_t(float)", SM_90, PTX78>;
|
||||
def __nvvm_f2tf32_rn_satfinite : NVPTXBuiltinSMAndPTX<"int32_t(float)", SM_100, PTX86>;
|
||||
|
||||
@ -28,6 +28,9 @@
|
||||
// RUN: %clang_cc1 -ffp-contract=off -triple nvptx64-unknown-unknown -target-cpu sm_89 -target-feature +ptx81 -DPTX=81\
|
||||
// RUN: -disable-llvm-optzns -fcuda-is-device -emit-llvm -o - -x cuda %s \
|
||||
// RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK_PTX81_SM89 %s
|
||||
// RUN: %clang_cc1 -ffp-contract=off -triple nvptx64-unknown-unknown -target-cpu sm_80 -target-feature +ptx81 -DPTX=81 \
|
||||
// RUN: -disable-llvm-optzns -fcuda-is-device -emit-llvm -o - -x cuda %s \
|
||||
// RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK_PTX81_SM80 %s
|
||||
// RUN: %clang_cc1 -ffp-contract=off -triple nvptx64-unknown-unknown -target-cpu sm_90 -target-feature +ptx78 -DPTX=78 \
|
||||
// RUN: -disable-llvm-optzns -fcuda-is-device -emit-llvm -o - -x cuda %s \
|
||||
// RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK_PTX78_SM90 %s
|
||||
@ -1025,6 +1028,10 @@ __device__ void nvvm_cvt_sm80() {
|
||||
|
||||
// CHECK_PTX70_SM80: call i32 @llvm.nvvm.f2tf32.rna(float 1.000000e+00)
|
||||
__nvvm_f2tf32_rna(1);
|
||||
#if PTX >= 81
|
||||
// CHECK_PTX81_SM80: call i32 @llvm.nvvm.f2tf32.rna.satfinite(float 1.000000e+00)
|
||||
__nvvm_f2tf32_rna_satfinite(1.0f);
|
||||
#endif
|
||||
#endif
|
||||
// CHECK: ret void
|
||||
}
|
||||
@ -1058,9 +1065,6 @@ __device__ void nvvm_cvt_sm89() {
|
||||
__nvvm_e5m2x2_to_f16x2_rn(0x4c4c);
|
||||
// CHECK_PTX81_SM89: call <2 x half> @llvm.nvvm.e5m2x2.to.f16x2.rn.relu(i16 19532)
|
||||
__nvvm_e5m2x2_to_f16x2_rn_relu(0x4c4c);
|
||||
|
||||
// CHECK_PTX81_SM89: call i32 @llvm.nvvm.f2tf32.rna.satfinite(float 1.000000e+00)
|
||||
__nvvm_f2tf32_rna_satfinite(1.0f);
|
||||
#endif
|
||||
// CHECK: ret void
|
||||
}
|
||||
|
||||
@ -683,7 +683,7 @@ let hasSideEffects = false in {
|
||||
defm CVT_to_tf32_rn_relu : CVT_TO_TF32<"rn.relu">;
|
||||
defm CVT_to_tf32_rz_relu : CVT_TO_TF32<"rz.relu">;
|
||||
defm CVT_to_tf32_rna : CVT_TO_TF32<"rna", [hasPTX<70>, hasSM<80>]>;
|
||||
defm CVT_to_tf32_rna_satf : CVT_TO_TF32<"rna.satfinite", [hasPTX<81>, hasSM<89>]>;
|
||||
defm CVT_to_tf32_rna_satf : CVT_TO_TF32<"rna.satfinite", [hasPTX<81>, hasSM<80>]>;
|
||||
|
||||
defm CVT_to_tf32_rn_satf : CVT_TO_TF32<"rn.satfinite", [hasPTX<86>, hasSM<100>]>;
|
||||
defm CVT_to_tf32_rz_satf : CVT_TO_TF32<"rz.satfinite", [hasPTX<86>, hasSM<100>]>;
|
||||
|
||||
18
llvm/test/CodeGen/NVPTX/convert-sm80-sf.ll
Normal file
18
llvm/test/CodeGen/NVPTX/convert-sm80-sf.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
|
||||
; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_80 -mattr=+ptx81 | FileCheck %s
|
||||
; RUN: %if ptxas-sm_80 && ptxas-isa-8.1 %{ llc < %s -mtriple=nvptx64 -mcpu=sm_80 -mattr=+ptx81 | %ptxas-verify -arch=sm_80 %}
|
||||
|
||||
; CHECK-LABEL: cvt_rna_satfinite_tf32_f32
|
||||
define i32 @cvt_rna_satfinite_tf32_f32(float %f1) {
|
||||
; CHECK-LABEL: cvt_rna_satfinite_tf32_f32(
|
||||
; CHECK: {
|
||||
; CHECK-NEXT: .reg .b32 %r<3>;
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: // %bb.0:
|
||||
; CHECK-NEXT: ld.param.b32 %r1, [cvt_rna_satfinite_tf32_f32_param_0];
|
||||
; CHECK-NEXT: cvt.rna.satfinite.tf32.f32 %r2, %r1;
|
||||
; CHECK-NEXT: st.param.b32 [func_retval0], %r2;
|
||||
; CHECK-NEXT: ret;
|
||||
%val = call i32 @llvm.nvvm.f2tf32.rna.satfinite(float %f1)
|
||||
ret i32 %val
|
||||
}
|
||||
@ -84,10 +84,3 @@ define <2 x half> @cvt_rn_relu_f16x2_e5m2x2(i16 %in) {
|
||||
%val = call <2 x half> @llvm.nvvm.e5m2x2.to.f16x2.rn.relu(i16 %in);
|
||||
ret <2 x half> %val
|
||||
}
|
||||
|
||||
; CHECK-LABEL: cvt_rna_satfinite_tf32_f32
|
||||
define i32 @cvt_rna_satfinite_tf32_f32(float %f1) {
|
||||
; CHECK: cvt.rna.satfinite.tf32.f32
|
||||
%val = call i32 @llvm.nvvm.f2tf32.rna.satfinite(float %f1)
|
||||
ret i32 %val
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user