Skip to content

Commit 4e01690

Browse files
committed
[X86] Add FMA constant folding test coverage
Shows we constant fold scalars but not vectors
1 parent 19aa4c8 commit 4e01690

File tree

1 file changed

+184
-0
lines changed

1 file changed

+184
-0
lines changed

llvm/test/CodeGen/X86/fma.ll

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,6 +2096,190 @@ entry:
20962096
ret <8 x double> %call
20972097
}
20982098

2099+
define float @constant_fold_f32() {
2100+
; FMA32-LABEL: constant_fold_f32:
2101+
; FMA32: ## %bb.0:
2102+
; FMA32-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} ## encoding: [0xd9,0x05,A,A,A,A]
2103+
; FMA32-NEXT: ## fixup A - offset: 2, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4
2104+
; FMA32-NEXT: retl ## encoding: [0xc3]
2105+
;
2106+
; FMACALL32-LABEL: constant_fold_f32:
2107+
; FMACALL32: ## %bb.0:
2108+
; FMACALL32-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} ## encoding: [0xd9,0x05,A,A,A,A]
2109+
; FMACALL32-NEXT: ## fixup A - offset: 2, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4
2110+
; FMACALL32-NEXT: retl ## encoding: [0xc3]
2111+
;
2112+
; FMA64-LABEL: constant_fold_f32:
2113+
; FMA64: ## %bb.0:
2114+
; FMA64-NEXT: vmovss {{.*#+}} xmm0 = [1.02E+3,0.0E+0,0.0E+0,0.0E+0]
2115+
; FMA64-NEXT: ## encoding: [0xc5,0xfa,0x10,0x05,A,A,A,A]
2116+
; FMA64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2117+
; FMA64-NEXT: retq ## encoding: [0xc3]
2118+
;
2119+
; FMACALL64-LABEL: constant_fold_f32:
2120+
; FMACALL64: ## %bb.0:
2121+
; FMACALL64-NEXT: movss {{.*#+}} xmm0 = [1.02E+3,0.0E+0,0.0E+0,0.0E+0]
2122+
; FMACALL64-NEXT: ## encoding: [0xf3,0x0f,0x10,0x05,A,A,A,A]
2123+
; FMACALL64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2124+
; FMACALL64-NEXT: retq ## encoding: [0xc3]
2125+
;
2126+
; AVX512-LABEL: constant_fold_f32:
2127+
; AVX512: ## %bb.0:
2128+
; AVX512-NEXT: vmovss {{.*#+}} xmm0 = [1.02E+3,0.0E+0,0.0E+0,0.0E+0]
2129+
; AVX512-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x05,A,A,A,A]
2130+
; AVX512-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2131+
; AVX512-NEXT: retq ## encoding: [0xc3]
2132+
;
2133+
; AVX512VL-LABEL: constant_fold_f32:
2134+
; AVX512VL: ## %bb.0:
2135+
; AVX512VL-NEXT: vmovss {{.*#+}} xmm0 = [1.02E+3,0.0E+0,0.0E+0,0.0E+0]
2136+
; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x05,A,A,A,A]
2137+
; AVX512VL-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2138+
; AVX512VL-NEXT: retq ## encoding: [0xc3]
2139+
%r = call float @llvm.fma.f32(float 5.000000e+01, float 2.000000e+01, float 2.000000e+01)
2140+
ret float %r
2141+
}
2142+
2143+
define <4 x float> @constant_fold_v4f32() {
2144+
; FMA32-LABEL: constant_fold_v4f32:
2145+
; 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]
2150+
; FMA32-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
2151+
; 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
2155+
; FMA32-NEXT: retl ## encoding: [0xc3]
2156+
;
2157+
; FMACALL32-LABEL: constant_fold_v4f32:
2158+
; FMACALL32: ## %bb.0:
2159+
; FMACALL32-NEXT: vmovaps {{.*#+}} xmm0 = [0.0E+0,4.9E+2,1.18E+3,2.07E+3]
2160+
; FMACALL32-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
2161+
; FMACALL32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4
2162+
; FMACALL32-NEXT: retl ## encoding: [0xc3]
2163+
;
2164+
; FMA64-LABEL: constant_fold_v4f32:
2165+
; 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]
2170+
; FMA64-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
2171+
; 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
2175+
; FMA64-NEXT: retq ## encoding: [0xc3]
2176+
;
2177+
; FMACALL64-LABEL: constant_fold_v4f32:
2178+
; FMACALL64: ## %bb.0:
2179+
; FMACALL64-NEXT: movaps {{.*#+}} xmm0 = [0.0E+0,4.9E+2,1.18E+3,2.07E+3]
2180+
; FMACALL64-NEXT: ## encoding: [0x0f,0x28,0x05,A,A,A,A]
2181+
; FMACALL64-NEXT: ## fixup A - offset: 3, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2182+
; FMACALL64-NEXT: retq ## encoding: [0xc3]
2183+
;
2184+
; AVX512-LABEL: constant_fold_v4f32:
2185+
; 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]
2190+
; AVX512-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
2191+
; 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
2195+
; AVX512-NEXT: retq ## encoding: [0xc3]
2196+
;
2197+
; AVX512VL-LABEL: constant_fold_v4f32:
2198+
; 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]
2203+
; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
2204+
; 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
2208+
; AVX512VL-NEXT: retq ## encoding: [0xc3]
2209+
%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>)
2210+
ret <4 x float> %r
2211+
}
2212+
2213+
define <2 x double> @constant_fold_v2f64() {
2214+
; FMA32-LABEL: constant_fold_v2f64:
2215+
; 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]
2221+
; 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
2225+
; FMA32-NEXT: retl ## encoding: [0xc3]
2226+
;
2227+
; FMACALL32-LABEL: constant_fold_v2f64:
2228+
; FMACALL32: ## %bb.0:
2229+
; FMACALL32-NEXT: vmovaps {{.*#+}} xmm0 = [4.1E+2,1.4E+3]
2230+
; FMACALL32-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A]
2231+
; FMACALL32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4
2232+
; FMACALL32-NEXT: retl ## encoding: [0xc3]
2233+
;
2234+
; FMA64-LABEL: constant_fold_v2f64:
2235+
; 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]
2241+
; 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
2245+
; FMA64-NEXT: retq ## encoding: [0xc3]
2246+
;
2247+
; FMACALL64-LABEL: constant_fold_v2f64:
2248+
; FMACALL64: ## %bb.0:
2249+
; FMACALL64-NEXT: movaps {{.*#+}} xmm0 = [4.1E+2,1.4E+3]
2250+
; FMACALL64-NEXT: ## encoding: [0x0f,0x28,0x05,A,A,A,A]
2251+
; FMACALL64-NEXT: ## fixup A - offset: 3, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte
2252+
; FMACALL64-NEXT: retq ## encoding: [0xc3]
2253+
;
2254+
; AVX512-LABEL: constant_fold_v2f64:
2255+
; 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]
2261+
; 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
2265+
; AVX512-NEXT: retq ## encoding: [0xc3]
2266+
;
2267+
; AVX512VL-LABEL: constant_fold_v2f64:
2268+
; 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]
2274+
; 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
2278+
; AVX512VL-NEXT: retq ## encoding: [0xc3]
2279+
%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>)
2280+
ret <2 x double> %r
2281+
}
2282+
20992283
declare float @llvm.fma.f32(float, float, float)
21002284
declare double @llvm.fma.f64(double, double, double)
21012285
declare x86_fp80 @llvm.fma.f80(x86_fp80, x86_fp80, x86_fp80)

0 commit comments

Comments
 (0)