[llvm] [LLVM] Select fma_mix for v_cvt_f32_f16 and v_add_f32/v_mul_f32 (PR #160151)

Acim Maravic via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 20 13:03:32 PDT 2025


================
@@ -4127,6 +4127,24 @@ bool AMDGPUDAGToDAGISel::SelectVOP3PMadMixBF16Mods(SDValue In, SDValue &Src,
   return true;
 }
 
+bool AMDGPUDAGToDAGISel::SelectVOP3PMadMixModsNeg(SDValue In, SDValue &Src,
+                                                  SDValue &SrcMods) const {
+  unsigned Mods = 0;
+  SelectVOP3PMadMixModsImpl(In, Src, Mods, MVT::f16);
----------------
Acim-Maravic wrote:

I added globalisel equivalent....

Maybe we should canonize fpext (fneg a) to fnef(fpext a)....

-run-pass=amdgpu-prelegalizer-combiner :

---
name:            v_mad_mix_f32_negf16lo_add_f16lo
body:             |
  bb.1:
    liveins: $vgpr0, $vgpr1

    ; CHECK-LABEL: name: v_mad_mix_f32_negf16lo_add_f16lo
    ; CHECK: liveins: $vgpr0, $vgpr1
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
    ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32)
    ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s16) = G_FNEG [[TRUNC]]
    ; CHECK-NEXT: [[FPEXT:%[0-9]+]]:_(s32) = G_FPEXT [[FNEG]](s16)
    ; CHECK-NEXT: [[FPEXT1:%[0-9]+]]:_(s32) = G_FPEXT [[TRUNC1]](s16)
    ; CHECK-NEXT: [[FADD:%[0-9]+]]:_(s32) = G_FADD [[FPEXT]], [[FPEXT1]]
    ; CHECK-NEXT: $vgpr0 = COPY [[FADD]](s32)
    ; CHECK-NEXT: SI_RETURN implicit $vgpr0
    %10:_(s32) = COPY $vgpr0
    %0:_(s16) = G_TRUNC %10(s32)
    %11:_(s32) = COPY $vgpr1
    %1:_(s16) = G_TRUNC %11(s32)
    %12:_(s32) = G_FPEXT %0(s16)
    %13:_(s32) = G_FPEXT %1(s16)
    %14:_(s32) = G_FNEG %12
    %15:_(s32) = G_FADD %14, %13
    $vgpr0 = COPY %15(s32)
    SI_RETURN implicit $vgpr0
...

 ---
 
 It swaps neg and fpext...

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


More information about the llvm-commits mailing list