@@ -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+
20992283declare float @llvm.fma.f32 (float , float , float )
21002284declare double @llvm.fma.f64 (double , double , double )
21012285declare x86_fp80 @llvm.fma.f80 (x86_fp80 , x86_fp80 , x86_fp80 )
0 commit comments