[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