514 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -verify-machineinstrs -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5define double @test1(double %a, double %b) {6; CHECK-SD-LABEL: test1:7; CHECK-SD: // %bb.0:8; CHECK-SD-NEXT: fadd d1, d1, d19; CHECK-SD-NEXT: fsub d0, d0, d110; CHECK-SD-NEXT: ret11;12; CHECK-GI-LABEL: test1:13; CHECK-GI: // %bb.0:14; CHECK-GI-NEXT: fmov d2, #-2.0000000015; CHECK-GI-NEXT: fmul d1, d1, d216; CHECK-GI-NEXT: fadd d0, d0, d117; CHECK-GI-NEXT: ret18 %mul = fmul double %b, -2.000000e+0019 %add1 = fadd double %a, %mul20 ret double %add121}22 23; DAGCombine will canonicalize 'a - 2.0*b' to 'a + -2.0*b'24 25define double @test2(double %a, double %b) {26; CHECK-SD-LABEL: test2:27; CHECK-SD: // %bb.0:28; CHECK-SD-NEXT: fadd d1, d1, d129; CHECK-SD-NEXT: fsub d0, d0, d130; CHECK-SD-NEXT: ret31;32; CHECK-GI-LABEL: test2:33; CHECK-GI: // %bb.0:34; CHECK-GI-NEXT: fmov d2, #2.0000000035; CHECK-GI-NEXT: fmul d1, d1, d236; CHECK-GI-NEXT: fsub d0, d0, d137; CHECK-GI-NEXT: ret38 %mul = fmul double %b, 2.000000e+0039 %add1 = fsub double %a, %mul40 ret double %add141}42 43define double @test3(double %a, double %b, double %c) {44; CHECK-SD-LABEL: test3:45; CHECK-SD: // %bb.0:46; CHECK-SD-NEXT: fmul d0, d0, d147; CHECK-SD-NEXT: fadd d1, d2, d248; CHECK-SD-NEXT: fsub d0, d0, d149; CHECK-SD-NEXT: ret50;51; CHECK-GI-LABEL: test3:52; CHECK-GI: // %bb.0:53; CHECK-GI-NEXT: fmov d3, #2.0000000054; CHECK-GI-NEXT: fmul d0, d0, d155; CHECK-GI-NEXT: fmul d1, d2, d356; CHECK-GI-NEXT: fsub d0, d0, d157; CHECK-GI-NEXT: ret58 %mul = fmul double %a, %b59 %mul1 = fmul double %c, 2.000000e+0060 %sub = fsub double %mul, %mul161 ret double %sub62}63 64define double @test4(double %a, double %b, double %c) {65; CHECK-SD-LABEL: test4:66; CHECK-SD: // %bb.0:67; CHECK-SD-NEXT: fmul d0, d0, d168; CHECK-SD-NEXT: fadd d1, d2, d269; CHECK-SD-NEXT: fsub d0, d0, d170; CHECK-SD-NEXT: ret71;72; CHECK-GI-LABEL: test4:73; CHECK-GI: // %bb.0:74; CHECK-GI-NEXT: fmov d3, #-2.0000000075; CHECK-GI-NEXT: fmul d0, d0, d176; CHECK-GI-NEXT: fmul d1, d2, d377; CHECK-GI-NEXT: fadd d0, d0, d178; CHECK-GI-NEXT: ret79 %mul = fmul double %a, %b80 %mul1 = fmul double %c, -2.000000e+0081 %add2 = fadd double %mul, %mul182 ret double %add283}84 85define <4 x float> @fmulnegtwo_vec(<4 x float> %a, <4 x float> %b) {86; CHECK-SD-LABEL: fmulnegtwo_vec:87; CHECK-SD: // %bb.0:88; CHECK-SD-NEXT: fadd v1.4s, v1.4s, v1.4s89; CHECK-SD-NEXT: fsub v0.4s, v0.4s, v1.4s90; CHECK-SD-NEXT: ret91;92; CHECK-GI-LABEL: fmulnegtwo_vec:93; CHECK-GI: // %bb.0:94; CHECK-GI-NEXT: fmov s2, #-2.0000000095; CHECK-GI-NEXT: fmul v1.4s, v1.4s, v2.s[0]96; CHECK-GI-NEXT: fadd v0.4s, v0.4s, v1.4s97; CHECK-GI-NEXT: ret98 %mul = fmul <4 x float> %b, <float -2.0, float -2.0, float -2.0, float -2.0>99 %add = fadd <4 x float> %a, %mul100 ret <4 x float> %add101}102 103define <4 x float> @fmulnegtwo_vec_commute(<4 x float> %a, <4 x float> %b) {104; CHECK-SD-LABEL: fmulnegtwo_vec_commute:105; CHECK-SD: // %bb.0:106; CHECK-SD-NEXT: fadd v1.4s, v1.4s, v1.4s107; CHECK-SD-NEXT: fsub v0.4s, v0.4s, v1.4s108; CHECK-SD-NEXT: ret109;110; CHECK-GI-LABEL: fmulnegtwo_vec_commute:111; CHECK-GI: // %bb.0:112; CHECK-GI-NEXT: fmov s2, #-2.00000000113; CHECK-GI-NEXT: fmul v1.4s, v1.4s, v2.s[0]114; CHECK-GI-NEXT: fadd v0.4s, v1.4s, v0.4s115; CHECK-GI-NEXT: ret116 %mul = fmul <4 x float> %b, <float -2.0, float -2.0, float -2.0, float -2.0>117 %add = fadd <4 x float> %mul, %a118 ret <4 x float> %add119}120 121define <4 x float> @fmulnegtwo_vec_undefs(<4 x float> %a, <4 x float> %b) {122; CHECK-SD-LABEL: fmulnegtwo_vec_undefs:123; CHECK-SD: // %bb.0:124; CHECK-SD-NEXT: fadd v1.4s, v1.4s, v1.4s125; CHECK-SD-NEXT: fsub v0.4s, v0.4s, v1.4s126; CHECK-SD-NEXT: ret127;128; CHECK-GI-LABEL: fmulnegtwo_vec_undefs:129; CHECK-GI: // %bb.0:130; CHECK-GI-NEXT: fmov s2, #-2.00000000131; CHECK-GI-NEXT: mov v3.s[1], v2.s[0]132; CHECK-GI-NEXT: mov v3.s[3], v2.s[0]133; CHECK-GI-NEXT: fmul v1.4s, v1.4s, v3.4s134; CHECK-GI-NEXT: fadd v0.4s, v0.4s, v1.4s135; CHECK-GI-NEXT: ret136 %mul = fmul <4 x float> %b, <float undef, float -2.0, float undef, float -2.0>137 %add = fadd <4 x float> %a, %mul138 ret <4 x float> %add139}140 141define <4 x float> @fmulnegtwo_vec_commute_undefs(<4 x float> %a, <4 x float> %b) {142; CHECK-SD-LABEL: fmulnegtwo_vec_commute_undefs:143; CHECK-SD: // %bb.0:144; CHECK-SD-NEXT: fadd v1.4s, v1.4s, v1.4s145; CHECK-SD-NEXT: fsub v0.4s, v0.4s, v1.4s146; CHECK-SD-NEXT: ret147;148; CHECK-GI-LABEL: fmulnegtwo_vec_commute_undefs:149; CHECK-GI: // %bb.0:150; CHECK-GI-NEXT: fmov s2, #-2.00000000151; CHECK-GI-NEXT: fmov s3, #-2.00000000152; CHECK-GI-NEXT: mov v3.s[2], v2.s[0]153; CHECK-GI-NEXT: mov v3.s[3], v2.s[0]154; CHECK-GI-NEXT: fmul v1.4s, v1.4s, v3.4s155; CHECK-GI-NEXT: fadd v0.4s, v1.4s, v0.4s156; CHECK-GI-NEXT: ret157 %mul = fmul <4 x float> %b, <float -2.0, float undef, float -2.0, float -2.0>158 %add = fadd <4 x float> %mul, %a159 ret <4 x float> %add160}161 162define <4 x float> @test6(<4 x float> %a, <4 x float> %b) {163; CHECK-SD-LABEL: test6:164; CHECK-SD: // %bb.0:165; CHECK-SD-NEXT: fadd v1.4s, v1.4s, v1.4s166; CHECK-SD-NEXT: fsub v0.4s, v0.4s, v1.4s167; CHECK-SD-NEXT: ret168;169; CHECK-GI-LABEL: test6:170; CHECK-GI: // %bb.0:171; CHECK-GI-NEXT: fmov s2, #2.00000000172; CHECK-GI-NEXT: fmul v1.4s, v1.4s, v2.s[0]173; CHECK-GI-NEXT: fsub v0.4s, v0.4s, v1.4s174; CHECK-GI-NEXT: ret175 %mul = fmul <4 x float> %b, <float 2.0, float 2.0, float 2.0, float 2.0>176 %add = fsub <4 x float> %a, %mul177 ret <4 x float> %add178}179 180; Don't fold (fadd A, (fmul B, -2.0)) -> (fsub A, (fadd B, B)) if the fmul has181; multiple uses.182 183define double @test7(double %a, double %b) nounwind {184; CHECK-LABEL: test7:185; CHECK: // %bb.0:186; CHECK-NEXT: str d8, [sp, #-16]! // 8-byte Folded Spill187; CHECK-NEXT: fmov d2, #-2.00000000188; CHECK-NEXT: str x30, [sp, #8] // 8-byte Spill189; CHECK-NEXT: fmul d1, d1, d2190; CHECK-NEXT: fadd d8, d0, d1191; CHECK-NEXT: fmov d0, d1192; CHECK-NEXT: bl use193; CHECK-NEXT: ldr x30, [sp, #8] // 8-byte Reload194; CHECK-NEXT: fmov d0, d8195; CHECK-NEXT: ldr d8, [sp], #16 // 8-byte Folded Reload196; CHECK-NEXT: ret197 %mul = fmul double %b, -2.000000e+00198 %add1 = fadd double %a, %mul199 call void @use(double %mul)200 ret double %add1201}202 203define float @fadd_const_multiuse_fmf(float %x) {204; CHECK-SD-LABEL: fadd_const_multiuse_fmf:205; CHECK-SD: // %bb.0:206; CHECK-SD-NEXT: mov w8, #1109917696 // =0x42280000207; CHECK-SD-NEXT: mov w9, #1114374144 // =0x426c0000208; CHECK-SD-NEXT: fmov s1, w8209; CHECK-SD-NEXT: fmov s2, w9210; CHECK-SD-NEXT: fadd s1, s0, s1211; CHECK-SD-NEXT: fadd s0, s0, s2212; CHECK-SD-NEXT: fadd s0, s1, s0213; CHECK-SD-NEXT: ret214;215; CHECK-GI-LABEL: fadd_const_multiuse_fmf:216; CHECK-GI: // %bb.0:217; CHECK-GI-NEXT: mov w8, #1109917696 // =0x42280000218; CHECK-GI-NEXT: fmov s1, w8219; CHECK-GI-NEXT: fadd s0, s0, s1220; CHECK-GI-NEXT: fmov s1, #17.00000000221; CHECK-GI-NEXT: fadd s1, s0, s1222; CHECK-GI-NEXT: fadd s0, s0, s1223; CHECK-GI-NEXT: ret224 %a1 = fadd float %x, 42.0225 %a2 = fadd nsz reassoc float %a1, 17.0226 %a3 = fadd float %a1, %a2227 ret float %a3228}229 230; DAGCombiner transforms this into: (x + 17.0) + (x + 59.0).231define float @fadd_const_multiuse_attr(float %x) {232; CHECK-SD-LABEL: fadd_const_multiuse_attr:233; CHECK-SD: // %bb.0:234; CHECK-SD-NEXT: mov w8, #1109917696 // =0x42280000235; CHECK-SD-NEXT: mov w9, #1114374144 // =0x426c0000236; CHECK-SD-NEXT: fmov s1, w8237; CHECK-SD-NEXT: fmov s2, w9238; CHECK-SD-NEXT: fadd s1, s0, s1239; CHECK-SD-NEXT: fadd s0, s0, s2240; CHECK-SD-NEXT: fadd s0, s1, s0241; CHECK-SD-NEXT: ret242;243; CHECK-GI-LABEL: fadd_const_multiuse_attr:244; CHECK-GI: // %bb.0:245; CHECK-GI-NEXT: mov w8, #1109917696 // =0x42280000246; CHECK-GI-NEXT: fmov s1, w8247; CHECK-GI-NEXT: fadd s0, s0, s1248; CHECK-GI-NEXT: fmov s1, #17.00000000249; CHECK-GI-NEXT: fadd s1, s0, s1250; CHECK-GI-NEXT: fadd s0, s0, s1251; CHECK-GI-NEXT: ret252 %a1 = fadd fast float %x, 42.0253 %a2 = fadd fast float %a1, 17.0254 %a3 = fadd fast float %a1, %a2255 ret float %a3256}257 258; PR32939 - https://bugs.llvm.org/show_bug.cgi?id=32939259 260define double @fmul2_negated(double %a, double %b, double %c) {261; CHECK-SD-LABEL: fmul2_negated:262; CHECK-SD: // %bb.0:263; CHECK-SD-NEXT: fadd d1, d1, d1264; CHECK-SD-NEXT: fmul d1, d1, d2265; CHECK-SD-NEXT: fsub d0, d0, d1266; CHECK-SD-NEXT: ret267;268; CHECK-GI-LABEL: fmul2_negated:269; CHECK-GI: // %bb.0:270; CHECK-GI-NEXT: fmov d3, #2.00000000271; CHECK-GI-NEXT: fmul d1, d1, d3272; CHECK-GI-NEXT: fmul d1, d1, d2273; CHECK-GI-NEXT: fsub d0, d0, d1274; CHECK-GI-NEXT: ret275 %mul = fmul double %b, 2.0276 %mul1 = fmul double %mul, %c277 %sub = fsub double %a, %mul1278 ret double %sub279}280 281define <2 x double> @fmul2_negated_vec(<2 x double> %a, <2 x double> %b, <2 x double> %c) {282; CHECK-SD-LABEL: fmul2_negated_vec:283; CHECK-SD: // %bb.0:284; CHECK-SD-NEXT: fadd v1.2d, v1.2d, v1.2d285; CHECK-SD-NEXT: fmul v1.2d, v1.2d, v2.2d286; CHECK-SD-NEXT: fsub v0.2d, v0.2d, v1.2d287; CHECK-SD-NEXT: ret288;289; CHECK-GI-LABEL: fmul2_negated_vec:290; CHECK-GI: // %bb.0:291; CHECK-GI-NEXT: fmov d3, #2.00000000292; CHECK-GI-NEXT: fmul v1.2d, v1.2d, v3.d[0]293; CHECK-GI-NEXT: fmul v1.2d, v1.2d, v2.2d294; CHECK-GI-NEXT: fsub v0.2d, v0.2d, v1.2d295; CHECK-GI-NEXT: ret296 %mul = fmul <2 x double> %b, <double 2.0, double 2.0>297 %mul1 = fmul <2 x double> %mul, %c298 %sub = fsub <2 x double> %a, %mul1299 ret <2 x double> %sub300}301 302; ((a*b) + (c*d)) + n1 --> (a*b) + ((c*d) + n1)303 304define double @fadd_fma_fmul_1(double %a, double %b, double %c, double %d, double %n1) nounwind {305; CHECK-SD-LABEL: fadd_fma_fmul_1:306; CHECK-SD: // %bb.0:307; CHECK-SD-NEXT: fmadd d2, d2, d3, d4308; CHECK-SD-NEXT: fmadd d0, d0, d1, d2309; CHECK-SD-NEXT: ret310;311; CHECK-GI-LABEL: fadd_fma_fmul_1:312; CHECK-GI: // %bb.0:313; CHECK-GI-NEXT: fmul d2, d2, d3314; CHECK-GI-NEXT: fmadd d0, d0, d1, d2315; CHECK-GI-NEXT: fadd d0, d0, d4316; CHECK-GI-NEXT: ret317 %m1 = fmul fast double %a, %b318 %m2 = fmul fast double %c, %d319 %a1 = fadd fast double %m1, %m2320 %a2 = fadd fast double %a1, %n1321 ret double %a2322}323 324; Minimum FMF - the 1st fadd is contracted because that combines325; fmul+fadd as specified by the order of operations; the 2nd fadd326; requires reassociation to fuse with c*d.327 328define float @fadd_fma_fmul_fmf(float %a, float %b, float %c, float %d, float %n0) nounwind {329; CHECK-SD-LABEL: fadd_fma_fmul_fmf:330; CHECK-SD: // %bb.0:331; CHECK-SD-NEXT: fmadd s2, s2, s3, s4332; CHECK-SD-NEXT: fmadd s0, s0, s1, s2333; CHECK-SD-NEXT: ret334;335; CHECK-GI-LABEL: fadd_fma_fmul_fmf:336; CHECK-GI: // %bb.0:337; CHECK-GI-NEXT: fmul s2, s2, s3338; CHECK-GI-NEXT: fmadd s0, s0, s1, s2339; CHECK-GI-NEXT: fadd s0, s4, s0340; CHECK-GI-NEXT: ret341 %m1 = fmul contract float %a, %b342 %m2 = fmul contract float %c, %d343 %a1 = fadd contract float %m1, %m2344 %a2 = fadd contract reassoc float %n0, %a1345 ret float %a2346}347 348; Not minimum FMF.349 350define float @fadd_fma_fmul_2(float %a, float %b, float %c, float %d, float %n0) nounwind {351; CHECK-LABEL: fadd_fma_fmul_2:352; CHECK: // %bb.0:353; CHECK-NEXT: fmul s2, s2, s3354; CHECK-NEXT: fmadd s0, s0, s1, s2355; CHECK-NEXT: fadd s0, s4, s0356; CHECK-NEXT: ret357 %m1 = fmul float %a, %b358 %m2 = fmul float %c, %d359 %a1 = fadd contract float %m1, %m2360 %a2 = fadd contract float %n0, %a1361 ret float %a2362}363 364; The final fadd can be folded with either 1 of the leading fmuls.365 366define <2 x double> @fadd_fma_fmul_3(<2 x double> %x1, <2 x double> %x2, <2 x double> %x3, <2 x double> %x4, <2 x double> %x5, <2 x double> %x6, <2 x double> %x7, <2 x double> %x8) nounwind {367; CHECK-SD-LABEL: fadd_fma_fmul_3:368; CHECK-SD: // %bb.0:369; CHECK-SD-NEXT: fmul v2.2d, v2.2d, v3.2d370; CHECK-SD-NEXT: fmla v2.2d, v1.2d, v0.2d371; CHECK-SD-NEXT: fmla v2.2d, v7.2d, v6.2d372; CHECK-SD-NEXT: fmla v2.2d, v5.2d, v4.2d373; CHECK-SD-NEXT: mov v0.16b, v2.16b374; CHECK-SD-NEXT: ret375;376; CHECK-GI-LABEL: fadd_fma_fmul_3:377; CHECK-GI: // %bb.0:378; CHECK-GI-NEXT: fmul v2.2d, v2.2d, v3.2d379; CHECK-GI-NEXT: fmul v3.2d, v6.2d, v7.2d380; CHECK-GI-NEXT: fmla v2.2d, v0.2d, v1.2d381; CHECK-GI-NEXT: fmla v3.2d, v4.2d, v5.2d382; CHECK-GI-NEXT: fadd v0.2d, v2.2d, v3.2d383; CHECK-GI-NEXT: ret384 %m1 = fmul fast <2 x double> %x1, %x2385 %m2 = fmul fast <2 x double> %x3, %x4386 %m3 = fmul fast <2 x double> %x5, %x6387 %m4 = fmul fast <2 x double> %x7, %x8388 %a1 = fadd fast <2 x double> %m1, %m2389 %a2 = fadd fast <2 x double> %m3, %m4390 %a3 = fadd fast <2 x double> %a1, %a2391 ret <2 x double> %a3392}393 394; negative test395 396define float @fadd_fma_fmul_extra_use_1(float %a, float %b, float %c, float %d, float %n0, ptr %p) nounwind {397; CHECK-LABEL: fadd_fma_fmul_extra_use_1:398; CHECK: // %bb.0:399; CHECK-NEXT: fmul s1, s0, s1400; CHECK-NEXT: fmadd s0, s2, s3, s1401; CHECK-NEXT: str s1, [x0]402; CHECK-NEXT: fadd s0, s4, s0403; CHECK-NEXT: ret404 %m1 = fmul fast float %a, %b405 store float %m1, ptr %p406 %m2 = fmul fast float %c, %d407 %a1 = fadd fast float %m1, %m2408 %a2 = fadd fast float %n0, %a1409 ret float %a2410}411 412; negative test413 414define float @fadd_fma_fmul_extra_use_2(float %a, float %b, float %c, float %d, float %n0, ptr %p) nounwind {415; CHECK-LABEL: fadd_fma_fmul_extra_use_2:416; CHECK: // %bb.0:417; CHECK-NEXT: fmul s2, s2, s3418; CHECK-NEXT: fmadd s0, s0, s1, s2419; CHECK-NEXT: str s2, [x0]420; CHECK-NEXT: fadd s0, s4, s0421; CHECK-NEXT: ret422 %m1 = fmul fast float %a, %b423 %m2 = fmul fast float %c, %d424 store float %m2, ptr %p425 %a1 = fadd fast float %m1, %m2426 %a2 = fadd fast float %n0, %a1427 ret float %a2428}429 430; negative test431 432define float @fadd_fma_fmul_extra_use_3(float %a, float %b, float %c, float %d, float %n0, ptr %p) nounwind {433; CHECK-LABEL: fadd_fma_fmul_extra_use_3:434; CHECK: // %bb.0:435; CHECK-NEXT: fmul s2, s2, s3436; CHECK-NEXT: fmadd s1, s0, s1, s2437; CHECK-NEXT: fadd s0, s4, s1438; CHECK-NEXT: str s1, [x0]439; CHECK-NEXT: ret440 %m1 = fmul fast float %a, %b441 %m2 = fmul fast float %c, %d442 %a1 = fadd fast float %m1, %m2443 store float %a1, ptr %p444 %a2 = fadd fast float %n0, %a1445 ret float %a2446}447 448define float @fmac_sequence_innermost_fmul(float %a, float %b, float %c, float %d, float %e, float %f, float %g) {449; CHECK-SD-LABEL: fmac_sequence_innermost_fmul:450; CHECK-SD: // %bb.0:451; CHECK-SD-NEXT: fmadd s0, s0, s1, s6452; CHECK-SD-NEXT: fmadd s0, s2, s3, s0453; CHECK-SD-NEXT: fmadd s0, s4, s5, s0454; CHECK-SD-NEXT: ret455;456; CHECK-GI-LABEL: fmac_sequence_innermost_fmul:457; CHECK-GI: // %bb.0:458; CHECK-GI-NEXT: fmul s2, s2, s3459; CHECK-GI-NEXT: fmadd s0, s0, s1, s2460; CHECK-GI-NEXT: fmadd s0, s4, s5, s0461; CHECK-GI-NEXT: fadd s0, s0, s6462; CHECK-GI-NEXT: ret463 %t0 = fmul float %a, %b464 %t1 = fmul contract float %c, %d465 %t2 = fadd contract float %t0, %t1466 %t3 = fmul contract float %e, %f467 %t4 = fadd contract float %t2, %t3468 %t5 = fadd contract reassoc float %t4, %g469 ret float %t5470}471 472define float @fmac_sequence_innermost_fmul_intrinsics(float %a, float %b, float %c, float %d, float %e, float %f, float %g) {473; CHECK-SD-LABEL: fmac_sequence_innermost_fmul_intrinsics:474; CHECK-SD: // %bb.0:475; CHECK-SD-NEXT: fmadd s0, s0, s1, s6476; CHECK-SD-NEXT: fmadd s0, s2, s3, s0477; CHECK-SD-NEXT: fmadd s0, s4, s5, s0478; CHECK-SD-NEXT: ret479;480; CHECK-GI-LABEL: fmac_sequence_innermost_fmul_intrinsics:481; CHECK-GI: // %bb.0:482; CHECK-GI-NEXT: fmul s0, s0, s1483; CHECK-GI-NEXT: fmadd s0, s2, s3, s0484; CHECK-GI-NEXT: fmadd s0, s4, s5, s0485; CHECK-GI-NEXT: fadd s0, s0, s6486; CHECK-GI-NEXT: ret487 %t0 = fmul float %a, %b488 %t1 = call float @llvm.fma.f32(float %c, float %d, float %t0)489 %t2 = call float @llvm.fma.f32(float %e, float %f, float %t1)490 %t5 = fadd contract reassoc float %t2, %g491 ret float %t5492}493 494declare float @llvm.fma.f32(float, float, float)495 496declare void @use(double)497 498 499define float @faddvf32_zero_nsz(float %a) {500; CHECK-LABEL: faddvf32_zero_nsz:501; CHECK: // %bb.0:502; CHECK-NEXT: ret503 %b = fadd nsz float %a, 0.0504 ret float %b505}506 507define <2 x double> @faddv2f64_zero_nsz(<2 x double> %a) {508; CHECK-LABEL: faddv2f64_zero_nsz:509; CHECK: // %bb.0:510; CHECK-NEXT: ret511 %b = fadd nsz <2 x double> %a, zeroinitializer512 ret <2 x double> %b513}514