Skip to content

Commit 5c37316

Browse files
committed
[DAG] visitFMA/FMAD - use FoldConstantArithmetic to add missing vector constant folding support
1 parent 9065b75 commit 5c37316

File tree

2 files changed

+17
-68
lines changed

2 files changed

+17
-68
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17368,11 +17368,9 @@ template <class MatchContextClass> SDValue DAGCombiner::visitFMA(SDNode *N) {
1736817368
MatchContextClass matcher(DAG, TLI, N);
1736917369

1737017370
// Constant fold FMA.
17371-
if (isa<ConstantFPSDNode>(N0) &&
17372-
isa<ConstantFPSDNode>(N1) &&
17373-
isa<ConstantFPSDNode>(N2)) {
17374-
return matcher.getNode(ISD::FMA, DL, VT, N0, N1, N2);
17375-
}
17371+
if (SDValue C =
17372+
DAG.FoldConstantArithmetic(N->getOpcode(), DL, VT, {N0, N1, N2}))
17373+
return C;
1737617374

1737717375
// (-N0 * -N1) + N2 --> (N0 * N1) + N2
1737817376
TargetLowering::NegatibleCost CostN0 =
@@ -17488,9 +17486,8 @@ SDValue DAGCombiner::visitFMAD(SDNode *N) {
1748817486
SDLoc DL(N);
1748917487

1749017488
// Constant fold FMAD.
17491-
if (isa<ConstantFPSDNode>(N0) && isa<ConstantFPSDNode>(N1) &&
17492-
isa<ConstantFPSDNode>(N2))
17493-
return DAG.getNode(ISD::FMAD, DL, VT, N0, N1, N2);
17489+
if (SDValue C = DAG.FoldConstantArithmetic(ISD::FMAD, DL, VT, {N0, N1, N2}))
17490+
return C;
1749417491

1749517492
return SDValue();
1749617493
}

llvm/test/CodeGen/X86/fma.ll

Lines changed: 12 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -2143,15 +2143,9 @@ define float @constant_fold_f32() {
21432143
define <4 x float> @constant_fold_v4f32() {
21442144
; FMA32-LABEL: constant_fold_v4f32:
21452145
; FMA32: ## %bb.0:
2146-
; FMA32-NEXT: vmovaps {{.*#+}} xmm1 = [0.0E+0,1.0E+1,2.0E+1,3.0E+1]
2147-
; FMA32-NEXT: ## encoding: [0xc5,0xf8,0x28,0x0d,A,A,A,A]
2148-
; FMA32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4
2149-
; FMA32-NEXT: vmovaps {{.*#+}} xmm0 = [4.0E+1,5.0E+1,6.0E+1,7.0E+1]
2146+
; FMA32-NEXT: vmovaps {{.*#+}} xmm0 = [0.0E+0,4.9E+2,1.18E+3,2.07E+3]
21502147
; FMA32-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
21512148
; FMA32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4
2152-
; FMA32-NEXT: vfmadd213ps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0x71,0xa8,0x05,A,A,A,A]
2153-
; FMA32-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4
2154-
; FMA32-NEXT: ## xmm0 = (xmm1 * xmm0) + mem
21552149
; FMA32-NEXT: retl ## encoding: [0xc3]
21562150
;
21572151
; FMACALL32-LABEL: constant_fold_v4f32:
@@ -2163,15 +2157,9 @@ define <4 x float> @constant_fold_v4f32() {
21632157
;
21642158
; FMA64-LABEL: constant_fold_v4f32:
21652159
; FMA64: ## %bb.0:
2166-
; FMA64-NEXT: vmovaps {{.*#+}} xmm1 = [0.0E+0,1.0E+1,2.0E+1,3.0E+1]
2167-
; FMA64-NEXT: ## encoding: [0xc5,0xf8,0x28,0x0d,A,A,A,A]
2168-
; FMA64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2169-
; FMA64-NEXT: vmovaps {{.*#+}} xmm0 = [4.0E+1,5.0E+1,6.0E+1,7.0E+1]
2160+
; FMA64-NEXT: vmovaps {{.*#+}} xmm0 = [0.0E+0,4.9E+2,1.18E+3,2.07E+3]
21702161
; FMA64-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
21712162
; FMA64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2172-
; FMA64-NEXT: vfmadd213ps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0x71,0xa8,0x05,A,A,A,A]
2173-
; FMA64-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2174-
; FMA64-NEXT: ## xmm0 = (xmm1 * xmm0) + mem
21752163
; FMA64-NEXT: retq ## encoding: [0xc3]
21762164
;
21772165
; FMACALL64-LABEL: constant_fold_v4f32:
@@ -2183,28 +2171,16 @@ define <4 x float> @constant_fold_v4f32() {
21832171
;
21842172
; AVX512-LABEL: constant_fold_v4f32:
21852173
; AVX512: ## %bb.0:
2186-
; AVX512-NEXT: vmovaps {{.*#+}} xmm1 = [0.0E+0,1.0E+1,2.0E+1,3.0E+1]
2187-
; AVX512-NEXT: ## encoding: [0xc5,0xf8,0x28,0x0d,A,A,A,A]
2188-
; AVX512-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2189-
; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [4.0E+1,5.0E+1,6.0E+1,7.0E+1]
2174+
; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [0.0E+0,4.9E+2,1.18E+3,2.07E+3]
21902175
; AVX512-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
21912176
; AVX512-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2192-
; AVX512-NEXT: vfmadd213ps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0x71,0xa8,0x05,A,A,A,A]
2193-
; AVX512-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2194-
; AVX512-NEXT: ## xmm0 = (xmm1 * xmm0) + mem
21952177
; AVX512-NEXT: retq ## encoding: [0xc3]
21962178
;
21972179
; AVX512VL-LABEL: constant_fold_v4f32:
21982180
; AVX512VL: ## %bb.0:
2199-
; AVX512VL-NEXT: vmovaps {{.*#+}} xmm1 = [0.0E+0,1.0E+1,2.0E+1,3.0E+1]
2200-
; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0x0d,A,A,A,A]
2201-
; AVX512VL-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2202-
; AVX512VL-NEXT: vmovaps {{.*#+}} xmm0 = [4.0E+1,5.0E+1,6.0E+1,7.0E+1]
2181+
; AVX512VL-NEXT: vmovaps {{.*#+}} xmm0 = [0.0E+0,4.9E+2,1.18E+3,2.07E+3]
22032182
; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
22042183
; AVX512VL-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2205-
; AVX512VL-NEXT: vfmadd213ps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0 ## EVEX TO VEX Compression encoding: [0xc4,0xe2,0x71,0xa8,0x05,A,A,A,A]
2206-
; AVX512VL-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2207-
; AVX512VL-NEXT: ## xmm0 = (xmm1 * xmm0) + mem
22082184
; AVX512VL-NEXT: retq ## encoding: [0xc3]
22092185
%r = call <4 x float> @llvm.fma.v4f32(<4 x float> <float 0.000000e+01, float 1.000000e+01, float 2.000000e+01, float 3.000000e+01>, <4 x float> <float 4.000000e+01, float 5.000000e+01, float 6.000000e+01, float 7.000000e+01>, <4 x float> <float 0.000000e+01, float -1.000000e+01, float -2.000000e+01, float -3.000000e+01>)
22102186
ret <4 x float> %r
@@ -2213,15 +2189,9 @@ define <4 x float> @constant_fold_v4f32() {
22132189
define <2 x double> @constant_fold_v2f64() {
22142190
; FMA32-LABEL: constant_fold_v2f64:
22152191
; FMA32: ## %bb.0:
2216-
; FMA32-NEXT: vmovapd {{.*#+}} xmm1 = [1.0E+1,2.0E+1]
2217-
; FMA32-NEXT: ## encoding: [0xc5,0xf9,0x28,0x0d,A,A,A,A]
2218-
; FMA32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4
2219-
; FMA32-NEXT: vmovsd {{.*#+}} xmm0 = [1.0E+1,0.0E+0]
2220-
; FMA32-NEXT: ## encoding: [0xc5,0xfb,0x10,0x05,A,A,A,A]
2192+
; FMA32-NEXT: vmovaps {{.*#+}} xmm0 = [4.1E+2,1.4E+3]
2193+
; FMA32-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
22212194
; FMA32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4
2222-
; FMA32-NEXT: vfmadd231pd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0xf1,0xb8,0x05,A,A,A,A]
2223-
; FMA32-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4
2224-
; FMA32-NEXT: ## xmm0 = (xmm1 * mem) + xmm0
22252195
; FMA32-NEXT: retl ## encoding: [0xc3]
22262196
;
22272197
; FMACALL32-LABEL: constant_fold_v2f64:
@@ -2233,15 +2203,9 @@ define <2 x double> @constant_fold_v2f64() {
22332203
;
22342204
; FMA64-LABEL: constant_fold_v2f64:
22352205
; FMA64: ## %bb.0:
2236-
; FMA64-NEXT: vmovapd {{.*#+}} xmm1 = [1.0E+1,2.0E+1]
2237-
; FMA64-NEXT: ## encoding: [0xc5,0xf9,0x28,0x0d,A,A,A,A]
2238-
; FMA64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2239-
; FMA64-NEXT: vmovsd {{.*#+}} xmm0 = [1.0E+1,0.0E+0]
2240-
; FMA64-NEXT: ## encoding: [0xc5,0xfb,0x10,0x05,A,A,A,A]
2206+
; FMA64-NEXT: vmovaps {{.*#+}} xmm0 = [4.1E+2,1.4E+3]
2207+
; FMA64-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
22412208
; FMA64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2242-
; FMA64-NEXT: vfmadd231pd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0xf1,0xb8,0x05,A,A,A,A]
2243-
; FMA64-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2244-
; FMA64-NEXT: ## xmm0 = (xmm1 * mem) + xmm0
22452209
; FMA64-NEXT: retq ## encoding: [0xc3]
22462210
;
22472211
; FMACALL64-LABEL: constant_fold_v2f64:
@@ -2253,28 +2217,16 @@ define <2 x double> @constant_fold_v2f64() {
22532217
;
22542218
; AVX512-LABEL: constant_fold_v2f64:
22552219
; AVX512: ## %bb.0:
2256-
; AVX512-NEXT: vmovapd {{.*#+}} xmm1 = [1.0E+1,2.0E+1]
2257-
; AVX512-NEXT: ## encoding: [0xc5,0xf9,0x28,0x0d,A,A,A,A]
2258-
; AVX512-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2259-
; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = [1.0E+1,0.0E+0]
2260-
; AVX512-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x05,A,A,A,A]
2220+
; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [4.1E+2,1.4E+3]
2221+
; AVX512-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
22612222
; AVX512-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2262-
; AVX512-NEXT: vfmadd231pd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0xf1,0xb8,0x05,A,A,A,A]
2263-
; AVX512-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2264-
; AVX512-NEXT: ## xmm0 = (xmm1 * mem) + xmm0
22652223
; AVX512-NEXT: retq ## encoding: [0xc3]
22662224
;
22672225
; AVX512VL-LABEL: constant_fold_v2f64:
22682226
; AVX512VL: ## %bb.0:
2269-
; AVX512VL-NEXT: vmovapd {{.*#+}} xmm1 = [1.0E+1,2.0E+1]
2270-
; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xf9,0x28,0x0d,A,A,A,A]
2271-
; AVX512VL-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2272-
; AVX512VL-NEXT: vmovsd {{.*#+}} xmm0 = [1.0E+1,0.0E+0]
2273-
; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x05,A,A,A,A]
2227+
; AVX512VL-NEXT: vmovaps {{.*#+}} xmm0 = [4.1E+2,1.4E+3]
2228+
; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
22742229
; AVX512VL-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2275-
; AVX512VL-NEXT: vfmadd231pd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0 ## EVEX TO VEX Compression encoding: [0xc4,0xe2,0xf1,0xb8,0x05,A,A,A,A]
2276-
; AVX512VL-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2277-
; AVX512VL-NEXT: ## xmm0 = (xmm1 * mem) + xmm0
22782230
; AVX512VL-NEXT: retq ## encoding: [0xc3]
22792231
%r = call <2 x double> @llvm.fma.v2f64(<2 x double> <double 1.000000e+01, double 2.000000e+01>, <2 x double> <double 4.000000e+01, double 7.000000e+01>, <2 x double> <double 1.000000e+01, double 0.000000e+01>)
22802232
ret <2 x double> %r

0 commit comments

Comments
 (0)