675 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+neon,-use-reciprocal-square-root | FileCheck %s --check-prefix=FAULT3; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+neon,+use-reciprocal-square-root | FileCheck %s4 5declare float @llvm.sqrt.f32(float)6declare <2 x float> @llvm.sqrt.v2f32(<2 x float>)7declare <4 x float> @llvm.sqrt.v4f32(<4 x float>)8declare <8 x float> @llvm.sqrt.v8f32(<8 x float>)9declare double @llvm.sqrt.f64(double)10declare <2 x double> @llvm.sqrt.v2f64(<2 x double>)11declare <4 x double> @llvm.sqrt.v4f64(<4 x double>)12 13define float @fsqrt(float %a) {14; FAULT-LABEL: fsqrt:15; FAULT: // %bb.0:16; FAULT-NEXT: fsqrt s0, s017; FAULT-NEXT: ret18;19; CHECK-LABEL: fsqrt:20; CHECK: // %bb.0:21; CHECK-NEXT: frsqrte s1, s022; CHECK-NEXT: fcmp s0, #0.023; CHECK-NEXT: fmul s2, s1, s124; CHECK-NEXT: frsqrts s2, s0, s225; CHECK-NEXT: fmul s1, s1, s226; CHECK-NEXT: fmul s2, s1, s127; CHECK-NEXT: fmul s1, s0, s128; CHECK-NEXT: frsqrts s2, s0, s229; CHECK-NEXT: fmul s1, s1, s230; CHECK-NEXT: fcsel s0, s0, s1, eq31; CHECK-NEXT: ret32 %1 = tail call fast float @llvm.sqrt.f32(float %a)33 ret float %134}35 36define float @fsqrt_ieee_denorms(float %a) #0 {37; FAULT-LABEL: fsqrt_ieee_denorms:38; FAULT: // %bb.0:39; FAULT-NEXT: fsqrt s0, s040; FAULT-NEXT: ret41;42; CHECK-LABEL: fsqrt_ieee_denorms:43; CHECK: // %bb.0:44; CHECK-NEXT: frsqrte s1, s045; CHECK-NEXT: fcmp s0, #0.046; CHECK-NEXT: fmul s2, s1, s147; CHECK-NEXT: frsqrts s2, s0, s248; CHECK-NEXT: fmul s1, s1, s249; CHECK-NEXT: fmul s2, s1, s150; CHECK-NEXT: fmul s1, s0, s151; CHECK-NEXT: frsqrts s2, s0, s252; CHECK-NEXT: fmul s1, s1, s253; CHECK-NEXT: fcsel s0, s0, s1, eq54; CHECK-NEXT: ret55 %1 = tail call fast float @llvm.sqrt.f32(float %a)56 ret float %157}58 59define <2 x float> @f2sqrt(<2 x float> %a) {60; FAULT-LABEL: f2sqrt:61; FAULT: // %bb.0:62; FAULT-NEXT: fsqrt v0.2s, v0.2s63; FAULT-NEXT: ret64;65; CHECK-LABEL: f2sqrt:66; CHECK: // %bb.0:67; CHECK-NEXT: frsqrte v1.2s, v0.2s68; CHECK-NEXT: fmul v2.2s, v1.2s, v1.2s69; CHECK-NEXT: frsqrts v2.2s, v0.2s, v2.2s70; CHECK-NEXT: fmul v1.2s, v1.2s, v2.2s71; CHECK-NEXT: fmul v2.2s, v1.2s, v1.2s72; CHECK-NEXT: fmul v1.2s, v0.2s, v1.2s73; CHECK-NEXT: frsqrts v2.2s, v0.2s, v2.2s74; CHECK-NEXT: fmul v1.2s, v1.2s, v2.2s75; CHECK-NEXT: fcmeq v2.2s, v0.2s, #0.076; CHECK-NEXT: bif v0.8b, v1.8b, v2.8b77; CHECK-NEXT: ret78 %1 = tail call fast <2 x float> @llvm.sqrt.v2f32(<2 x float> %a)79 ret <2 x float> %180}81 82define <4 x float> @f4sqrt(<4 x float> %a) {83; FAULT-LABEL: f4sqrt:84; FAULT: // %bb.0:85; FAULT-NEXT: fsqrt v0.4s, v0.4s86; FAULT-NEXT: ret87;88; CHECK-LABEL: f4sqrt:89; CHECK: // %bb.0:90; CHECK-NEXT: frsqrte v1.4s, v0.4s91; CHECK-NEXT: fmul v2.4s, v1.4s, v1.4s92; CHECK-NEXT: frsqrts v2.4s, v0.4s, v2.4s93; CHECK-NEXT: fmul v1.4s, v1.4s, v2.4s94; CHECK-NEXT: fmul v2.4s, v1.4s, v1.4s95; CHECK-NEXT: fmul v1.4s, v0.4s, v1.4s96; CHECK-NEXT: frsqrts v2.4s, v0.4s, v2.4s97; CHECK-NEXT: fmul v1.4s, v1.4s, v2.4s98; CHECK-NEXT: fcmeq v2.4s, v0.4s, #0.099; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b100; CHECK-NEXT: ret101 %1 = tail call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> %a)102 ret <4 x float> %1103}104 105define <8 x float> @f8sqrt(<8 x float> %a) {106; FAULT-LABEL: f8sqrt:107; FAULT: // %bb.0:108; FAULT-NEXT: fsqrt v0.4s, v0.4s109; FAULT-NEXT: fsqrt v1.4s, v1.4s110; FAULT-NEXT: ret111;112; CHECK-LABEL: f8sqrt:113; CHECK: // %bb.0:114; CHECK-NEXT: frsqrte v2.4s, v0.4s115; CHECK-NEXT: frsqrte v3.4s, v1.4s116; CHECK-NEXT: fmul v4.4s, v2.4s, v2.4s117; CHECK-NEXT: frsqrts v4.4s, v0.4s, v4.4s118; CHECK-NEXT: fmul v5.4s, v3.4s, v3.4s119; CHECK-NEXT: frsqrts v5.4s, v1.4s, v5.4s120; CHECK-NEXT: fmul v2.4s, v2.4s, v4.4s121; CHECK-NEXT: fmul v4.4s, v2.4s, v2.4s122; CHECK-NEXT: fmul v2.4s, v0.4s, v2.4s123; CHECK-NEXT: frsqrts v4.4s, v0.4s, v4.4s124; CHECK-NEXT: fmul v3.4s, v3.4s, v5.4s125; CHECK-NEXT: fmul v5.4s, v3.4s, v3.4s126; CHECK-NEXT: fmul v3.4s, v1.4s, v3.4s127; CHECK-NEXT: frsqrts v5.4s, v1.4s, v5.4s128; CHECK-NEXT: fmul v2.4s, v2.4s, v4.4s129; CHECK-NEXT: fcmeq v4.4s, v0.4s, #0.0130; CHECK-NEXT: bif v0.16b, v2.16b, v4.16b131; CHECK-NEXT: fmul v3.4s, v3.4s, v5.4s132; CHECK-NEXT: fcmeq v5.4s, v1.4s, #0.0133; CHECK-NEXT: bif v1.16b, v3.16b, v5.16b134; CHECK-NEXT: ret135 %1 = tail call fast <8 x float> @llvm.sqrt.v8f32(<8 x float> %a)136 ret <8 x float> %1137}138 139define double @dsqrt(double %a) {140; FAULT-LABEL: dsqrt:141; FAULT: // %bb.0:142; FAULT-NEXT: fsqrt d0, d0143; FAULT-NEXT: ret144;145; CHECK-LABEL: dsqrt:146; CHECK: // %bb.0:147; CHECK-NEXT: frsqrte d1, d0148; CHECK-NEXT: fcmp d0, #0.0149; CHECK-NEXT: fmul d2, d1, d1150; CHECK-NEXT: frsqrts d2, d0, d2151; CHECK-NEXT: fmul d1, d1, d2152; CHECK-NEXT: fmul d2, d1, d1153; CHECK-NEXT: frsqrts d2, d0, d2154; CHECK-NEXT: fmul d1, d1, d2155; CHECK-NEXT: fmul d2, d1, d1156; CHECK-NEXT: fmul d1, d0, d1157; CHECK-NEXT: frsqrts d2, d0, d2158; CHECK-NEXT: fmul d1, d1, d2159; CHECK-NEXT: fcsel d0, d0, d1, eq160; CHECK-NEXT: ret161 %1 = tail call fast double @llvm.sqrt.f64(double %a)162 ret double %1163}164 165define double @dsqrt_ieee_denorms(double %a) #0 {166; FAULT-LABEL: dsqrt_ieee_denorms:167; FAULT: // %bb.0:168; FAULT-NEXT: fsqrt d0, d0169; FAULT-NEXT: ret170;171; CHECK-LABEL: dsqrt_ieee_denorms:172; CHECK: // %bb.0:173; CHECK-NEXT: frsqrte d1, d0174; CHECK-NEXT: fcmp d0, #0.0175; CHECK-NEXT: fmul d2, d1, d1176; CHECK-NEXT: frsqrts d2, d0, d2177; CHECK-NEXT: fmul d1, d1, d2178; CHECK-NEXT: fmul d2, d1, d1179; CHECK-NEXT: frsqrts d2, d0, d2180; CHECK-NEXT: fmul d1, d1, d2181; CHECK-NEXT: fmul d2, d1, d1182; CHECK-NEXT: fmul d1, d0, d1183; CHECK-NEXT: frsqrts d2, d0, d2184; CHECK-NEXT: fmul d1, d1, d2185; CHECK-NEXT: fcsel d0, d0, d1, eq186; CHECK-NEXT: ret187 %1 = tail call fast double @llvm.sqrt.f64(double %a)188 ret double %1189}190 191define <2 x double> @d2sqrt(<2 x double> %a) {192; FAULT-LABEL: d2sqrt:193; FAULT: // %bb.0:194; FAULT-NEXT: fsqrt v0.2d, v0.2d195; FAULT-NEXT: ret196;197; CHECK-LABEL: d2sqrt:198; CHECK: // %bb.0:199; CHECK-NEXT: frsqrte v1.2d, v0.2d200; CHECK-NEXT: fmul v2.2d, v1.2d, v1.2d201; CHECK-NEXT: frsqrts v2.2d, v0.2d, v2.2d202; CHECK-NEXT: fmul v1.2d, v1.2d, v2.2d203; CHECK-NEXT: fmul v2.2d, v1.2d, v1.2d204; CHECK-NEXT: frsqrts v2.2d, v0.2d, v2.2d205; CHECK-NEXT: fmul v1.2d, v1.2d, v2.2d206; CHECK-NEXT: fmul v2.2d, v1.2d, v1.2d207; CHECK-NEXT: fmul v1.2d, v0.2d, v1.2d208; CHECK-NEXT: frsqrts v2.2d, v0.2d, v2.2d209; CHECK-NEXT: fmul v1.2d, v1.2d, v2.2d210; CHECK-NEXT: fcmeq v2.2d, v0.2d, #0.0211; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b212; CHECK-NEXT: ret213 %1 = tail call fast <2 x double> @llvm.sqrt.v2f64(<2 x double> %a)214 ret <2 x double> %1215}216 217define <4 x double> @d4sqrt(<4 x double> %a) {218; FAULT-LABEL: d4sqrt:219; FAULT: // %bb.0:220; FAULT-NEXT: fsqrt v0.2d, v0.2d221; FAULT-NEXT: fsqrt v1.2d, v1.2d222; FAULT-NEXT: ret223;224; CHECK-LABEL: d4sqrt:225; CHECK: // %bb.0:226; CHECK-NEXT: frsqrte v2.2d, v0.2d227; CHECK-NEXT: frsqrte v3.2d, v1.2d228; CHECK-NEXT: fmul v4.2d, v2.2d, v2.2d229; CHECK-NEXT: frsqrts v4.2d, v0.2d, v4.2d230; CHECK-NEXT: fmul v5.2d, v3.2d, v3.2d231; CHECK-NEXT: frsqrts v5.2d, v1.2d, v5.2d232; CHECK-NEXT: fmul v2.2d, v2.2d, v4.2d233; CHECK-NEXT: fmul v4.2d, v2.2d, v2.2d234; CHECK-NEXT: frsqrts v4.2d, v0.2d, v4.2d235; CHECK-NEXT: fmul v3.2d, v3.2d, v5.2d236; CHECK-NEXT: fmul v5.2d, v3.2d, v3.2d237; CHECK-NEXT: frsqrts v5.2d, v1.2d, v5.2d238; CHECK-NEXT: fmul v2.2d, v2.2d, v4.2d239; CHECK-NEXT: fmul v4.2d, v2.2d, v2.2d240; CHECK-NEXT: fmul v2.2d, v0.2d, v2.2d241; CHECK-NEXT: frsqrts v4.2d, v0.2d, v4.2d242; CHECK-NEXT: fmul v3.2d, v3.2d, v5.2d243; CHECK-NEXT: fmul v5.2d, v3.2d, v3.2d244; CHECK-NEXT: fmul v3.2d, v1.2d, v3.2d245; CHECK-NEXT: frsqrts v5.2d, v1.2d, v5.2d246; CHECK-NEXT: fmul v2.2d, v2.2d, v4.2d247; CHECK-NEXT: fcmeq v4.2d, v0.2d, #0.0248; CHECK-NEXT: bif v0.16b, v2.16b, v4.16b249; CHECK-NEXT: fmul v3.2d, v3.2d, v5.2d250; CHECK-NEXT: fcmeq v5.2d, v1.2d, #0.0251; CHECK-NEXT: bif v1.16b, v3.16b, v5.16b252; CHECK-NEXT: ret253 %1 = tail call fast <4 x double> @llvm.sqrt.v4f64(<4 x double> %a)254 ret <4 x double> %1255}256 257define float @frsqrt(float %a) {258; FAULT-LABEL: frsqrt:259; FAULT: // %bb.0:260; FAULT-NEXT: fsqrt s0, s0261; FAULT-NEXT: fmov s1, #1.00000000262; FAULT-NEXT: fdiv s0, s1, s0263; FAULT-NEXT: ret264;265; CHECK-LABEL: frsqrt:266; CHECK: // %bb.0:267; CHECK-NEXT: frsqrte s1, s0268; CHECK-NEXT: fmul s2, s1, s1269; CHECK-NEXT: frsqrts s2, s0, s2270; CHECK-NEXT: fmul s1, s1, s2271; CHECK-NEXT: fmul s2, s1, s1272; CHECK-NEXT: frsqrts s0, s0, s2273; CHECK-NEXT: fmul s0, s1, s0274; CHECK-NEXT: ret275 %1 = tail call fast float @llvm.sqrt.f32(float %a)276 %2 = fdiv fast float 1.000000e+00, %1277 ret float %2278}279 280define <2 x float> @f2rsqrt(<2 x float> %a) {281; FAULT-LABEL: f2rsqrt:282; FAULT: // %bb.0:283; FAULT-NEXT: fsqrt v0.2s, v0.2s284; FAULT-NEXT: fmov v1.2s, #1.00000000285; FAULT-NEXT: fdiv v0.2s, v1.2s, v0.2s286; FAULT-NEXT: ret287;288; CHECK-LABEL: f2rsqrt:289; CHECK: // %bb.0:290; CHECK-NEXT: frsqrte v1.2s, v0.2s291; CHECK-NEXT: fmul v2.2s, v1.2s, v1.2s292; CHECK-NEXT: frsqrts v2.2s, v0.2s, v2.2s293; CHECK-NEXT: fmul v1.2s, v1.2s, v2.2s294; CHECK-NEXT: fmul v2.2s, v1.2s, v1.2s295; CHECK-NEXT: frsqrts v0.2s, v0.2s, v2.2s296; CHECK-NEXT: fmul v0.2s, v1.2s, v0.2s297; CHECK-NEXT: ret298 %1 = tail call fast <2 x float> @llvm.sqrt.v2f32(<2 x float> %a)299 %2 = fdiv fast <2 x float> <float 1.000000e+00, float 1.000000e+00>, %1300 ret <2 x float> %2301}302 303define <4 x float> @f4rsqrt(<4 x float> %a) {304; FAULT-LABEL: f4rsqrt:305; FAULT: // %bb.0:306; FAULT-NEXT: fsqrt v0.4s, v0.4s307; FAULT-NEXT: fmov v1.4s, #1.00000000308; FAULT-NEXT: fdiv v0.4s, v1.4s, v0.4s309; FAULT-NEXT: ret310;311; CHECK-LABEL: f4rsqrt:312; CHECK: // %bb.0:313; CHECK-NEXT: frsqrte v1.4s, v0.4s314; CHECK-NEXT: fmul v2.4s, v1.4s, v1.4s315; CHECK-NEXT: frsqrts v2.4s, v0.4s, v2.4s316; CHECK-NEXT: fmul v1.4s, v1.4s, v2.4s317; CHECK-NEXT: fmul v2.4s, v1.4s, v1.4s318; CHECK-NEXT: frsqrts v0.4s, v0.4s, v2.4s319; CHECK-NEXT: fmul v0.4s, v1.4s, v0.4s320; CHECK-NEXT: ret321 %1 = tail call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> %a)322 %2 = fdiv fast <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, %1323 ret <4 x float> %2324}325 326define <8 x float> @f8rsqrt(<8 x float> %a) {327; FAULT-LABEL: f8rsqrt:328; FAULT: // %bb.0:329; FAULT-NEXT: fsqrt v0.4s, v0.4s330; FAULT-NEXT: fmov v2.4s, #1.00000000331; FAULT-NEXT: fsqrt v1.4s, v1.4s332; FAULT-NEXT: fdiv v0.4s, v2.4s, v0.4s333; FAULT-NEXT: fdiv v1.4s, v2.4s, v1.4s334; FAULT-NEXT: ret335;336; CHECK-LABEL: f8rsqrt:337; CHECK: // %bb.0:338; CHECK-NEXT: frsqrte v2.4s, v0.4s339; CHECK-NEXT: frsqrte v3.4s, v1.4s340; CHECK-NEXT: fmul v4.4s, v2.4s, v2.4s341; CHECK-NEXT: frsqrts v4.4s, v0.4s, v4.4s342; CHECK-NEXT: fmul v5.4s, v3.4s, v3.4s343; CHECK-NEXT: frsqrts v5.4s, v1.4s, v5.4s344; CHECK-NEXT: fmul v2.4s, v2.4s, v4.4s345; CHECK-NEXT: fmul v4.4s, v2.4s, v2.4s346; CHECK-NEXT: frsqrts v0.4s, v0.4s, v4.4s347; CHECK-NEXT: fmul v3.4s, v3.4s, v5.4s348; CHECK-NEXT: fmul v4.4s, v3.4s, v3.4s349; CHECK-NEXT: frsqrts v1.4s, v1.4s, v4.4s350; CHECK-NEXT: fmul v0.4s, v2.4s, v0.4s351; CHECK-NEXT: fmul v1.4s, v3.4s, v1.4s352; CHECK-NEXT: ret353 %1 = tail call fast <8 x float> @llvm.sqrt.v8f32(<8 x float> %a)354 %2 = fdiv fast <8 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, %1355 ret <8 x float> %2356}357 358define double @drsqrt(double %a) {359; FAULT-LABEL: drsqrt:360; FAULT: // %bb.0:361; FAULT-NEXT: fsqrt d0, d0362; FAULT-NEXT: fmov d1, #1.00000000363; FAULT-NEXT: fdiv d0, d1, d0364; FAULT-NEXT: ret365;366; CHECK-LABEL: drsqrt:367; CHECK: // %bb.0:368; CHECK-NEXT: frsqrte d1, d0369; CHECK-NEXT: fmul d2, d1, d1370; CHECK-NEXT: frsqrts d2, d0, d2371; CHECK-NEXT: fmul d1, d1, d2372; CHECK-NEXT: fmul d2, d1, d1373; CHECK-NEXT: frsqrts d2, d0, d2374; CHECK-NEXT: fmul d1, d1, d2375; CHECK-NEXT: fmul d2, d1, d1376; CHECK-NEXT: frsqrts d0, d0, d2377; CHECK-NEXT: fmul d0, d1, d0378; CHECK-NEXT: ret379 %1 = tail call fast double @llvm.sqrt.f64(double %a)380 %2 = fdiv fast double 1.000000e+00, %1381 ret double %2382}383 384define <2 x double> @d2rsqrt(<2 x double> %a) {385; FAULT-LABEL: d2rsqrt:386; FAULT: // %bb.0:387; FAULT-NEXT: fsqrt v0.2d, v0.2d388; FAULT-NEXT: fmov v1.2d, #1.00000000389; FAULT-NEXT: fdiv v0.2d, v1.2d, v0.2d390; FAULT-NEXT: ret391;392; CHECK-LABEL: d2rsqrt:393; CHECK: // %bb.0:394; CHECK-NEXT: frsqrte v1.2d, v0.2d395; CHECK-NEXT: fmul v2.2d, v1.2d, v1.2d396; CHECK-NEXT: frsqrts v2.2d, v0.2d, v2.2d397; CHECK-NEXT: fmul v1.2d, v1.2d, v2.2d398; CHECK-NEXT: fmul v2.2d, v1.2d, v1.2d399; CHECK-NEXT: frsqrts v2.2d, v0.2d, v2.2d400; CHECK-NEXT: fmul v1.2d, v1.2d, v2.2d401; CHECK-NEXT: fmul v2.2d, v1.2d, v1.2d402; CHECK-NEXT: frsqrts v0.2d, v0.2d, v2.2d403; CHECK-NEXT: fmul v0.2d, v1.2d, v0.2d404; CHECK-NEXT: ret405 %1 = tail call fast <2 x double> @llvm.sqrt.v2f64(<2 x double> %a)406 %2 = fdiv fast <2 x double> <double 1.000000e+00, double 1.000000e+00>, %1407 ret <2 x double> %2408}409 410define <4 x double> @d4rsqrt(<4 x double> %a) #0 {411; FAULT-LABEL: d4rsqrt:412; FAULT: // %bb.0:413; FAULT-NEXT: fsqrt v0.2d, v0.2d414; FAULT-NEXT: fmov v2.2d, #1.00000000415; FAULT-NEXT: fsqrt v1.2d, v1.2d416; FAULT-NEXT: fdiv v0.2d, v2.2d, v0.2d417; FAULT-NEXT: fdiv v1.2d, v2.2d, v1.2d418; FAULT-NEXT: ret419;420; CHECK-LABEL: d4rsqrt:421; CHECK: // %bb.0:422; CHECK-NEXT: frsqrte v2.2d, v0.2d423; CHECK-NEXT: frsqrte v3.2d, v1.2d424; CHECK-NEXT: fmul v4.2d, v2.2d, v2.2d425; CHECK-NEXT: frsqrts v4.2d, v0.2d, v4.2d426; CHECK-NEXT: fmul v5.2d, v3.2d, v3.2d427; CHECK-NEXT: frsqrts v5.2d, v1.2d, v5.2d428; CHECK-NEXT: fmul v2.2d, v2.2d, v4.2d429; CHECK-NEXT: fmul v4.2d, v2.2d, v2.2d430; CHECK-NEXT: frsqrts v4.2d, v0.2d, v4.2d431; CHECK-NEXT: fmul v3.2d, v3.2d, v5.2d432; CHECK-NEXT: fmul v5.2d, v3.2d, v3.2d433; CHECK-NEXT: frsqrts v5.2d, v1.2d, v5.2d434; CHECK-NEXT: fmul v2.2d, v2.2d, v4.2d435; CHECK-NEXT: fmul v4.2d, v2.2d, v2.2d436; CHECK-NEXT: frsqrts v0.2d, v0.2d, v4.2d437; CHECK-NEXT: fmul v3.2d, v3.2d, v5.2d438; CHECK-NEXT: fmul v4.2d, v3.2d, v3.2d439; CHECK-NEXT: frsqrts v1.2d, v1.2d, v4.2d440; CHECK-NEXT: fmul v0.2d, v2.2d, v0.2d441; CHECK-NEXT: fmul v1.2d, v3.2d, v1.2d442; CHECK-NEXT: ret443 %1 = tail call fast <4 x double> @llvm.sqrt.v4f64(<4 x double> %a)444 %2 = fdiv fast <4 x double> <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00>, %1445 ret <4 x double> %2446}447 448define double @sqrt_fdiv_common_operand(double %x) nounwind {449; FAULT-LABEL: sqrt_fdiv_common_operand:450; FAULT: // %bb.0:451; FAULT-NEXT: fsqrt d0, d0452; FAULT-NEXT: ret453;454; CHECK-LABEL: sqrt_fdiv_common_operand:455; CHECK: // %bb.0:456; CHECK-NEXT: frsqrte d1, d0457; CHECK-NEXT: fmul d2, d1, d1458; CHECK-NEXT: frsqrts d2, d0, d2459; CHECK-NEXT: fmul d1, d1, d2460; CHECK-NEXT: fmul d2, d1, d1461; CHECK-NEXT: frsqrts d2, d0, d2462; CHECK-NEXT: fmul d1, d1, d2463; CHECK-NEXT: fmul d2, d1, d1464; CHECK-NEXT: frsqrts d2, d0, d2465; CHECK-NEXT: fmul d0, d0, d1466; CHECK-NEXT: fmul d0, d0, d2467; CHECK-NEXT: ret468 %sqrt = call fast double @llvm.sqrt.f64(double %x)469 %r = fdiv fast double %x, %sqrt470 ret double %r471}472 473define <2 x double> @sqrt_fdiv_common_operand_vec(<2 x double> %x) nounwind {474; FAULT-LABEL: sqrt_fdiv_common_operand_vec:475; FAULT: // %bb.0:476; FAULT-NEXT: fsqrt v0.2d, v0.2d477; FAULT-NEXT: ret478;479; CHECK-LABEL: sqrt_fdiv_common_operand_vec:480; CHECK: // %bb.0:481; CHECK-NEXT: frsqrte v1.2d, v0.2d482; CHECK-NEXT: fmul v2.2d, v1.2d, v1.2d483; CHECK-NEXT: frsqrts v2.2d, v0.2d, v2.2d484; CHECK-NEXT: fmul v1.2d, v1.2d, v2.2d485; CHECK-NEXT: fmul v2.2d, v1.2d, v1.2d486; CHECK-NEXT: frsqrts v2.2d, v0.2d, v2.2d487; CHECK-NEXT: fmul v1.2d, v1.2d, v2.2d488; CHECK-NEXT: fmul v2.2d, v1.2d, v1.2d489; CHECK-NEXT: frsqrts v2.2d, v0.2d, v2.2d490; CHECK-NEXT: fmul v0.2d, v0.2d, v1.2d491; CHECK-NEXT: fmul v0.2d, v0.2d, v2.2d492; CHECK-NEXT: ret493 %sqrt = call <2 x double> @llvm.sqrt.v2f64(<2 x double> %x)494 %r = fdiv arcp nsz reassoc <2 x double> %x, %sqrt495 ret <2 x double> %r496}497 498define double @sqrt_fdiv_common_operand_extra_use(double %x, ptr %p) nounwind {499; FAULT-LABEL: sqrt_fdiv_common_operand_extra_use:500; FAULT: // %bb.0:501; FAULT-NEXT: fsqrt d0, d0502; FAULT-NEXT: str d0, [x0]503; FAULT-NEXT: ret504;505; CHECK-LABEL: sqrt_fdiv_common_operand_extra_use:506; CHECK: // %bb.0:507; CHECK-NEXT: frsqrte d1, d0508; CHECK-NEXT: fcmp d0, #0.0509; CHECK-NEXT: fmul d2, d1, d1510; CHECK-NEXT: frsqrts d2, d0, d2511; CHECK-NEXT: fmul d1, d1, d2512; CHECK-NEXT: fmul d2, d1, d1513; CHECK-NEXT: frsqrts d2, d0, d2514; CHECK-NEXT: fmul d1, d1, d2515; CHECK-NEXT: fmul d2, d1, d1516; CHECK-NEXT: fmul d1, d0, d1517; CHECK-NEXT: frsqrts d2, d0, d2518; CHECK-NEXT: fmul d1, d1, d2519; CHECK-NEXT: fcsel d2, d0, d1, eq520; CHECK-NEXT: fmov d0, d1521; CHECK-NEXT: str d2, [x0]522; CHECK-NEXT: ret523 %sqrt = call fast double @llvm.sqrt.f64(double %x)524 store double %sqrt, ptr %p525 %r = fdiv fast double %x, %sqrt526 ret double %r527}528 529define double @sqrt_simplify_before_recip_3_uses(double %x, ptr %p1, ptr %p2) nounwind {530; FAULT-LABEL: sqrt_simplify_before_recip_3_uses:531; FAULT: // %bb.0:532; FAULT-NEXT: fsqrt d0, d0533; FAULT-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000534; FAULT-NEXT: fmov d1, #1.00000000535; FAULT-NEXT: fmov d2, x8536; FAULT-NEXT: fdiv d1, d1, d0537; FAULT-NEXT: fdiv d2, d2, d0538; FAULT-NEXT: str d1, [x0]539; FAULT-NEXT: str d2, [x1]540; FAULT-NEXT: ret541;542; CHECK-LABEL: sqrt_simplify_before_recip_3_uses:543; CHECK: // %bb.0:544; CHECK-NEXT: frsqrte d1, d0545; CHECK-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000546; CHECK-NEXT: fmul d2, d1, d1547; CHECK-NEXT: frsqrts d2, d0, d2548; CHECK-NEXT: fmul d1, d1, d2549; CHECK-NEXT: fmul d2, d1, d1550; CHECK-NEXT: frsqrts d2, d0, d2551; CHECK-NEXT: fmul d1, d1, d2552; CHECK-NEXT: fmul d2, d1, d1553; CHECK-NEXT: frsqrts d2, d0, d2554; CHECK-NEXT: fmul d1, d1, d2555; CHECK-NEXT: fmov d2, x8556; CHECK-NEXT: fmul d0, d0, d1557; CHECK-NEXT: fmul d2, d1, d2558; CHECK-NEXT: str d1, [x0]559; CHECK-NEXT: str d2, [x1]560; CHECK-NEXT: ret561 %sqrt = tail call fast double @llvm.sqrt.f64(double %x)562 %rsqrt = fdiv fast double 1.0, %sqrt563 %r = fdiv fast double 42.0, %sqrt564 %sqrt_fast = fdiv fast double %x, %sqrt565 store double %rsqrt, ptr %p1, align 8566 store double %r, ptr %p2, align 8567 ret double %sqrt_fast568}569 570define double @sqrt_simplify_before_recip_3_uses_order(double %x, ptr %p1, ptr %p2) nounwind {571; FAULT-LABEL: sqrt_simplify_before_recip_3_uses_order:572; FAULT: // %bb.0:573; FAULT-NEXT: fsqrt d0, d0574; FAULT-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000575; FAULT-NEXT: fmov d1, x8576; FAULT-NEXT: mov x8, #140737488355328 // =0x800000000000577; FAULT-NEXT: movk x8, #16453, lsl #48578; FAULT-NEXT: fmov d2, x8579; FAULT-NEXT: fdiv d1, d1, d0580; FAULT-NEXT: fdiv d2, d2, d0581; FAULT-NEXT: str d1, [x0]582; FAULT-NEXT: str d2, [x1]583; FAULT-NEXT: ret584;585; CHECK-LABEL: sqrt_simplify_before_recip_3_uses_order:586; CHECK: // %bb.0:587; CHECK-NEXT: frsqrte d1, d0588; CHECK-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000589; CHECK-NEXT: fmul d2, d1, d1590; CHECK-NEXT: frsqrts d2, d0, d2591; CHECK-NEXT: fmul d1, d1, d2592; CHECK-NEXT: fmul d2, d1, d1593; CHECK-NEXT: frsqrts d2, d0, d2594; CHECK-NEXT: fmul d1, d1, d2595; CHECK-NEXT: fmul d2, d1, d1596; CHECK-NEXT: frsqrts d2, d0, d2597; CHECK-NEXT: fmul d1, d1, d2598; CHECK-NEXT: fmov d2, x8599; CHECK-NEXT: mov x8, #140737488355328 // =0x800000000000600; CHECK-NEXT: movk x8, #16453, lsl #48601; CHECK-NEXT: fmov d3, x8602; CHECK-NEXT: fmul d0, d0, d1603; CHECK-NEXT: fmul d2, d1, d2604; CHECK-NEXT: fmul d1, d1, d3605; CHECK-NEXT: str d2, [x0]606; CHECK-NEXT: str d1, [x1]607; CHECK-NEXT: ret608 %sqrt = tail call fast double @llvm.sqrt.f64(double %x)609 %sqrt_fast = fdiv fast double %x, %sqrt610 %r1 = fdiv fast double 42.0, %sqrt611 %r2 = fdiv fast double 43.0, %sqrt612 store double %r1, ptr %p1, align 8613 store double %r2, ptr %p2, align 8614 ret double %sqrt_fast615}616 617 618define double @sqrt_simplify_before_recip_4_uses(double %x, ptr %p1, ptr %p2, ptr %p3) nounwind {619; FAULT-LABEL: sqrt_simplify_before_recip_4_uses:620; FAULT: // %bb.0:621; FAULT-NEXT: fsqrt d0, d0622; FAULT-NEXT: fmov d1, #1.00000000623; FAULT-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000624; FAULT-NEXT: fmov d2, x8625; FAULT-NEXT: mov x8, #140737488355328 // =0x800000000000626; FAULT-NEXT: movk x8, #16453, lsl #48627; FAULT-NEXT: fmov d3, x8628; FAULT-NEXT: fdiv d1, d1, d0629; FAULT-NEXT: fmul d2, d1, d2630; FAULT-NEXT: fmul d3, d1, d3631; FAULT-NEXT: str d1, [x0]632; FAULT-NEXT: str d2, [x1]633; FAULT-NEXT: str d3, [x2]634; FAULT-NEXT: ret635;636; CHECK-LABEL: sqrt_simplify_before_recip_4_uses:637; CHECK: // %bb.0:638; CHECK-NEXT: frsqrte d1, d0639; CHECK-NEXT: fcmp d0, #0.0640; CHECK-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000641; CHECK-NEXT: fmul d2, d1, d1642; CHECK-NEXT: frsqrts d2, d0, d2643; CHECK-NEXT: fmul d1, d1, d2644; CHECK-NEXT: fmul d2, d1, d1645; CHECK-NEXT: frsqrts d2, d0, d2646; CHECK-NEXT: fmul d1, d1, d2647; CHECK-NEXT: fmul d2, d1, d1648; CHECK-NEXT: frsqrts d2, d0, d2649; CHECK-NEXT: fmul d1, d1, d2650; CHECK-NEXT: fmul d2, d0, d1651; CHECK-NEXT: str d1, [x0]652; CHECK-NEXT: fcsel d2, d0, d2, eq653; CHECK-NEXT: fdiv d0, d0, d2654; CHECK-NEXT: fmov d2, x8655; CHECK-NEXT: mov x8, #140737488355328 // =0x800000000000656; CHECK-NEXT: movk x8, #16453, lsl #48657; CHECK-NEXT: fmov d3, x8658; CHECK-NEXT: fmul d2, d1, d2659; CHECK-NEXT: fmul d3, d1, d3660; CHECK-NEXT: str d2, [x1]661; CHECK-NEXT: str d3, [x2]662; CHECK-NEXT: ret663 %sqrt = tail call fast double @llvm.sqrt.f64(double %x)664 %rsqrt = fdiv fast double 1.0, %sqrt665 %r1 = fdiv fast double 42.0, %sqrt666 %r2 = fdiv fast double 43.0, %sqrt667 %sqrt_fast = fdiv fast double %x, %sqrt668 store double %rsqrt, ptr %p1, align 8669 store double %r1, ptr %p2, align 8670 store double %r2, ptr %p3, align 8671 ret double %sqrt_fast672}673 674attributes #0 = { "denormal-fp-math"="ieee" }675