From 4e0169005ea53af90ee43562c0d41c113c8498cf Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Fri, 18 Oct 2024 10:39:59 +0100 Subject: [PATCH] [X86] Add FMA constant folding test coverage Shows we constant fold scalars but not vectors --- llvm/test/CodeGen/X86/fma.ll | 184 +++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) diff --git a/llvm/test/CodeGen/X86/fma.ll b/llvm/test/CodeGen/X86/fma.ll index c55f50e97786..4f5e9af97bc8 100644 --- a/llvm/test/CodeGen/X86/fma.ll +++ b/llvm/test/CodeGen/X86/fma.ll @@ -2096,6 +2096,190 @@ entry: ret <8 x double> %call } +define float @constant_fold_f32() { +; FMA32-LABEL: constant_fold_f32: +; FMA32: ## %bb.0: +; FMA32-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} ## encoding: [0xd9,0x05,A,A,A,A] +; FMA32-NEXT: ## fixup A - offset: 2, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4 +; FMA32-NEXT: retl ## encoding: [0xc3] +; +; FMACALL32-LABEL: constant_fold_f32: +; FMACALL32: ## %bb.0: +; FMACALL32-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} ## encoding: [0xd9,0x05,A,A,A,A] +; FMACALL32-NEXT: ## fixup A - offset: 2, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4 +; FMACALL32-NEXT: retl ## encoding: [0xc3] +; +; FMA64-LABEL: constant_fold_f32: +; FMA64: ## %bb.0: +; FMA64-NEXT: vmovss {{.*#+}} xmm0 = [1.02E+3,0.0E+0,0.0E+0,0.0E+0] +; FMA64-NEXT: ## encoding: [0xc5,0xfa,0x10,0x05,A,A,A,A] +; FMA64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; FMA64-NEXT: retq ## encoding: [0xc3] +; +; FMACALL64-LABEL: constant_fold_f32: +; FMACALL64: ## %bb.0: +; FMACALL64-NEXT: movss {{.*#+}} xmm0 = [1.02E+3,0.0E+0,0.0E+0,0.0E+0] +; FMACALL64-NEXT: ## encoding: [0xf3,0x0f,0x10,0x05,A,A,A,A] +; FMACALL64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; FMACALL64-NEXT: retq ## encoding: [0xc3] +; +; AVX512-LABEL: constant_fold_f32: +; AVX512: ## %bb.0: +; AVX512-NEXT: vmovss {{.*#+}} xmm0 = [1.02E+3,0.0E+0,0.0E+0,0.0E+0] +; AVX512-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x05,A,A,A,A] +; AVX512-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512-NEXT: retq ## encoding: [0xc3] +; +; AVX512VL-LABEL: constant_fold_f32: +; AVX512VL: ## %bb.0: +; AVX512VL-NEXT: vmovss {{.*#+}} xmm0 = [1.02E+3,0.0E+0,0.0E+0,0.0E+0] +; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x05,A,A,A,A] +; AVX512VL-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512VL-NEXT: retq ## encoding: [0xc3] + %r = call float @llvm.fma.f32(float 5.000000e+01, float 2.000000e+01, float 2.000000e+01) + ret float %r +} + +define <4 x float> @constant_fold_v4f32() { +; FMA32-LABEL: constant_fold_v4f32: +; FMA32: ## %bb.0: +; FMA32-NEXT: vmovaps {{.*#+}} xmm1 = [0.0E+0,1.0E+1,2.0E+1,3.0E+1] +; FMA32-NEXT: ## encoding: [0xc5,0xf8,0x28,0x0d,A,A,A,A] +; FMA32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4 +; FMA32-NEXT: vmovaps {{.*#+}} xmm0 = [4.0E+1,5.0E+1,6.0E+1,7.0E+1] +; FMA32-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A] +; FMA32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4 +; FMA32-NEXT: vfmadd213ps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0x71,0xa8,0x05,A,A,A,A] +; FMA32-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4 +; FMA32-NEXT: ## xmm0 = (xmm1 * xmm0) + mem +; FMA32-NEXT: retl ## encoding: [0xc3] +; +; FMACALL32-LABEL: constant_fold_v4f32: +; FMACALL32: ## %bb.0: +; FMACALL32-NEXT: vmovaps {{.*#+}} xmm0 = [0.0E+0,4.9E+2,1.18E+3,2.07E+3] +; FMACALL32-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A] +; FMACALL32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4 +; FMACALL32-NEXT: retl ## encoding: [0xc3] +; +; FMA64-LABEL: constant_fold_v4f32: +; FMA64: ## %bb.0: +; FMA64-NEXT: vmovaps {{.*#+}} xmm1 = [0.0E+0,1.0E+1,2.0E+1,3.0E+1] +; FMA64-NEXT: ## encoding: [0xc5,0xf8,0x28,0x0d,A,A,A,A] +; FMA64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; FMA64-NEXT: vmovaps {{.*#+}} xmm0 = [4.0E+1,5.0E+1,6.0E+1,7.0E+1] +; FMA64-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A] +; FMA64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; FMA64-NEXT: vfmadd213ps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0x71,0xa8,0x05,A,A,A,A] +; FMA64-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; FMA64-NEXT: ## xmm0 = (xmm1 * xmm0) + mem +; FMA64-NEXT: retq ## encoding: [0xc3] +; +; FMACALL64-LABEL: constant_fold_v4f32: +; FMACALL64: ## %bb.0: +; FMACALL64-NEXT: movaps {{.*#+}} xmm0 = [0.0E+0,4.9E+2,1.18E+3,2.07E+3] +; FMACALL64-NEXT: ## encoding: [0x0f,0x28,0x05,A,A,A,A] +; FMACALL64-NEXT: ## fixup A - offset: 3, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; FMACALL64-NEXT: retq ## encoding: [0xc3] +; +; AVX512-LABEL: constant_fold_v4f32: +; AVX512: ## %bb.0: +; AVX512-NEXT: vmovaps {{.*#+}} xmm1 = [0.0E+0,1.0E+1,2.0E+1,3.0E+1] +; AVX512-NEXT: ## encoding: [0xc5,0xf8,0x28,0x0d,A,A,A,A] +; AVX512-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [4.0E+1,5.0E+1,6.0E+1,7.0E+1] +; AVX512-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A] +; AVX512-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512-NEXT: vfmadd213ps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0x71,0xa8,0x05,A,A,A,A] +; AVX512-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512-NEXT: ## xmm0 = (xmm1 * xmm0) + mem +; AVX512-NEXT: retq ## encoding: [0xc3] +; +; AVX512VL-LABEL: constant_fold_v4f32: +; AVX512VL: ## %bb.0: +; AVX512VL-NEXT: vmovaps {{.*#+}} xmm1 = [0.0E+0,1.0E+1,2.0E+1,3.0E+1] +; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0x0d,A,A,A,A] +; AVX512VL-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512VL-NEXT: vmovaps {{.*#+}} xmm0 = [4.0E+1,5.0E+1,6.0E+1,7.0E+1] +; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A] +; AVX512VL-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; 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] +; AVX512VL-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512VL-NEXT: ## xmm0 = (xmm1 * xmm0) + mem +; AVX512VL-NEXT: retq ## encoding: [0xc3] + %r = call <4 x float> @llvm.fma.v4f32(<4 x float> , <4 x float> , <4 x float> ) + ret <4 x float> %r +} + +define <2 x double> @constant_fold_v2f64() { +; FMA32-LABEL: constant_fold_v2f64: +; FMA32: ## %bb.0: +; FMA32-NEXT: vmovapd {{.*#+}} xmm1 = [1.0E+1,2.0E+1] +; FMA32-NEXT: ## encoding: [0xc5,0xf9,0x28,0x0d,A,A,A,A] +; FMA32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4 +; FMA32-NEXT: vmovsd {{.*#+}} xmm0 = [1.0E+1,0.0E+0] +; FMA32-NEXT: ## encoding: [0xc5,0xfb,0x10,0x05,A,A,A,A] +; FMA32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4 +; FMA32-NEXT: vfmadd231pd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0xf1,0xb8,0x05,A,A,A,A] +; FMA32-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4 +; FMA32-NEXT: ## xmm0 = (xmm1 * mem) + xmm0 +; FMA32-NEXT: retl ## encoding: [0xc3] +; +; FMACALL32-LABEL: constant_fold_v2f64: +; FMACALL32: ## %bb.0: +; FMACALL32-NEXT: vmovaps {{.*#+}} xmm0 = [4.1E+2,1.4E+3] +; FMACALL32-NEXT: ## encoding: [0xc5,0xf8,0x28,0x05,A,A,A,A] +; FMACALL32-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: FK_Data_4 +; FMACALL32-NEXT: retl ## encoding: [0xc3] +; +; FMA64-LABEL: constant_fold_v2f64: +; FMA64: ## %bb.0: +; FMA64-NEXT: vmovapd {{.*#+}} xmm1 = [1.0E+1,2.0E+1] +; FMA64-NEXT: ## encoding: [0xc5,0xf9,0x28,0x0d,A,A,A,A] +; FMA64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; FMA64-NEXT: vmovsd {{.*#+}} xmm0 = [1.0E+1,0.0E+0] +; FMA64-NEXT: ## encoding: [0xc5,0xfb,0x10,0x05,A,A,A,A] +; FMA64-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; FMA64-NEXT: vfmadd231pd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0xf1,0xb8,0x05,A,A,A,A] +; FMA64-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; FMA64-NEXT: ## xmm0 = (xmm1 * mem) + xmm0 +; FMA64-NEXT: retq ## encoding: [0xc3] +; +; FMACALL64-LABEL: constant_fold_v2f64: +; FMACALL64: ## %bb.0: +; FMACALL64-NEXT: movaps {{.*#+}} xmm0 = [4.1E+2,1.4E+3] +; FMACALL64-NEXT: ## encoding: [0x0f,0x28,0x05,A,A,A,A] +; FMACALL64-NEXT: ## fixup A - offset: 3, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; FMACALL64-NEXT: retq ## encoding: [0xc3] +; +; AVX512-LABEL: constant_fold_v2f64: +; AVX512: ## %bb.0: +; AVX512-NEXT: vmovapd {{.*#+}} xmm1 = [1.0E+1,2.0E+1] +; AVX512-NEXT: ## encoding: [0xc5,0xf9,0x28,0x0d,A,A,A,A] +; AVX512-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = [1.0E+1,0.0E+0] +; AVX512-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x05,A,A,A,A] +; AVX512-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512-NEXT: vfmadd231pd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0 ## encoding: [0xc4,0xe2,0xf1,0xb8,0x05,A,A,A,A] +; AVX512-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512-NEXT: ## xmm0 = (xmm1 * mem) + xmm0 +; AVX512-NEXT: retq ## encoding: [0xc3] +; +; AVX512VL-LABEL: constant_fold_v2f64: +; AVX512VL: ## %bb.0: +; AVX512VL-NEXT: vmovapd {{.*#+}} xmm1 = [1.0E+1,2.0E+1] +; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xf9,0x28,0x0d,A,A,A,A] +; AVX512VL-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512VL-NEXT: vmovsd {{.*#+}} xmm0 = [1.0E+1,0.0E+0] +; AVX512VL-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x05,A,A,A,A] +; AVX512VL-NEXT: ## fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; 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] +; AVX512VL-NEXT: ## fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}-4, kind: reloc_riprel_4byte +; AVX512VL-NEXT: ## xmm0 = (xmm1 * mem) + xmm0 +; AVX512VL-NEXT: retq ## encoding: [0xc3] + %r = call <2 x double> @llvm.fma.v2f64(<2 x double> , <2 x double> , <2 x double> ) + ret <2 x double> %r +} + declare float @llvm.fma.f32(float, float, float) declare double @llvm.fma.f64(double, double, double) declare x86_fp80 @llvm.fma.f80(x86_fp80, x86_fp80, x86_fp80)