279 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-unknown < %s | FileCheck %s3 4define float @fadd_zero_f32(float %x) #0 {5; CHECK-LABEL: fadd_zero_f32:6; CHECK: # %bb.0:7; CHECK-NEXT: retq8 %y = fadd nsz float %x, 0.09 ret float %y10}11 12define <4 x float> @fadd_zero_4f32(<4 x float> %x) #0 {13; CHECK-LABEL: fadd_zero_4f32:14; CHECK: # %bb.0:15; CHECK-NEXT: retq16 %y = fadd nsz <4 x float> %x, zeroinitializer17 ret <4 x float> %y18}19 20define <4 x float> @fadd_zero_4f32_undef(<4 x float> %x) {21; CHECK-LABEL: fadd_zero_4f32_undef:22; CHECK: # %bb.0:23; CHECK-NEXT: retq24 %y = fadd nsz <4 x float> %x, <float 0.0, float undef, float 0.0, float undef>25 ret <4 x float> %y26}27 28; CHECK: float 329define float @fadd_2const_f32(float %x) #0 {30; CHECK-LABEL: fadd_2const_f32:31; CHECK: # %bb.0:32; CHECK-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm033; CHECK-NEXT: retq34 %y = fadd reassoc nsz float %x, 1.035 %z = fadd reassoc nsz float %y, 2.036 ret float %z37}38 39; CHECK: float 540; CHECK: float 541; CHECK: float 542; CHECK: float 543define <4 x float> @fadd_2const_4f32(<4 x float> %x) #0 {44; CHECK-LABEL: fadd_2const_4f32:45; CHECK: # %bb.0:46; CHECK-NEXT: addps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm047; CHECK-NEXT: retq48 %y = fadd reassoc nsz <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>49 %z = fadd reassoc nsz <4 x float> %y, <float 4.0, float 3.0, float 2.0, float 1.0>50 ret <4 x float> %z51}52 53; CHECK: float 354define float @fadd_x_fmul_x_c_f32(float %x) #0 {55; CHECK-LABEL: fadd_x_fmul_x_c_f32:56; CHECK: # %bb.0:57; CHECK-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm058; CHECK-NEXT: retq59 %y = fmul reassoc nsz float %x, 2.060 %z = fadd reassoc nsz float %x, %y61 ret float %z62}63 64; CHECK: float 265; CHECK: float 366; CHECK: float 467; CHECK: float 568define <4 x float> @fadd_x_fmul_x_c_4f32(<4 x float> %x) #0 {69; CHECK-LABEL: fadd_x_fmul_x_c_4f32:70; CHECK: # %bb.0:71; CHECK-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm072; CHECK-NEXT: retq73 %y = fmul reassoc nsz <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>74 %z = fadd reassoc nsz <4 x float> %x, %y75 ret <4 x float> %z76}77 78; CHECK: float 379define float @fadd_fmul_x_c_x_f32(float %x) #0 {80; CHECK-LABEL: fadd_fmul_x_c_x_f32:81; CHECK: # %bb.0:82; CHECK-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm083; CHECK-NEXT: retq84 %y = fmul reassoc nsz float %x, 2.085 %z = fadd reassoc nsz float %y, %x86 ret float %z87}88 89; CHECK: float 290; CHECK: float 391; CHECK: float 492; CHECK: float 593define <4 x float> @fadd_fmul_x_c_x_4f32(<4 x float> %x) #0 {94; CHECK-LABEL: fadd_fmul_x_c_x_4f32:95; CHECK: # %bb.0:96; CHECK-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm097; CHECK-NEXT: retq98 %y = fmul reassoc nsz <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>99 %z = fadd reassoc nsz <4 x float> %y, %x100 ret <4 x float> %z101}102 103; CHECK: float 4104define float @fadd_fadd_x_x_fmul_x_c_f32(float %x) #0 {105; CHECK-LABEL: fadd_fadd_x_x_fmul_x_c_f32:106; CHECK: # %bb.0:107; CHECK-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0108; CHECK-NEXT: retq109 %y = fadd reassoc nsz float %x, %x110 %z = fmul reassoc nsz float %x, 2.0111 %w = fadd reassoc nsz float %y, %z112 ret float %w113}114 115; CHECK: float 3116; CHECK: float 4117; CHECK: float 5118; CHECK: float 6119define <4 x float> @fadd_fadd_x_x_fmul_x_c_4f32(<4 x float> %x) #0 {120; CHECK-LABEL: fadd_fadd_x_x_fmul_x_c_4f32:121; CHECK: # %bb.0:122; CHECK-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0123; CHECK-NEXT: retq124 %y = fadd reassoc nsz <4 x float> %x, %x125 %z = fmul reassoc nsz <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>126 %w = fadd reassoc nsz <4 x float> %y, %z127 ret <4 x float> %w128}129 130; CHECK: float 4131define float @fadd_fmul_x_c_fadd_x_x_f32(float %x) #0 {132; CHECK-LABEL: fadd_fmul_x_c_fadd_x_x_f32:133; CHECK: # %bb.0:134; CHECK-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0135; CHECK-NEXT: retq136 %y = fadd reassoc nsz float %x, %x137 %z = fmul reassoc nsz float %x, 2.0138 %w = fadd reassoc nsz float %z, %y139 ret float %w140}141 142; CHECK: float 3143; CHECK: float 4144; CHECK: float 5145; CHECK: float 6146define <4 x float> @fadd_fmul_x_c_fadd_x_x_4f32(<4 x float> %x) #0 {147; CHECK-LABEL: fadd_fmul_x_c_fadd_x_x_4f32:148; CHECK: # %bb.0:149; CHECK-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0150; CHECK-NEXT: retq151 %y = fadd reassoc nsz <4 x float> %x, %x152 %z = fmul reassoc nsz <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>153 %w = fadd reassoc nsz <4 x float> %z, %y154 ret <4 x float> %w155}156 157; CHECK: float 3158define float @fadd_x_fadd_x_x_f32(float %x) #0 {159; CHECK-LABEL: fadd_x_fadd_x_x_f32:160; CHECK: # %bb.0:161; CHECK-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0162; CHECK-NEXT: retq163 %y = fadd reassoc nsz float %x, %x164 %z = fadd reassoc nsz float %x, %y165 ret float %z166}167 168; CHECK: float 3169; CHECK: float 3170; CHECK: float 3171; CHECK: float 3172define <4 x float> @fadd_x_fadd_x_x_4f32(<4 x float> %x) #0 {173; CHECK-LABEL: fadd_x_fadd_x_x_4f32:174; CHECK: # %bb.0:175; CHECK-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0176; CHECK-NEXT: retq177 %y = fadd reassoc nsz <4 x float> %x, %x178 %z = fadd reassoc nsz <4 x float> %x, %y179 ret <4 x float> %z180}181 182; CHECK: float 3183define float @fadd_fadd_x_x_x_f32(float %x) #0 {184; CHECK-LABEL: fadd_fadd_x_x_x_f32:185; CHECK: # %bb.0:186; CHECK-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0187; CHECK-NEXT: retq188 %y = fadd reassoc nsz float %x, %x189 %z = fadd reassoc nsz float %y, %x190 ret float %z191}192 193; CHECK: float 3194; CHECK: float 3195; CHECK: float 3196; CHECK: float 3197define <4 x float> @fadd_fadd_x_x_x_4f32(<4 x float> %x) #0 {198; CHECK-LABEL: fadd_fadd_x_x_x_4f32:199; CHECK: # %bb.0:200; CHECK-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0201; CHECK-NEXT: retq202 %y = fadd reassoc nsz <4 x float> %x, %x203 %z = fadd reassoc nsz <4 x float> %y, %x204 ret <4 x float> %z205}206 207; CHECK: float 4208define float @fadd_fadd_x_x_fadd_x_x_f32(float %x) #0 {209; CHECK-LABEL: fadd_fadd_x_x_fadd_x_x_f32:210; CHECK: # %bb.0:211; CHECK-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0212; CHECK-NEXT: retq213 %y = fadd reassoc nsz float %x, %x214 %z = fadd reassoc nsz float %y, %y215 ret float %z216}217 218; CHECK: float 4219; CHECK: float 4220; CHECK: float 4221; CHECK: float 4222define <4 x float> @fadd_fadd_x_x_fadd_x_x_4f32(<4 x float> %x) #0 {223; CHECK-LABEL: fadd_fadd_x_x_fadd_x_x_4f32:224; CHECK: # %bb.0:225; CHECK-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0226; CHECK-NEXT: retq227 %y = fadd reassoc nsz <4 x float> %x, %x228 %z = fadd reassoc nsz <4 x float> %y, %y229 ret <4 x float> %z230}231 232; ((x + 42.0) + 17.0) + (x + 42.0) --> (x + 59.0) + (x + 17.0)233; It's still 3 adds, but the first 2 are independent.234; More reassocation could get this to 2 adds or 1 FMA (that's done in IR, but not in the DAG).235 236define float @fadd_const_multiuse_attr(float %x) #0 {237; CHECK-LABEL: fadd_const_multiuse_attr:238; CHECK: # %bb.0:239; CHECK-NEXT: movss {{.*#+}} xmm1 = [4.2E+1,0.0E+0,0.0E+0,0.0E+0]240; CHECK-NEXT: addss %xmm0, %xmm1241; CHECK-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0242; CHECK-NEXT: addss %xmm1, %xmm0243; CHECK-NEXT: retq244 %a1 = fadd reassoc nsz float %x, 42.0245 %a2 = fadd reassoc nsz float %a1, 17.0246 %a3 = fadd reassoc nsz float %a1, %a2247 ret float %a3248}249 250; PR32939 - https://bugs.llvm.org/show_bug.cgi?id=32939251 252define double @fmul2_negated(double %a, double %b, double %c) {253; CHECK-LABEL: fmul2_negated:254; CHECK: # %bb.0:255; CHECK-NEXT: addsd %xmm1, %xmm1256; CHECK-NEXT: mulsd %xmm2, %xmm1257; CHECK-NEXT: subsd %xmm1, %xmm0258; CHECK-NEXT: retq259 %mul = fmul double %b, 2.0260 %mul1 = fmul double %mul, %c261 %sub = fsub double %a, %mul1262 ret double %sub263}264 265define <2 x double> @fmul2_negated_vec(<2 x double> %a, <2 x double> %b, <2 x double> %c) {266; CHECK-LABEL: fmul2_negated_vec:267; CHECK: # %bb.0:268; CHECK-NEXT: addpd %xmm1, %xmm1269; CHECK-NEXT: mulpd %xmm2, %xmm1270; CHECK-NEXT: subpd %xmm1, %xmm0271; CHECK-NEXT: retq272 %mul = fmul <2 x double> %b, <double 2.0, double 2.0>273 %mul1 = fmul <2 x double> %mul, %c274 %sub = fsub <2 x double> %a, %mul1275 ret <2 x double> %sub276}277 278attributes #0 = { "less-precise-fpmad"="true" "no-infs-fp-math"="true" "no-nans-fp-math"="true" }279