[llvm] [AMDGPU] Improve codegen for copysign(x, fneg(y)) (PR #207178)

Madhur Kumar via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 16 03:25:50 PDT 2026


================
@@ -2938,11 +2954,31 @@ def : AMDGPUPat <
   (S_AND_B32 (S_MOV_B32 (i32 0x80000000)), $src1)
 >;
 
+def : AMDGPUPat <
+  (DivergentBinFrag<fcopysign> (f32 fpimm_zero), (fneg f32:$src1)),
+  (V_BFI_B32_e64 VGPR_32:$src1, (i32 0), (S_MOV_B32 (i32 0x80000000)))
+>;
+
 def : AMDGPUPat <
   (fcopysign (f32 fpimm_pos_zero), (f32 VGPR_32:$src1)),
   (V_AND_B32_e32 (S_MOV_B32 (i32 0x80000000)), $src1)
 >;
 
+def : AMDGPUPat <
+  (DivergentBinFrag<and> (extractelt (v2i32 (bitconvert (f64 (fneg f64:$src1)))), (i32 1)),
+       (i32 -2147483648)),
+  (V_BFI_B32_e64 (i32 (EXTRACT_SUBREG VReg_64:$src1, sub1)),
+                 (i32 0), (S_MOV_B32 (i32 0x80000000)))
+>;
+
+
+def : AMDGPUPat <
+  (DivergentBinFrag<and> (i32 (bitconvert (extractelt (v2f32 (bitconvert (fneg f64:$src1))), (i32 1)))),
----------------
MadhurKumar004 wrote:

```
Optimized legalized selection DAG: %bb.0 'v_copysign_v2f64_0_fneg:'
SelectionDAG has 35 nodes:
  t0: ch,glue = EntryToken
  t26: ch,glue = CopyToReg t0, Register:i32 $vgpr0, Constant:i32<0>
                  t2: i32,ch = CopyFromReg # D:1 t0, Register:i32 %8
                  t4: i32,ch = CopyFromReg # D:1 t0, Register:i32 %9
                t68: v2i32 = BUILD_VECTOR # D:1 t2, t4
              t69: f64 = bitcast # D:1 t68
            t60: f64 = fneg # D:1 t69
          t53: v2f32 = bitcast # D:1 t60
        t54: f32 = extract_vector_elt # D:1 t53, Constant:i32<1>
      t85: i32 = bitcast # D:1 t54
    t86: i32 = and # D:1 t85, Constant:i32<-2147483648>
  t28: ch,glue = CopyToReg # D:1 t26, Register:i32 $vgpr1, t86, t26:1
  t30: ch,glue = CopyToReg t28, Register:i32 $vgpr2, Constant:i32<0>, t28:1
                  t6: i32,ch = CopyFromReg # D:1 t0, Register:i32 %10
                  t8: i32,ch = CopyFromReg # D:1 t0, Register:i32 %11
                t70: v2i32 = BUILD_VECTOR # D:1 t6, t8
              t71: f64 = bitcast # D:1 t70
            t62: f64 = fneg # D:1 t71
          t56: v2f32 = bitcast # D:1 t62
        t57: f32 = extract_vector_elt # D:1 t56, Constant:i32<1>
      t79: i32 = bitcast # D:1 t57
    t81: i32 = and # D:1 t79, Constant:i32<-2147483648>
  t32: ch,glue = CopyToReg # D:1 t30, Register:i32 $vgpr3, t81, t30:1
  t33: ch = AMDGPUISD::RET_GLUE t32, Register:i32 $vgpr0, Register:i32 $vgpr1, Register:i32 $vgpr2, Register:i32 $vgpr3, t32:1
```

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


More information about the llvm-commits mailing list