214 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+fma | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+fma | FileCheck %s --check-prefix=X644 5define float @f1(float %a, float %b, float %c) {6; X86-LABEL: f1:7; X86: # %bb.0:8; X86-NEXT: pushl %eax9; X86-NEXT: .cfi_def_cfa_offset 810; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero11; X86-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero12; X86-NEXT: vfmadd213ss {{.*#+}} xmm1 = (xmm0 * xmm1) + mem13; X86-NEXT: vmovss %xmm1, (%esp)14; X86-NEXT: flds (%esp)15; X86-NEXT: popl %eax16; X86-NEXT: .cfi_def_cfa_offset 417; X86-NEXT: retl18;19; X64-LABEL: f1:20; X64: # %bb.0:21; X64-NEXT: vfmadd213ss {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm222; X64-NEXT: retq23 %mul = fmul fast float %b, %a24 %add = fadd fast float %mul, %c25 ret float %add26}27 28define float @f2(float %a, float %b, float %c) {29; X86-LABEL: f2:30; X86: # %bb.0:31; X86-NEXT: pushl %eax32; X86-NEXT: .cfi_def_cfa_offset 833; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero34; X86-NEXT: vmulss {{[0-9]+}}(%esp), %xmm0, %xmm035; X86-NEXT: #ARITH_FENCE36; X86-NEXT: vaddss {{[0-9]+}}(%esp), %xmm0, %xmm037; X86-NEXT: vmovss %xmm0, (%esp)38; X86-NEXT: flds (%esp)39; X86-NEXT: popl %eax40; X86-NEXT: .cfi_def_cfa_offset 441; X86-NEXT: retl42;43; X64-LABEL: f2:44; X64: # %bb.0:45; X64-NEXT: vmulss %xmm0, %xmm1, %xmm046; X64-NEXT: #ARITH_FENCE47; X64-NEXT: vaddss %xmm2, %xmm0, %xmm048; X64-NEXT: retq49 %mul = fmul fast float %b, %a50 %tmp = call float @llvm.arithmetic.fence.f32(float %mul)51 %add = fadd fast float %tmp, %c52 ret float %add53}54 55define double @f3(double %a) {56; X86-LABEL: f3:57; X86: # %bb.0:58; X86-NEXT: pushl %ebp59; X86-NEXT: .cfi_def_cfa_offset 860; X86-NEXT: .cfi_offset %ebp, -861; X86-NEXT: movl %esp, %ebp62; X86-NEXT: .cfi_def_cfa_register %ebp63; X86-NEXT: andl $-8, %esp64; X86-NEXT: subl $8, %esp65; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero66; X86-NEXT: vmulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm067; X86-NEXT: vmovsd %xmm0, (%esp)68; X86-NEXT: fldl (%esp)69; X86-NEXT: movl %ebp, %esp70; X86-NEXT: popl %ebp71; X86-NEXT: .cfi_def_cfa %esp, 472; X86-NEXT: retl73;74; X64-LABEL: f3:75; X64: # %bb.0:76; X64-NEXT: vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm077; X64-NEXT: retq78 %1 = fadd fast double %a, %a79 %2 = fadd fast double %a, %a80 %3 = fadd fast double %1, %281 ret double %382}83 84define double @f4(double %a) {85; X86-LABEL: f4:86; X86: # %bb.0:87; X86-NEXT: pushl %ebp88; X86-NEXT: .cfi_def_cfa_offset 889; X86-NEXT: .cfi_offset %ebp, -890; X86-NEXT: movl %esp, %ebp91; X86-NEXT: .cfi_def_cfa_register %ebp92; X86-NEXT: andl $-8, %esp93; X86-NEXT: subl $8, %esp94; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero95; X86-NEXT: vaddsd %xmm0, %xmm0, %xmm096; X86-NEXT: vmovapd %xmm0, %xmm197; X86-NEXT: #ARITH_FENCE98; X86-NEXT: vaddsd %xmm0, %xmm1, %xmm099; X86-NEXT: vmovsd %xmm0, (%esp)100; X86-NEXT: fldl (%esp)101; X86-NEXT: movl %ebp, %esp102; X86-NEXT: popl %ebp103; X86-NEXT: .cfi_def_cfa %esp, 4104; X86-NEXT: retl105;106; X64-LABEL: f4:107; X64: # %bb.0:108; X64-NEXT: vaddsd %xmm0, %xmm0, %xmm0109; X64-NEXT: vmovapd %xmm0, %xmm1110; X64-NEXT: #ARITH_FENCE111; X64-NEXT: vaddsd %xmm0, %xmm1, %xmm0112; X64-NEXT: retq113 %1 = fadd fast double %a, %a114 %t = call double @llvm.arithmetic.fence.f64(double %1)115 %2 = fadd fast double %a, %a116 %3 = fadd fast double %t, %2117 ret double %3118}119 120define <2 x float> @f5(<2 x float> %a) {121; X86-LABEL: f5:122; X86: # %bb.0:123; X86-NEXT: vmulps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0124; X86-NEXT: retl125;126; X64-LABEL: f5:127; X64: # %bb.0:128; X64-NEXT: vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0129; X64-NEXT: retq130 %1 = fadd fast <2 x float> %a, %a131 %2 = fadd fast <2 x float> %a, %a132 %3 = fadd fast <2 x float> %1, %2133 ret <2 x float> %3134}135 136define <2 x float> @f6(<2 x float> %a) {137; X86-LABEL: f6:138; X86: # %bb.0:139; X86-NEXT: vaddps %xmm0, %xmm0, %xmm0140; X86-NEXT: vmovaps %xmm0, %xmm1141; X86-NEXT: #ARITH_FENCE142; X86-NEXT: vaddps %xmm0, %xmm1, %xmm0143; X86-NEXT: retl144;145; X64-LABEL: f6:146; X64: # %bb.0:147; X64-NEXT: vaddps %xmm0, %xmm0, %xmm0148; X64-NEXT: vmovaps %xmm0, %xmm1149; X64-NEXT: #ARITH_FENCE150; X64-NEXT: vaddps %xmm0, %xmm1, %xmm0151; X64-NEXT: retq152 %1 = fadd fast <2 x float> %a, %a153 %t = call <2 x float> @llvm.arithmetic.fence.v2f32(<2 x float> %1)154 %2 = fadd fast <2 x float> %a, %a155 %3 = fadd fast <2 x float> %t, %2156 ret <2 x float> %3157}158 159; This @f7 IR test can be generated from flowing c test:160;161; typedef __float128 TYPE;162; TYPE foo(TYPE *qr) {163; TYPE re =__arithmetic_fence(*qr);164; return re;165;}166;167; with flowing build command:168; clang -cc1 -triple i386-pc-linux-gnu -mreassociate t.c -emit-llvm -O2169 170define dso_local fp128 @foo(ptr nocapture readonly %qr) local_unnamed_addr{171; X86-LABEL: foo:172; X86: # %bb.0: # %entry173; X86-NEXT: pushl %edi174; X86-NEXT: .cfi_def_cfa_offset 8175; X86-NEXT: pushl %esi176; X86-NEXT: .cfi_def_cfa_offset 12177; X86-NEXT: .cfi_offset %esi, -12178; X86-NEXT: .cfi_offset %edi, -8179; X86-NEXT: movl {{[0-9]+}}(%esp), %eax180; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx181; X86-NEXT: movl 12(%ecx), %edx182; X86-NEXT: movl 8(%ecx), %esi183; X86-NEXT: movl (%ecx), %edi184; X86-NEXT: movl 4(%ecx), %ecx185; X86-NEXT: #ARITH_FENCE186; X86-NEXT: #ARITH_FENCE187; X86-NEXT: #ARITH_FENCE188; X86-NEXT: #ARITH_FENCE189; X86-NEXT: movl %edx, 12(%eax)190; X86-NEXT: movl %esi, 8(%eax)191; X86-NEXT: movl %ecx, 4(%eax)192; X86-NEXT: movl %edi, (%eax)193; X86-NEXT: popl %esi194; X86-NEXT: .cfi_def_cfa_offset 8195; X86-NEXT: popl %edi196; X86-NEXT: .cfi_def_cfa_offset 4197; X86-NEXT: retl $4198;199; X64-LABEL: foo:200; X64: # %bb.0: # %entry201; X64-NEXT: vmovaps (%rdi), %xmm0202; X64-NEXT: #ARITH_FENCE203; X64-NEXT: retq204entry:205 %0 = load fp128, ptr %qr, align 16206 %1 = tail call reassoc fp128 @llvm.arithmetic.fence.f128(fp128 %0)207 ret fp128 %1208}209 210declare fp128 @llvm.arithmetic.fence.f128(fp128)211declare float @llvm.arithmetic.fence.f32(float)212declare double @llvm.arithmetic.fence.f64(double)213declare <2 x float> @llvm.arithmetic.fence.v2f32(<2 x float>)214