779 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 --mattr=+f,-d,-frecipe < %s | FileCheck %s --check-prefix=LA32F3; RUN: llc --mtriple=loongarch32 --mattr=+f,-d,+frecipe < %s | FileCheck %s --check-prefix=LA32F-FRECIPE4; RUN: llc --mtriple=loongarch64 --mattr=+d,-frecipe < %s | FileCheck %s --check-prefix=LA64D5; RUN: llc --mtriple=loongarch64 --mattr=+d,+frecipe < %s | FileCheck %s --check-prefix=LA64D-FRECIPE6 7 8declare float @llvm.sqrt.f32(float)9declare double @llvm.sqrt.f64(double)10 11define float @frsqrt_f32(float %a) nounwind {12; LA32F-LABEL: frsqrt_f32:13; LA32F: # %bb.0:14; LA32F-NEXT: frsqrt.s $fa0, $fa015; LA32F-NEXT: ret16;17; LA32F-FRECIPE-LABEL: frsqrt_f32:18; LA32F-FRECIPE: # %bb.0:19; LA32F-FRECIPE-NEXT: frsqrte.s $fa1, $fa020; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa0, $fa121; LA32F-FRECIPE-NEXT: fmul.s $fa0, $fa0, $fa122; LA32F-FRECIPE-NEXT: lu12i.w $a0, -26112023; LA32F-FRECIPE-NEXT: movgr2fr.w $fa2, $a024; LA32F-FRECIPE-NEXT: fmadd.s $fa0, $fa0, $fa1, $fa225; LA32F-FRECIPE-NEXT: lu12i.w $a0, -26624026; LA32F-FRECIPE-NEXT: movgr2fr.w $fa2, $a027; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa228; LA32F-FRECIPE-NEXT: fmul.s $fa0, $fa1, $fa029; LA32F-FRECIPE-NEXT: ret30;31; LA64D-LABEL: frsqrt_f32:32; LA64D: # %bb.0:33; LA64D-NEXT: frsqrt.s $fa0, $fa034; LA64D-NEXT: ret35;36; LA64D-FRECIPE-LABEL: frsqrt_f32:37; LA64D-FRECIPE: # %bb.0:38; LA64D-FRECIPE-NEXT: frsqrte.s $fa1, $fa039; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa0, $fa140; LA64D-FRECIPE-NEXT: fmul.s $fa0, $fa0, $fa141; LA64D-FRECIPE-NEXT: vldi $vr2, -114442; LA64D-FRECIPE-NEXT: fmadd.s $fa0, $fa0, $fa1, $fa243; LA64D-FRECIPE-NEXT: vldi $vr2, -105644; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa245; LA64D-FRECIPE-NEXT: fmul.s $fa0, $fa1, $fa046; LA64D-FRECIPE-NEXT: ret47 48 %1 = call fast float @llvm.sqrt.f32(float %a)49 %2 = fdiv fast float 1.0, %150 ret float %251}52 53define double @frsqrt_f64(double %a) nounwind {54; LA32F-LABEL: frsqrt_f64:55; LA32F: # %bb.0:56; LA32F-NEXT: addi.w $sp, $sp, -1657; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill58; LA32F-NEXT: bl sqrt59; LA32F-NEXT: move $a2, $a060; LA32F-NEXT: move $a3, $a161; LA32F-NEXT: lu12i.w $a1, 26188862; LA32F-NEXT: move $a0, $zero63; LA32F-NEXT: bl __divdf364; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload65; LA32F-NEXT: addi.w $sp, $sp, 1666; LA32F-NEXT: ret67;68; LA32F-FRECIPE-LABEL: frsqrt_f64:69; LA32F-FRECIPE: # %bb.0:70; LA32F-FRECIPE-NEXT: addi.w $sp, $sp, -1671; LA32F-FRECIPE-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill72; LA32F-FRECIPE-NEXT: bl sqrt73; LA32F-FRECIPE-NEXT: move $a2, $a074; LA32F-FRECIPE-NEXT: move $a3, $a175; LA32F-FRECIPE-NEXT: lu12i.w $a1, 26188876; LA32F-FRECIPE-NEXT: move $a0, $zero77; LA32F-FRECIPE-NEXT: bl __divdf378; LA32F-FRECIPE-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload79; LA32F-FRECIPE-NEXT: addi.w $sp, $sp, 1680; LA32F-FRECIPE-NEXT: ret81;82; LA64D-LABEL: frsqrt_f64:83; LA64D: # %bb.0:84; LA64D-NEXT: frsqrt.d $fa0, $fa085; LA64D-NEXT: ret86;87; LA64D-FRECIPE-LABEL: frsqrt_f64:88; LA64D-FRECIPE: # %bb.0:89; LA64D-FRECIPE-NEXT: frsqrte.d $fa1, $fa090; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa0, $fa191; LA64D-FRECIPE-NEXT: fmul.d $fa2, $fa0, $fa192; LA64D-FRECIPE-NEXT: vldi $vr3, -88893; LA64D-FRECIPE-NEXT: fmadd.d $fa2, $fa2, $fa1, $fa394; LA64D-FRECIPE-NEXT: vldi $vr4, -80095; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa496; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa297; LA64D-FRECIPE-NEXT: fmul.d $fa0, $fa0, $fa198; LA64D-FRECIPE-NEXT: fmadd.d $fa0, $fa0, $fa1, $fa399; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa4100; LA64D-FRECIPE-NEXT: fmul.d $fa0, $fa1, $fa0101; LA64D-FRECIPE-NEXT: ret102 %1 = call fast double @llvm.sqrt.f64(double %a)103 %2 = fdiv fast double 1.0, %1104 ret double %2105}106 107define double @sqrt_simplify_before_recip_3_uses_f64(double %x, ptr %p1, ptr %p2) nounwind {108; LA32F-LABEL: sqrt_simplify_before_recip_3_uses_f64:109; LA32F: # %bb.0:110; LA32F-NEXT: addi.w $sp, $sp, -32111; LA32F-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill112; LA32F-NEXT: st.w $fp, $sp, 24 # 4-byte Folded Spill113; LA32F-NEXT: st.w $s0, $sp, 20 # 4-byte Folded Spill114; LA32F-NEXT: st.w $s1, $sp, 16 # 4-byte Folded Spill115; LA32F-NEXT: st.w $s2, $sp, 12 # 4-byte Folded Spill116; LA32F-NEXT: st.w $s3, $sp, 8 # 4-byte Folded Spill117; LA32F-NEXT: st.w $s4, $sp, 4 # 4-byte Folded Spill118; LA32F-NEXT: move $fp, $a3119; LA32F-NEXT: move $s0, $a2120; LA32F-NEXT: bl sqrt121; LA32F-NEXT: move $s1, $a0122; LA32F-NEXT: move $s2, $a1123; LA32F-NEXT: lu12i.w $a1, 261888124; LA32F-NEXT: move $a0, $zero125; LA32F-NEXT: move $a2, $s1126; LA32F-NEXT: move $a3, $s2127; LA32F-NEXT: bl __divdf3128; LA32F-NEXT: move $s3, $a0129; LA32F-NEXT: move $s4, $a1130; LA32F-NEXT: lu12i.w $a1, 263248131; LA32F-NEXT: move $a0, $zero132; LA32F-NEXT: move $a2, $s1133; LA32F-NEXT: move $a3, $s2134; LA32F-NEXT: bl __divdf3135; LA32F-NEXT: st.w $s3, $s0, 0136; LA32F-NEXT: st.w $s4, $s0, 4137; LA32F-NEXT: st.w $a0, $fp, 0138; LA32F-NEXT: st.w $a1, $fp, 4139; LA32F-NEXT: move $a0, $s1140; LA32F-NEXT: move $a1, $s2141; LA32F-NEXT: ld.w $s4, $sp, 4 # 4-byte Folded Reload142; LA32F-NEXT: ld.w $s3, $sp, 8 # 4-byte Folded Reload143; LA32F-NEXT: ld.w $s2, $sp, 12 # 4-byte Folded Reload144; LA32F-NEXT: ld.w $s1, $sp, 16 # 4-byte Folded Reload145; LA32F-NEXT: ld.w $s0, $sp, 20 # 4-byte Folded Reload146; LA32F-NEXT: ld.w $fp, $sp, 24 # 4-byte Folded Reload147; LA32F-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload148; LA32F-NEXT: addi.w $sp, $sp, 32149; LA32F-NEXT: ret150;151; LA32F-FRECIPE-LABEL: sqrt_simplify_before_recip_3_uses_f64:152; LA32F-FRECIPE: # %bb.0:153; LA32F-FRECIPE-NEXT: addi.w $sp, $sp, -32154; LA32F-FRECIPE-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill155; LA32F-FRECIPE-NEXT: st.w $fp, $sp, 24 # 4-byte Folded Spill156; LA32F-FRECIPE-NEXT: st.w $s0, $sp, 20 # 4-byte Folded Spill157; LA32F-FRECIPE-NEXT: st.w $s1, $sp, 16 # 4-byte Folded Spill158; LA32F-FRECIPE-NEXT: st.w $s2, $sp, 12 # 4-byte Folded Spill159; LA32F-FRECIPE-NEXT: st.w $s3, $sp, 8 # 4-byte Folded Spill160; LA32F-FRECIPE-NEXT: st.w $s4, $sp, 4 # 4-byte Folded Spill161; LA32F-FRECIPE-NEXT: move $fp, $a3162; LA32F-FRECIPE-NEXT: move $s0, $a2163; LA32F-FRECIPE-NEXT: bl sqrt164; LA32F-FRECIPE-NEXT: move $s1, $a0165; LA32F-FRECIPE-NEXT: move $s2, $a1166; LA32F-FRECIPE-NEXT: lu12i.w $a1, 261888167; LA32F-FRECIPE-NEXT: move $a0, $zero168; LA32F-FRECIPE-NEXT: move $a2, $s1169; LA32F-FRECIPE-NEXT: move $a3, $s2170; LA32F-FRECIPE-NEXT: bl __divdf3171; LA32F-FRECIPE-NEXT: move $s3, $a0172; LA32F-FRECIPE-NEXT: move $s4, $a1173; LA32F-FRECIPE-NEXT: lu12i.w $a1, 263248174; LA32F-FRECIPE-NEXT: move $a0, $zero175; LA32F-FRECIPE-NEXT: move $a2, $s1176; LA32F-FRECIPE-NEXT: move $a3, $s2177; LA32F-FRECIPE-NEXT: bl __divdf3178; LA32F-FRECIPE-NEXT: st.w $s3, $s0, 0179; LA32F-FRECIPE-NEXT: st.w $s4, $s0, 4180; LA32F-FRECIPE-NEXT: st.w $a0, $fp, 0181; LA32F-FRECIPE-NEXT: st.w $a1, $fp, 4182; LA32F-FRECIPE-NEXT: move $a0, $s1183; LA32F-FRECIPE-NEXT: move $a1, $s2184; LA32F-FRECIPE-NEXT: ld.w $s4, $sp, 4 # 4-byte Folded Reload185; LA32F-FRECIPE-NEXT: ld.w $s3, $sp, 8 # 4-byte Folded Reload186; LA32F-FRECIPE-NEXT: ld.w $s2, $sp, 12 # 4-byte Folded Reload187; LA32F-FRECIPE-NEXT: ld.w $s1, $sp, 16 # 4-byte Folded Reload188; LA32F-FRECIPE-NEXT: ld.w $s0, $sp, 20 # 4-byte Folded Reload189; LA32F-FRECIPE-NEXT: ld.w $fp, $sp, 24 # 4-byte Folded Reload190; LA32F-FRECIPE-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload191; LA32F-FRECIPE-NEXT: addi.w $sp, $sp, 32192; LA32F-FRECIPE-NEXT: ret193;194; LA64D-LABEL: sqrt_simplify_before_recip_3_uses_f64:195; LA64D: # %bb.0:196; LA64D-NEXT: pcalau12i $a2, %pc_hi20(.LCPI2_0)197; LA64D-NEXT: fld.d $fa2, $a2, %pc_lo12(.LCPI2_0)198; LA64D-NEXT: fsqrt.d $fa1, $fa0199; LA64D-NEXT: frsqrt.d $fa0, $fa0200; LA64D-NEXT: fdiv.d $fa2, $fa2, $fa1201; LA64D-NEXT: fst.d $fa0, $a0, 0202; LA64D-NEXT: fst.d $fa2, $a1, 0203; LA64D-NEXT: fmov.d $fa0, $fa1204; LA64D-NEXT: ret205;206; LA64D-FRECIPE-LABEL: sqrt_simplify_before_recip_3_uses_f64:207; LA64D-FRECIPE: # %bb.0:208; LA64D-FRECIPE-NEXT: frsqrte.d $fa1, $fa0209; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa0, $fa1210; LA64D-FRECIPE-NEXT: fmul.d $fa2, $fa0, $fa1211; LA64D-FRECIPE-NEXT: vldi $vr3, -888212; LA64D-FRECIPE-NEXT: fmadd.d $fa2, $fa2, $fa1, $fa3213; LA64D-FRECIPE-NEXT: vldi $vr4, -800214; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa4215; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa2216; LA64D-FRECIPE-NEXT: fmul.d $fa2, $fa0, $fa1217; LA64D-FRECIPE-NEXT: pcalau12i $a2, %pc_hi20(.LCPI2_0)218; LA64D-FRECIPE-NEXT: fld.d $fa5, $a2, %pc_lo12(.LCPI2_0)219; LA64D-FRECIPE-NEXT: fmadd.d $fa2, $fa2, $fa1, $fa3220; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa4221; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa2222; LA64D-FRECIPE-NEXT: fmul.d $fa2, $fa1, $fa5223; LA64D-FRECIPE-NEXT: fmul.d $fa0, $fa0, $fa1224; LA64D-FRECIPE-NEXT: fst.d $fa1, $a0, 0225; LA64D-FRECIPE-NEXT: fst.d $fa2, $a1, 0226; LA64D-FRECIPE-NEXT: ret227 %sqrt = tail call fast double @llvm.sqrt.f64(double %x)228 %rsqrt = fdiv fast double 1.0, %sqrt229 %r = fdiv fast double 42.0, %sqrt230 %sqrt_fast = fdiv fast double %x, %sqrt231 store double %rsqrt, ptr %p1, align 8232 store double %r, ptr %p2, align 8233 ret double %sqrt_fast234}235 236 237define double @sqrt_simplify_before_recip_3_uses_order_f64(double %x, ptr %p1, ptr %p2) nounwind {238; LA32F-LABEL: sqrt_simplify_before_recip_3_uses_order_f64:239; LA32F: # %bb.0:240; LA32F-NEXT: addi.w $sp, $sp, -32241; LA32F-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill242; LA32F-NEXT: st.w $fp, $sp, 24 # 4-byte Folded Spill243; LA32F-NEXT: st.w $s0, $sp, 20 # 4-byte Folded Spill244; LA32F-NEXT: st.w $s1, $sp, 16 # 4-byte Folded Spill245; LA32F-NEXT: st.w $s2, $sp, 12 # 4-byte Folded Spill246; LA32F-NEXT: st.w $s3, $sp, 8 # 4-byte Folded Spill247; LA32F-NEXT: st.w $s4, $sp, 4 # 4-byte Folded Spill248; LA32F-NEXT: move $fp, $a3249; LA32F-NEXT: move $s0, $a2250; LA32F-NEXT: bl sqrt251; LA32F-NEXT: move $s1, $a0252; LA32F-NEXT: move $s2, $a1253; LA32F-NEXT: lu12i.w $a1, 263248254; LA32F-NEXT: move $a0, $zero255; LA32F-NEXT: move $a2, $s1256; LA32F-NEXT: move $a3, $s2257; LA32F-NEXT: bl __divdf3258; LA32F-NEXT: move $s3, $a0259; LA32F-NEXT: move $s4, $a1260; LA32F-NEXT: lu12i.w $a1, 263256261; LA32F-NEXT: move $a0, $zero262; LA32F-NEXT: move $a2, $s1263; LA32F-NEXT: move $a3, $s2264; LA32F-NEXT: bl __divdf3265; LA32F-NEXT: st.w $s3, $s0, 0266; LA32F-NEXT: st.w $s4, $s0, 4267; LA32F-NEXT: st.w $a0, $fp, 0268; LA32F-NEXT: st.w $a1, $fp, 4269; LA32F-NEXT: move $a0, $s1270; LA32F-NEXT: move $a1, $s2271; LA32F-NEXT: ld.w $s4, $sp, 4 # 4-byte Folded Reload272; LA32F-NEXT: ld.w $s3, $sp, 8 # 4-byte Folded Reload273; LA32F-NEXT: ld.w $s2, $sp, 12 # 4-byte Folded Reload274; LA32F-NEXT: ld.w $s1, $sp, 16 # 4-byte Folded Reload275; LA32F-NEXT: ld.w $s0, $sp, 20 # 4-byte Folded Reload276; LA32F-NEXT: ld.w $fp, $sp, 24 # 4-byte Folded Reload277; LA32F-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload278; LA32F-NEXT: addi.w $sp, $sp, 32279; LA32F-NEXT: ret280;281; LA32F-FRECIPE-LABEL: sqrt_simplify_before_recip_3_uses_order_f64:282; LA32F-FRECIPE: # %bb.0:283; LA32F-FRECIPE-NEXT: addi.w $sp, $sp, -32284; LA32F-FRECIPE-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill285; LA32F-FRECIPE-NEXT: st.w $fp, $sp, 24 # 4-byte Folded Spill286; LA32F-FRECIPE-NEXT: st.w $s0, $sp, 20 # 4-byte Folded Spill287; LA32F-FRECIPE-NEXT: st.w $s1, $sp, 16 # 4-byte Folded Spill288; LA32F-FRECIPE-NEXT: st.w $s2, $sp, 12 # 4-byte Folded Spill289; LA32F-FRECIPE-NEXT: st.w $s3, $sp, 8 # 4-byte Folded Spill290; LA32F-FRECIPE-NEXT: st.w $s4, $sp, 4 # 4-byte Folded Spill291; LA32F-FRECIPE-NEXT: move $fp, $a3292; LA32F-FRECIPE-NEXT: move $s0, $a2293; LA32F-FRECIPE-NEXT: bl sqrt294; LA32F-FRECIPE-NEXT: move $s1, $a0295; LA32F-FRECIPE-NEXT: move $s2, $a1296; LA32F-FRECIPE-NEXT: lu12i.w $a1, 263248297; LA32F-FRECIPE-NEXT: move $a0, $zero298; LA32F-FRECIPE-NEXT: move $a2, $s1299; LA32F-FRECIPE-NEXT: move $a3, $s2300; LA32F-FRECIPE-NEXT: bl __divdf3301; LA32F-FRECIPE-NEXT: move $s3, $a0302; LA32F-FRECIPE-NEXT: move $s4, $a1303; LA32F-FRECIPE-NEXT: lu12i.w $a1, 263256304; LA32F-FRECIPE-NEXT: move $a0, $zero305; LA32F-FRECIPE-NEXT: move $a2, $s1306; LA32F-FRECIPE-NEXT: move $a3, $s2307; LA32F-FRECIPE-NEXT: bl __divdf3308; LA32F-FRECIPE-NEXT: st.w $s3, $s0, 0309; LA32F-FRECIPE-NEXT: st.w $s4, $s0, 4310; LA32F-FRECIPE-NEXT: st.w $a0, $fp, 0311; LA32F-FRECIPE-NEXT: st.w $a1, $fp, 4312; LA32F-FRECIPE-NEXT: move $a0, $s1313; LA32F-FRECIPE-NEXT: move $a1, $s2314; LA32F-FRECIPE-NEXT: ld.w $s4, $sp, 4 # 4-byte Folded Reload315; LA32F-FRECIPE-NEXT: ld.w $s3, $sp, 8 # 4-byte Folded Reload316; LA32F-FRECIPE-NEXT: ld.w $s2, $sp, 12 # 4-byte Folded Reload317; LA32F-FRECIPE-NEXT: ld.w $s1, $sp, 16 # 4-byte Folded Reload318; LA32F-FRECIPE-NEXT: ld.w $s0, $sp, 20 # 4-byte Folded Reload319; LA32F-FRECIPE-NEXT: ld.w $fp, $sp, 24 # 4-byte Folded Reload320; LA32F-FRECIPE-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload321; LA32F-FRECIPE-NEXT: addi.w $sp, $sp, 32322; LA32F-FRECIPE-NEXT: ret323;324; LA64D-LABEL: sqrt_simplify_before_recip_3_uses_order_f64:325; LA64D: # %bb.0:326; LA64D-NEXT: pcalau12i $a2, %pc_hi20(.LCPI3_0)327; LA64D-NEXT: fld.d $fa1, $a2, %pc_lo12(.LCPI3_0)328; LA64D-NEXT: pcalau12i $a2, %pc_hi20(.LCPI3_1)329; LA64D-NEXT: fld.d $fa2, $a2, %pc_lo12(.LCPI3_1)330; LA64D-NEXT: fsqrt.d $fa0, $fa0331; LA64D-NEXT: fdiv.d $fa1, $fa1, $fa0332; LA64D-NEXT: fdiv.d $fa2, $fa2, $fa0333; LA64D-NEXT: fst.d $fa1, $a0, 0334; LA64D-NEXT: fst.d $fa2, $a1, 0335; LA64D-NEXT: ret336;337; LA64D-FRECIPE-LABEL: sqrt_simplify_before_recip_3_uses_order_f64:338; LA64D-FRECIPE: # %bb.0:339; LA64D-FRECIPE-NEXT: frsqrte.d $fa1, $fa0340; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa0, $fa1341; LA64D-FRECIPE-NEXT: fmul.d $fa2, $fa0, $fa1342; LA64D-FRECIPE-NEXT: vldi $vr3, -888343; LA64D-FRECIPE-NEXT: fmadd.d $fa2, $fa2, $fa1, $fa3344; LA64D-FRECIPE-NEXT: vldi $vr4, -800345; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa4346; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa2347; LA64D-FRECIPE-NEXT: fmul.d $fa2, $fa0, $fa1348; LA64D-FRECIPE-NEXT: fmadd.d $fa2, $fa2, $fa1, $fa3349; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa4350; LA64D-FRECIPE-NEXT: pcalau12i $a2, %pc_hi20(.LCPI3_0)351; LA64D-FRECIPE-NEXT: fld.d $fa3, $a2, %pc_lo12(.LCPI3_0)352; LA64D-FRECIPE-NEXT: pcalau12i $a2, %pc_hi20(.LCPI3_1)353; LA64D-FRECIPE-NEXT: fld.d $fa4, $a2, %pc_lo12(.LCPI3_1)354; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa2355; LA64D-FRECIPE-NEXT: fmul.d $fa0, $fa0, $fa1356; LA64D-FRECIPE-NEXT: fmul.d $fa2, $fa1, $fa3357; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa4358; LA64D-FRECIPE-NEXT: fst.d $fa2, $a0, 0359; LA64D-FRECIPE-NEXT: fst.d $fa1, $a1, 0360; LA64D-FRECIPE-NEXT: ret361 %sqrt = tail call fast double @llvm.sqrt.f64(double %x)362 %sqrt_fast = fdiv fast double %x, %sqrt363 %r1 = fdiv fast double 42.0, %sqrt364 %r2 = fdiv fast double 43.0, %sqrt365 store double %r1, ptr %p1, align 8366 store double %r2, ptr %p2, align 8367 ret double %sqrt_fast368}369 370define double @sqrt_simplify_before_recip_4_uses_f64(double %x, ptr %p1, ptr %p2, ptr %p3) nounwind {371; LA32F-LABEL: sqrt_simplify_before_recip_4_uses_f64:372; LA32F: # %bb.0:373; LA32F-NEXT: addi.w $sp, $sp, -48374; LA32F-NEXT: st.w $ra, $sp, 44 # 4-byte Folded Spill375; LA32F-NEXT: st.w $fp, $sp, 40 # 4-byte Folded Spill376; LA32F-NEXT: st.w $s0, $sp, 36 # 4-byte Folded Spill377; LA32F-NEXT: st.w $s1, $sp, 32 # 4-byte Folded Spill378; LA32F-NEXT: st.w $s2, $sp, 28 # 4-byte Folded Spill379; LA32F-NEXT: st.w $s3, $sp, 24 # 4-byte Folded Spill380; LA32F-NEXT: st.w $s4, $sp, 20 # 4-byte Folded Spill381; LA32F-NEXT: st.w $s5, $sp, 16 # 4-byte Folded Spill382; LA32F-NEXT: st.w $s6, $sp, 12 # 4-byte Folded Spill383; LA32F-NEXT: st.w $s7, $sp, 8 # 4-byte Folded Spill384; LA32F-NEXT: move $fp, $a4385; LA32F-NEXT: move $s0, $a3386; LA32F-NEXT: move $s1, $a2387; LA32F-NEXT: bl sqrt388; LA32F-NEXT: move $s2, $a0389; LA32F-NEXT: move $s3, $a1390; LA32F-NEXT: lu12i.w $a1, 261888391; LA32F-NEXT: move $a0, $zero392; LA32F-NEXT: move $a2, $s2393; LA32F-NEXT: move $a3, $s3394; LA32F-NEXT: bl __divdf3395; LA32F-NEXT: move $s4, $a0396; LA32F-NEXT: move $s5, $a1397; LA32F-NEXT: lu12i.w $a1, 263248398; LA32F-NEXT: move $a0, $zero399; LA32F-NEXT: move $a2, $s2400; LA32F-NEXT: move $a3, $s3401; LA32F-NEXT: bl __divdf3402; LA32F-NEXT: move $s6, $a0403; LA32F-NEXT: move $s7, $a1404; LA32F-NEXT: lu12i.w $a1, 263256405; LA32F-NEXT: move $a0, $zero406; LA32F-NEXT: move $a2, $s2407; LA32F-NEXT: move $a3, $s3408; LA32F-NEXT: bl __divdf3409; LA32F-NEXT: st.w $s4, $s1, 0410; LA32F-NEXT: st.w $s5, $s1, 4411; LA32F-NEXT: st.w $s6, $s0, 0412; LA32F-NEXT: st.w $s7, $s0, 4413; LA32F-NEXT: st.w $a0, $fp, 0414; LA32F-NEXT: st.w $a1, $fp, 4415; LA32F-NEXT: move $a0, $s2416; LA32F-NEXT: move $a1, $s3417; LA32F-NEXT: ld.w $s7, $sp, 8 # 4-byte Folded Reload418; LA32F-NEXT: ld.w $s6, $sp, 12 # 4-byte Folded Reload419; LA32F-NEXT: ld.w $s5, $sp, 16 # 4-byte Folded Reload420; LA32F-NEXT: ld.w $s4, $sp, 20 # 4-byte Folded Reload421; LA32F-NEXT: ld.w $s3, $sp, 24 # 4-byte Folded Reload422; LA32F-NEXT: ld.w $s2, $sp, 28 # 4-byte Folded Reload423; LA32F-NEXT: ld.w $s1, $sp, 32 # 4-byte Folded Reload424; LA32F-NEXT: ld.w $s0, $sp, 36 # 4-byte Folded Reload425; LA32F-NEXT: ld.w $fp, $sp, 40 # 4-byte Folded Reload426; LA32F-NEXT: ld.w $ra, $sp, 44 # 4-byte Folded Reload427; LA32F-NEXT: addi.w $sp, $sp, 48428; LA32F-NEXT: ret429;430; LA32F-FRECIPE-LABEL: sqrt_simplify_before_recip_4_uses_f64:431; LA32F-FRECIPE: # %bb.0:432; LA32F-FRECIPE-NEXT: addi.w $sp, $sp, -48433; LA32F-FRECIPE-NEXT: st.w $ra, $sp, 44 # 4-byte Folded Spill434; LA32F-FRECIPE-NEXT: st.w $fp, $sp, 40 # 4-byte Folded Spill435; LA32F-FRECIPE-NEXT: st.w $s0, $sp, 36 # 4-byte Folded Spill436; LA32F-FRECIPE-NEXT: st.w $s1, $sp, 32 # 4-byte Folded Spill437; LA32F-FRECIPE-NEXT: st.w $s2, $sp, 28 # 4-byte Folded Spill438; LA32F-FRECIPE-NEXT: st.w $s3, $sp, 24 # 4-byte Folded Spill439; LA32F-FRECIPE-NEXT: st.w $s4, $sp, 20 # 4-byte Folded Spill440; LA32F-FRECIPE-NEXT: st.w $s5, $sp, 16 # 4-byte Folded Spill441; LA32F-FRECIPE-NEXT: st.w $s6, $sp, 12 # 4-byte Folded Spill442; LA32F-FRECIPE-NEXT: st.w $s7, $sp, 8 # 4-byte Folded Spill443; LA32F-FRECIPE-NEXT: move $fp, $a4444; LA32F-FRECIPE-NEXT: move $s0, $a3445; LA32F-FRECIPE-NEXT: move $s1, $a2446; LA32F-FRECIPE-NEXT: bl sqrt447; LA32F-FRECIPE-NEXT: move $s2, $a0448; LA32F-FRECIPE-NEXT: move $s3, $a1449; LA32F-FRECIPE-NEXT: lu12i.w $a1, 261888450; LA32F-FRECIPE-NEXT: move $a0, $zero451; LA32F-FRECIPE-NEXT: move $a2, $s2452; LA32F-FRECIPE-NEXT: move $a3, $s3453; LA32F-FRECIPE-NEXT: bl __divdf3454; LA32F-FRECIPE-NEXT: move $s4, $a0455; LA32F-FRECIPE-NEXT: move $s5, $a1456; LA32F-FRECIPE-NEXT: lu12i.w $a1, 263248457; LA32F-FRECIPE-NEXT: move $a0, $zero458; LA32F-FRECIPE-NEXT: move $a2, $s2459; LA32F-FRECIPE-NEXT: move $a3, $s3460; LA32F-FRECIPE-NEXT: bl __divdf3461; LA32F-FRECIPE-NEXT: move $s6, $a0462; LA32F-FRECIPE-NEXT: move $s7, $a1463; LA32F-FRECIPE-NEXT: lu12i.w $a1, 263256464; LA32F-FRECIPE-NEXT: move $a0, $zero465; LA32F-FRECIPE-NEXT: move $a2, $s2466; LA32F-FRECIPE-NEXT: move $a3, $s3467; LA32F-FRECIPE-NEXT: bl __divdf3468; LA32F-FRECIPE-NEXT: st.w $s4, $s1, 0469; LA32F-FRECIPE-NEXT: st.w $s5, $s1, 4470; LA32F-FRECIPE-NEXT: st.w $s6, $s0, 0471; LA32F-FRECIPE-NEXT: st.w $s7, $s0, 4472; LA32F-FRECIPE-NEXT: st.w $a0, $fp, 0473; LA32F-FRECIPE-NEXT: st.w $a1, $fp, 4474; LA32F-FRECIPE-NEXT: move $a0, $s2475; LA32F-FRECIPE-NEXT: move $a1, $s3476; LA32F-FRECIPE-NEXT: ld.w $s7, $sp, 8 # 4-byte Folded Reload477; LA32F-FRECIPE-NEXT: ld.w $s6, $sp, 12 # 4-byte Folded Reload478; LA32F-FRECIPE-NEXT: ld.w $s5, $sp, 16 # 4-byte Folded Reload479; LA32F-FRECIPE-NEXT: ld.w $s4, $sp, 20 # 4-byte Folded Reload480; LA32F-FRECIPE-NEXT: ld.w $s3, $sp, 24 # 4-byte Folded Reload481; LA32F-FRECIPE-NEXT: ld.w $s2, $sp, 28 # 4-byte Folded Reload482; LA32F-FRECIPE-NEXT: ld.w $s1, $sp, 32 # 4-byte Folded Reload483; LA32F-FRECIPE-NEXT: ld.w $s0, $sp, 36 # 4-byte Folded Reload484; LA32F-FRECIPE-NEXT: ld.w $fp, $sp, 40 # 4-byte Folded Reload485; LA32F-FRECIPE-NEXT: ld.w $ra, $sp, 44 # 4-byte Folded Reload486; LA32F-FRECIPE-NEXT: addi.w $sp, $sp, 48487; LA32F-FRECIPE-NEXT: ret488;489; LA64D-LABEL: sqrt_simplify_before_recip_4_uses_f64:490; LA64D: # %bb.0:491; LA64D-NEXT: pcalau12i $a3, %pc_hi20(.LCPI4_0)492; LA64D-NEXT: fld.d $fa2, $a3, %pc_lo12(.LCPI4_0)493; LA64D-NEXT: pcalau12i $a3, %pc_hi20(.LCPI4_1)494; LA64D-NEXT: fld.d $fa3, $a3, %pc_lo12(.LCPI4_1)495; LA64D-NEXT: fsqrt.d $fa1, $fa0496; LA64D-NEXT: frsqrt.d $fa0, $fa0497; LA64D-NEXT: fdiv.d $fa2, $fa2, $fa1498; LA64D-NEXT: fdiv.d $fa3, $fa3, $fa1499; LA64D-NEXT: fst.d $fa0, $a0, 0500; LA64D-NEXT: fst.d $fa2, $a1, 0501; LA64D-NEXT: fst.d $fa3, $a2, 0502; LA64D-NEXT: fmov.d $fa0, $fa1503; LA64D-NEXT: ret504;505; LA64D-FRECIPE-LABEL: sqrt_simplify_before_recip_4_uses_f64:506; LA64D-FRECIPE: # %bb.0:507; LA64D-FRECIPE-NEXT: frsqrte.d $fa1, $fa0508; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa0, $fa1509; LA64D-FRECIPE-NEXT: fmul.d $fa2, $fa0, $fa1510; LA64D-FRECIPE-NEXT: vldi $vr3, -888511; LA64D-FRECIPE-NEXT: fmadd.d $fa2, $fa2, $fa1, $fa3512; LA64D-FRECIPE-NEXT: vldi $vr4, -800513; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa4514; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa2515; LA64D-FRECIPE-NEXT: fmul.d $fa2, $fa0, $fa1516; LA64D-FRECIPE-NEXT: fmadd.d $fa2, $fa2, $fa1, $fa3517; LA64D-FRECIPE-NEXT: pcalau12i $a3, %pc_hi20(.LCPI4_0)518; LA64D-FRECIPE-NEXT: fld.d $fa3, $a3, %pc_lo12(.LCPI4_0)519; LA64D-FRECIPE-NEXT: pcalau12i $a3, %pc_hi20(.LCPI4_1)520; LA64D-FRECIPE-NEXT: fld.d $fa5, $a3, %pc_lo12(.LCPI4_1)521; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa4522; LA64D-FRECIPE-NEXT: fmul.d $fa1, $fa1, $fa2523; LA64D-FRECIPE-NEXT: fmul.d $fa2, $fa1, $fa3524; LA64D-FRECIPE-NEXT: fmul.d $fa3, $fa1, $fa5525; LA64D-FRECIPE-NEXT: fmul.d $fa0, $fa0, $fa1526; LA64D-FRECIPE-NEXT: fst.d $fa1, $a0, 0527; LA64D-FRECIPE-NEXT: fst.d $fa2, $a1, 0528; LA64D-FRECIPE-NEXT: fst.d $fa3, $a2, 0529; LA64D-FRECIPE-NEXT: ret530 %sqrt = tail call fast double @llvm.sqrt.f64(double %x)531 %rsqrt = fdiv fast double 1.0, %sqrt532 %r1 = fdiv fast double 42.0, %sqrt533 %r2 = fdiv fast double 43.0, %sqrt534 %sqrt_fast = fdiv fast double %x, %sqrt535 store double %rsqrt, ptr %p1, align 8536 store double %r1, ptr %p2, align 8537 store double %r2, ptr %p3, align 8538 ret double %sqrt_fast539}540 541define float @sqrt_simplify_before_recip_3_uses_f32(float %x, ptr %p1, ptr %p2) nounwind {542; LA32F-LABEL: sqrt_simplify_before_recip_3_uses_f32:543; LA32F: # %bb.0:544; LA32F-NEXT: fsqrt.s $fa1, $fa0545; LA32F-NEXT: frsqrt.s $fa0, $fa0546; LA32F-NEXT: lu12i.w $a2, 270976547; LA32F-NEXT: movgr2fr.w $fa2, $a2548; LA32F-NEXT: fdiv.s $fa2, $fa2, $fa1549; LA32F-NEXT: fst.s $fa0, $a0, 0550; LA32F-NEXT: fst.s $fa2, $a1, 0551; LA32F-NEXT: fmov.s $fa0, $fa1552; LA32F-NEXT: ret553;554; LA32F-FRECIPE-LABEL: sqrt_simplify_before_recip_3_uses_f32:555; LA32F-FRECIPE: # %bb.0:556; LA32F-FRECIPE-NEXT: frsqrte.s $fa1, $fa0557; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa0, $fa1558; LA32F-FRECIPE-NEXT: fmul.s $fa2, $fa0, $fa1559; LA32F-FRECIPE-NEXT: lu12i.w $a2, -261120560; LA32F-FRECIPE-NEXT: movgr2fr.w $fa3, $a2561; LA32F-FRECIPE-NEXT: fmadd.s $fa2, $fa2, $fa1, $fa3562; LA32F-FRECIPE-NEXT: lu12i.w $a2, -266240563; LA32F-FRECIPE-NEXT: movgr2fr.w $fa3, $a2564; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa3565; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa2566; LA32F-FRECIPE-NEXT: lu12i.w $a2, 270976567; LA32F-FRECIPE-NEXT: movgr2fr.w $fa2, $a2568; LA32F-FRECIPE-NEXT: fmul.s $fa2, $fa1, $fa2569; LA32F-FRECIPE-NEXT: fmul.s $fa0, $fa0, $fa1570; LA32F-FRECIPE-NEXT: fst.s $fa1, $a0, 0571; LA32F-FRECIPE-NEXT: fst.s $fa2, $a1, 0572; LA32F-FRECIPE-NEXT: ret573;574; LA64D-LABEL: sqrt_simplify_before_recip_3_uses_f32:575; LA64D: # %bb.0:576; LA64D-NEXT: fsqrt.s $fa1, $fa0577; LA64D-NEXT: frsqrt.s $fa0, $fa0578; LA64D-NEXT: lu12i.w $a2, 270976579; LA64D-NEXT: movgr2fr.w $fa2, $a2580; LA64D-NEXT: fdiv.s $fa2, $fa2, $fa1581; LA64D-NEXT: fst.s $fa0, $a0, 0582; LA64D-NEXT: fst.s $fa2, $a1, 0583; LA64D-NEXT: fmov.s $fa0, $fa1584; LA64D-NEXT: ret585;586; LA64D-FRECIPE-LABEL: sqrt_simplify_before_recip_3_uses_f32:587; LA64D-FRECIPE: # %bb.0:588; LA64D-FRECIPE-NEXT: frsqrte.s $fa1, $fa0589; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa0, $fa1590; LA64D-FRECIPE-NEXT: fmul.s $fa2, $fa0, $fa1591; LA64D-FRECIPE-NEXT: vldi $vr3, -1144592; LA64D-FRECIPE-NEXT: fmadd.s $fa2, $fa2, $fa1, $fa3593; LA64D-FRECIPE-NEXT: vldi $vr3, -1056594; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa3595; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa2596; LA64D-FRECIPE-NEXT: lu12i.w $a2, 270976597; LA64D-FRECIPE-NEXT: movgr2fr.w $fa2, $a2598; LA64D-FRECIPE-NEXT: fmul.s $fa2, $fa1, $fa2599; LA64D-FRECIPE-NEXT: fmul.s $fa0, $fa0, $fa1600; LA64D-FRECIPE-NEXT: fst.s $fa1, $a0, 0601; LA64D-FRECIPE-NEXT: fst.s $fa2, $a1, 0602; LA64D-FRECIPE-NEXT: ret603 %sqrt = tail call fast float @llvm.sqrt.f32(float %x)604 %rsqrt = fdiv fast float 1.0, %sqrt605 %r = fdiv fast float 42.0, %sqrt606 %sqrt_fast = fdiv fast float %x, %sqrt607 store float %rsqrt, ptr %p1, align 8608 store float %r, ptr %p2, align 8609 ret float %sqrt_fast610}611 612define float @sqrt_simplify_before_recip_4_uses_f32(float %x, ptr %p1, ptr %p2, ptr %p3) nounwind {613; LA32F-LABEL: sqrt_simplify_before_recip_4_uses_f32:614; LA32F: # %bb.0:615; LA32F-NEXT: fsqrt.s $fa1, $fa0616; LA32F-NEXT: frsqrt.s $fa0, $fa0617; LA32F-NEXT: lu12i.w $a3, 270976618; LA32F-NEXT: movgr2fr.w $fa2, $a3619; LA32F-NEXT: fdiv.s $fa2, $fa2, $fa1620; LA32F-NEXT: lu12i.w $a3, 271040621; LA32F-NEXT: movgr2fr.w $fa3, $a3622; LA32F-NEXT: fdiv.s $fa3, $fa3, $fa1623; LA32F-NEXT: fst.s $fa0, $a0, 0624; LA32F-NEXT: fst.s $fa2, $a1, 0625; LA32F-NEXT: fst.s $fa3, $a2, 0626; LA32F-NEXT: fmov.s $fa0, $fa1627; LA32F-NEXT: ret628;629; LA32F-FRECIPE-LABEL: sqrt_simplify_before_recip_4_uses_f32:630; LA32F-FRECIPE: # %bb.0:631; LA32F-FRECIPE-NEXT: frsqrte.s $fa1, $fa0632; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa0, $fa1633; LA32F-FRECIPE-NEXT: fmul.s $fa2, $fa0, $fa1634; LA32F-FRECIPE-NEXT: lu12i.w $a3, -261120635; LA32F-FRECIPE-NEXT: movgr2fr.w $fa3, $a3636; LA32F-FRECIPE-NEXT: fmadd.s $fa2, $fa2, $fa1, $fa3637; LA32F-FRECIPE-NEXT: lu12i.w $a3, -266240638; LA32F-FRECIPE-NEXT: movgr2fr.w $fa3, $a3639; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa3640; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa2641; LA32F-FRECIPE-NEXT: lu12i.w $a3, 270976642; LA32F-FRECIPE-NEXT: movgr2fr.w $fa2, $a3643; LA32F-FRECIPE-NEXT: fmul.s $fa2, $fa1, $fa2644; LA32F-FRECIPE-NEXT: lu12i.w $a3, 271040645; LA32F-FRECIPE-NEXT: movgr2fr.w $fa3, $a3646; LA32F-FRECIPE-NEXT: fmul.s $fa3, $fa1, $fa3647; LA32F-FRECIPE-NEXT: fmul.s $fa0, $fa0, $fa1648; LA32F-FRECIPE-NEXT: fst.s $fa1, $a0, 0649; LA32F-FRECIPE-NEXT: fst.s $fa2, $a1, 0650; LA32F-FRECIPE-NEXT: fst.s $fa3, $a2, 0651; LA32F-FRECIPE-NEXT: ret652;653; LA64D-LABEL: sqrt_simplify_before_recip_4_uses_f32:654; LA64D: # %bb.0:655; LA64D-NEXT: fsqrt.s $fa1, $fa0656; LA64D-NEXT: frsqrt.s $fa0, $fa0657; LA64D-NEXT: lu12i.w $a3, 270976658; LA64D-NEXT: movgr2fr.w $fa2, $a3659; LA64D-NEXT: fdiv.s $fa2, $fa2, $fa1660; LA64D-NEXT: lu12i.w $a3, 271040661; LA64D-NEXT: movgr2fr.w $fa3, $a3662; LA64D-NEXT: fdiv.s $fa3, $fa3, $fa1663; LA64D-NEXT: fst.s $fa0, $a0, 0664; LA64D-NEXT: fst.s $fa2, $a1, 0665; LA64D-NEXT: fst.s $fa3, $a2, 0666; LA64D-NEXT: fmov.s $fa0, $fa1667; LA64D-NEXT: ret668;669; LA64D-FRECIPE-LABEL: sqrt_simplify_before_recip_4_uses_f32:670; LA64D-FRECIPE: # %bb.0:671; LA64D-FRECIPE-NEXT: frsqrte.s $fa1, $fa0672; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa0, $fa1673; LA64D-FRECIPE-NEXT: fmul.s $fa2, $fa0, $fa1674; LA64D-FRECIPE-NEXT: vldi $vr3, -1144675; LA64D-FRECIPE-NEXT: fmadd.s $fa2, $fa2, $fa1, $fa3676; LA64D-FRECIPE-NEXT: vldi $vr3, -1056677; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa3678; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa2679; LA64D-FRECIPE-NEXT: lu12i.w $a3, 270976680; LA64D-FRECIPE-NEXT: movgr2fr.w $fa2, $a3681; LA64D-FRECIPE-NEXT: fmul.s $fa2, $fa1, $fa2682; LA64D-FRECIPE-NEXT: lu12i.w $a3, 271040683; LA64D-FRECIPE-NEXT: movgr2fr.w $fa3, $a3684; LA64D-FRECIPE-NEXT: fmul.s $fa3, $fa1, $fa3685; LA64D-FRECIPE-NEXT: fmul.s $fa0, $fa0, $fa1686; LA64D-FRECIPE-NEXT: fst.s $fa1, $a0, 0687; LA64D-FRECIPE-NEXT: fst.s $fa2, $a1, 0688; LA64D-FRECIPE-NEXT: fst.s $fa3, $a2, 0689; LA64D-FRECIPE-NEXT: ret690 %sqrt = tail call fast float @llvm.sqrt.f32(float %x)691 %rsqrt = fdiv fast float 1.0, %sqrt692 %r1 = fdiv fast float 42.0, %sqrt693 %r2 = fdiv fast float 43.0, %sqrt694 %sqrt_fast = fdiv fast float %x, %sqrt695 store float %rsqrt, ptr %p1, align 8696 store float %r1, ptr %p2, align 8697 store float %r2, ptr %p3, align 8698 ret float %sqrt_fast699}700 701define float @sqrt_simplify_before_recip_3_uses_order_f32(float %x, ptr %p1, ptr %p2) nounwind {702; LA32F-LABEL: sqrt_simplify_before_recip_3_uses_order_f32:703; LA32F: # %bb.0:704; LA32F-NEXT: fsqrt.s $fa0, $fa0705; LA32F-NEXT: lu12i.w $a2, 270976706; LA32F-NEXT: movgr2fr.w $fa1, $a2707; LA32F-NEXT: fdiv.s $fa1, $fa1, $fa0708; LA32F-NEXT: lu12i.w $a2, 271040709; LA32F-NEXT: movgr2fr.w $fa2, $a2710; LA32F-NEXT: fdiv.s $fa2, $fa2, $fa0711; LA32F-NEXT: fst.s $fa1, $a0, 0712; LA32F-NEXT: fst.s $fa2, $a1, 0713; LA32F-NEXT: ret714;715; LA32F-FRECIPE-LABEL: sqrt_simplify_before_recip_3_uses_order_f32:716; LA32F-FRECIPE: # %bb.0:717; LA32F-FRECIPE-NEXT: frsqrte.s $fa1, $fa0718; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa0, $fa1719; LA32F-FRECIPE-NEXT: fmul.s $fa2, $fa0, $fa1720; LA32F-FRECIPE-NEXT: lu12i.w $a2, -261120721; LA32F-FRECIPE-NEXT: movgr2fr.w $fa3, $a2722; LA32F-FRECIPE-NEXT: fmadd.s $fa2, $fa2, $fa1, $fa3723; LA32F-FRECIPE-NEXT: lu12i.w $a2, -266240724; LA32F-FRECIPE-NEXT: movgr2fr.w $fa3, $a2725; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa3726; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa2727; LA32F-FRECIPE-NEXT: fmul.s $fa0, $fa0, $fa1728; LA32F-FRECIPE-NEXT: lu12i.w $a2, 270976729; LA32F-FRECIPE-NEXT: movgr2fr.w $fa2, $a2730; LA32F-FRECIPE-NEXT: fmul.s $fa2, $fa1, $fa2731; LA32F-FRECIPE-NEXT: lu12i.w $a2, 271040732; LA32F-FRECIPE-NEXT: movgr2fr.w $fa3, $a2733; LA32F-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa3734; LA32F-FRECIPE-NEXT: fst.s $fa2, $a0, 0735; LA32F-FRECIPE-NEXT: fst.s $fa1, $a1, 0736; LA32F-FRECIPE-NEXT: ret737;738; LA64D-LABEL: sqrt_simplify_before_recip_3_uses_order_f32:739; LA64D: # %bb.0:740; LA64D-NEXT: fsqrt.s $fa0, $fa0741; LA64D-NEXT: lu12i.w $a2, 270976742; LA64D-NEXT: movgr2fr.w $fa1, $a2743; LA64D-NEXT: fdiv.s $fa1, $fa1, $fa0744; LA64D-NEXT: lu12i.w $a2, 271040745; LA64D-NEXT: movgr2fr.w $fa2, $a2746; LA64D-NEXT: fdiv.s $fa2, $fa2, $fa0747; LA64D-NEXT: fst.s $fa1, $a0, 0748; LA64D-NEXT: fst.s $fa2, $a1, 0749; LA64D-NEXT: ret750;751; LA64D-FRECIPE-LABEL: sqrt_simplify_before_recip_3_uses_order_f32:752; LA64D-FRECIPE: # %bb.0:753; LA64D-FRECIPE-NEXT: frsqrte.s $fa1, $fa0754; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa0, $fa1755; LA64D-FRECIPE-NEXT: fmul.s $fa2, $fa0, $fa1756; LA64D-FRECIPE-NEXT: vldi $vr3, -1144757; LA64D-FRECIPE-NEXT: fmadd.s $fa2, $fa2, $fa1, $fa3758; LA64D-FRECIPE-NEXT: vldi $vr3, -1056759; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa3760; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa2761; LA64D-FRECIPE-NEXT: fmul.s $fa0, $fa0, $fa1762; LA64D-FRECIPE-NEXT: lu12i.w $a2, 270976763; LA64D-FRECIPE-NEXT: movgr2fr.w $fa2, $a2764; LA64D-FRECIPE-NEXT: fmul.s $fa2, $fa1, $fa2765; LA64D-FRECIPE-NEXT: lu12i.w $a2, 271040766; LA64D-FRECIPE-NEXT: movgr2fr.w $fa3, $a2767; LA64D-FRECIPE-NEXT: fmul.s $fa1, $fa1, $fa3768; LA64D-FRECIPE-NEXT: fst.s $fa2, $a0, 0769; LA64D-FRECIPE-NEXT: fst.s $fa1, $a1, 0770; LA64D-FRECIPE-NEXT: ret771 %sqrt = tail call fast float @llvm.sqrt.f32(float %x)772 %sqrt_fast = fdiv fast float %x, %sqrt773 %r1 = fdiv fast float 42.0, %sqrt774 %r2 = fdiv fast float 43.0, %sqrt775 store float %r1, ptr %p1, align 8776 store float %r2, ptr %p2, align 8777 ret float %sqrt_fast778}779