[llvm] [NVPTX] Respect FTZ flag when lowering atomicrmw fadd. (PR #200732)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 3 04:14:15 PDT 2026


================
@@ -1737,152 +1739,290 @@ define i64 @usub_sat_acq_rel_i64_global_cta(ptr addrspace(1) %addr, i64 %val) {
 }
 
 define float @fadd_acq_rel_float_global_cta(ptr addrspace(1) %addr, float %val) {
-; SM90-LABEL: fadd_acq_rel_float_global_cta(
-; SM90:       {
-; SM90-NEXT:    .reg .b32 %r<3>;
-; SM90-NEXT:    .reg .b64 %rd<2>;
-; SM90-EMPTY:
-; SM90-NEXT:  // %bb.0:
-; SM90-NEXT:    ld.param.b64 %rd1, [fadd_acq_rel_float_global_cta_param_0];
-; SM90-NEXT:    ld.param.b32 %r1, [fadd_acq_rel_float_global_cta_param_1];
-; SM90-NEXT:    atom.acq_rel.cta.global.add.f32 %r2, [%rd1], %r1;
-; SM90-NEXT:    st.param.b32 [func_retval0], %r2;
-; SM90-NEXT:    ret;
+; SM90-NOFTZ-LABEL: fadd_acq_rel_float_global_cta(
+; SM90-NOFTZ:       {
+; SM90-NOFTZ-NEXT:    .reg .pred %p<2>;
+; SM90-NOFTZ-NEXT:    .reg .b32 %r<5>;
+; SM90-NOFTZ-NEXT:    .reg .b64 %rd<2>;
+; SM90-NOFTZ-EMPTY:
+; SM90-NOFTZ-NEXT:  // %bb.0:
+; SM90-NOFTZ-NEXT:    ld.param.b32 %r2, [fadd_acq_rel_float_global_cta_param_1];
+; SM90-NOFTZ-NEXT:    ld.param.b64 %rd1, [fadd_acq_rel_float_global_cta_param_0];
+; SM90-NOFTZ-NEXT:    fence.release.cta;
+; SM90-NOFTZ-NEXT:    ld.relaxed.cta.global.b32 %r4, [%rd1];
+; SM90-NOFTZ-NEXT:  $L__BB60_1: // %atomicrmw.start
+; SM90-NOFTZ-NEXT:    // =>This Inner Loop Header: Depth=1
+; SM90-NOFTZ-NEXT:    add.rn.f32 %r3, %r4, %r2;
+; SM90-NOFTZ-NEXT:    atom.relaxed.cta.global.cas.b32 %r1, [%rd1], %r4, %r3;
+; SM90-NOFTZ-NEXT:    setp.ne.b32 %p1, %r1, %r4;
+; SM90-NOFTZ-NEXT:    mov.b32 %r4, %r1;
+; SM90-NOFTZ-NEXT:    @%p1 bra $L__BB60_1;
+; SM90-NOFTZ-NEXT:  // %bb.2: // %atomicrmw.end
+; SM90-NOFTZ-NEXT:    fence.acquire.cta;
+; SM90-NOFTZ-NEXT:    st.param.b32 [func_retval0], %r1;
+; SM90-NOFTZ-NEXT:    ret;
+;
+; SM90-FTZ-LABEL: fadd_acq_rel_float_global_cta(
+; SM90-FTZ:       {
+; SM90-FTZ-NEXT:    .reg .b32 %r<3>;
+; SM90-FTZ-NEXT:    .reg .b64 %rd<2>;
+; SM90-FTZ-EMPTY:
+; SM90-FTZ-NEXT:  // %bb.0:
+; SM90-FTZ-NEXT:    ld.param.b64 %rd1, [fadd_acq_rel_float_global_cta_param_0];
+; SM90-FTZ-NEXT:    ld.param.b32 %r1, [fadd_acq_rel_float_global_cta_param_1];
+; SM90-FTZ-NEXT:    atom.acq_rel.cta.global.add.f32 %r2, [%rd1], %r1;
+; SM90-FTZ-NEXT:    st.param.b32 [func_retval0], %r2;
+; SM90-FTZ-NEXT:    ret;
         %retval = atomicrmw fadd ptr  addrspace(1) %addr, float %val syncscope("block") acq_rel
         ret float %retval
 }
 
 define float @fsub_acq_rel_float_global_cta(ptr addrspace(1) %addr, float %val) {
-; SM90-LABEL: fsub_acq_rel_float_global_cta(
-; SM90:       {
-; SM90-NEXT:    .reg .pred %p<2>;
-; SM90-NEXT:    .reg .b32 %r<5>;
-; SM90-NEXT:    .reg .b64 %rd<2>;
-; SM90-EMPTY:
-; SM90-NEXT:  // %bb.0:
-; SM90-NEXT:    ld.param.b32 %r2, [fsub_acq_rel_float_global_cta_param_1];
-; SM90-NEXT:    ld.param.b64 %rd1, [fsub_acq_rel_float_global_cta_param_0];
-; SM90-NEXT:    fence.release.cta;
-; SM90-NEXT:    ld.relaxed.cta.global.b32 %r4, [%rd1];
-; SM90-NEXT:  $L__BB61_1: // %atomicrmw.start
-; SM90-NEXT:    // =>This Inner Loop Header: Depth=1
-; SM90-NEXT:    sub.rn.f32 %r3, %r4, %r2;
-; SM90-NEXT:    atom.relaxed.cta.global.cas.b32 %r1, [%rd1], %r4, %r3;
-; SM90-NEXT:    setp.ne.b32 %p1, %r1, %r4;
-; SM90-NEXT:    mov.b32 %r4, %r1;
-; SM90-NEXT:    @%p1 bra $L__BB61_1;
-; SM90-NEXT:  // %bb.2: // %atomicrmw.end
-; SM90-NEXT:    fence.acquire.cta;
-; SM90-NEXT:    st.param.b32 [func_retval0], %r1;
-; SM90-NEXT:    ret;
+; SM90-NOFTZ-LABEL: fsub_acq_rel_float_global_cta(
+; SM90-NOFTZ:       {
+; SM90-NOFTZ-NEXT:    .reg .pred %p<2>;
+; SM90-NOFTZ-NEXT:    .reg .b32 %r<5>;
+; SM90-NOFTZ-NEXT:    .reg .b64 %rd<2>;
+; SM90-NOFTZ-EMPTY:
+; SM90-NOFTZ-NEXT:  // %bb.0:
+; SM90-NOFTZ-NEXT:    ld.param.b32 %r2, [fsub_acq_rel_float_global_cta_param_1];
+; SM90-NOFTZ-NEXT:    ld.param.b64 %rd1, [fsub_acq_rel_float_global_cta_param_0];
+; SM90-NOFTZ-NEXT:    fence.release.cta;
+; SM90-NOFTZ-NEXT:    ld.relaxed.cta.global.b32 %r4, [%rd1];
+; SM90-NOFTZ-NEXT:  $L__BB61_1: // %atomicrmw.start
+; SM90-NOFTZ-NEXT:    // =>This Inner Loop Header: Depth=1
+; SM90-NOFTZ-NEXT:    sub.rn.f32 %r3, %r4, %r2;
+; SM90-NOFTZ-NEXT:    atom.relaxed.cta.global.cas.b32 %r1, [%rd1], %r4, %r3;
+; SM90-NOFTZ-NEXT:    setp.ne.b32 %p1, %r1, %r4;
+; SM90-NOFTZ-NEXT:    mov.b32 %r4, %r1;
+; SM90-NOFTZ-NEXT:    @%p1 bra $L__BB61_1;
+; SM90-NOFTZ-NEXT:  // %bb.2: // %atomicrmw.end
+; SM90-NOFTZ-NEXT:    fence.acquire.cta;
+; SM90-NOFTZ-NEXT:    st.param.b32 [func_retval0], %r1;
+; SM90-NOFTZ-NEXT:    ret;
+;
+; SM90-FTZ-LABEL: fsub_acq_rel_float_global_cta(
+; SM90-FTZ:       {
+; SM90-FTZ-NEXT:    .reg .pred %p<2>;
+; SM90-FTZ-NEXT:    .reg .b32 %r<5>;
+; SM90-FTZ-NEXT:    .reg .b64 %rd<2>;
+; SM90-FTZ-EMPTY:
+; SM90-FTZ-NEXT:  // %bb.0:
+; SM90-FTZ-NEXT:    ld.param.b32 %r2, [fsub_acq_rel_float_global_cta_param_1];
+; SM90-FTZ-NEXT:    ld.param.b64 %rd1, [fsub_acq_rel_float_global_cta_param_0];
+; SM90-FTZ-NEXT:    fence.release.cta;
+; SM90-FTZ-NEXT:    ld.relaxed.cta.global.b32 %r4, [%rd1];
+; SM90-FTZ-NEXT:  $L__BB61_1: // %atomicrmw.start
+; SM90-FTZ-NEXT:    // =>This Inner Loop Header: Depth=1
+; SM90-FTZ-NEXT:    sub.rn.ftz.f32 %r3, %r4, %r2;
----------------
gonzalobg wrote:

@akshayrdeodhar this is correct, but it probably would be better if this were to lower to `atom.add.global.f32` instead which performs ftz. Agree? (Not a request to do this in this PR, that should happen in a separate PR).

https://github.com/llvm/llvm-project/pull/200732


More information about the llvm-commits mailing list