632 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt -S -passes='instcombine<no-verify-fixpoint>' < %s | FileCheck %s3 4@x = global double 0.000000e+005@r1 = global double 0.000000e+006@r2 = global double 0.000000e+007@r3 = global double 0.000000e+008@v = global [2 x double] zeroinitializer9@v1 = global [2 x double] zeroinitializer10@v2 = global [2 x double] zeroinitializer11 12; div/mul/div1 in the same block.13define void @bb_constraint_case1(double %a) {14; CHECK-LABEL: define void @bb_constraint_case1(15; CHECK-SAME: double [[A:%.*]]) {16; CHECK-NEXT: entry:17; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])18; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]19; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]]20; CHECK-NEXT: store double [[DIV]], ptr @x, align 821; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 822; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 823; CHECK-NEXT: ret void24;25entry:26 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)27 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt28 store double %div, ptr @x29 %mul = fmul reassoc double %div, %div30 store double %mul, ptr @r131 %div1 = fdiv reassoc double %a, %sqrt32 store double %div1, ptr @r233 ret void34}35 36; div/mul in one block and div1 in other block with conditional guard.37define void @bb_constraint_case2(double %a, i32 %d) {38; CHECK-LABEL: define void @bb_constraint_case2(39; CHECK-SAME: double [[A:%.*]], i32 [[D:%.*]]) {40; CHECK-NEXT: entry:41; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])42; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]43; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]]44; CHECK-NEXT: store double [[DIV]], ptr @x, align 845; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 846; CHECK-NEXT: [[D_NOT:%.*]] = icmp eq i32 [[D]], 047; CHECK-NEXT: br i1 [[D_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]48; CHECK: if.then:49; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 850; CHECK-NEXT: br label [[IF_END]]51; CHECK: if.end:52; CHECK-NEXT: ret void53;54entry:55 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)56 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt57 store double %div, ptr @x58 %mul = fmul reassoc double %div, %div59 store double %mul, ptr @r160 %d.not = icmp eq i32 %d, 061 br i1 %d.not, label %if.end, label %if.then62 63if.then: ; preds = %entry64 %div1 = fdiv reassoc double %a, %sqrt65 store double %div1, ptr @r266 br label %if.end67 68if.end: ; preds = %if.then, %entry69 ret void70}71 72; div in one block. mul/div1 in other block and conditionally guarded. Don't optimize.73define void @bb_constraint_case3(double %a, i32 %d) {74; CHECK-LABEL: define void @bb_constraint_case3(75; CHECK-SAME: double [[A:%.*]], i32 [[D:%.*]]) {76; CHECK-NEXT: entry:77; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])78; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]79; CHECK-NEXT: store double [[DIV]], ptr @x, align 880; CHECK-NEXT: [[D_NOT:%.*]] = icmp eq i32 [[D]], 081; CHECK-NEXT: br i1 [[D_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]82; CHECK: if.then:83; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]84; CHECK-NEXT: store double [[MUL]], ptr @r1, align 885; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]86; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 887; CHECK-NEXT: br label [[IF_END]]88; CHECK: if.end:89; CHECK-NEXT: ret void90;91entry:92 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)93 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt94 store double %div, ptr @x95 %d.not = icmp eq i32 %d, 096 br i1 %d.not, label %if.end, label %if.then97 98if.then: ; preds = %entry99 %mul = fmul reassoc double %div, %div100 store double %mul, ptr @r1101 %div1 = fdiv reassoc double %a, %sqrt102 store double %div1, ptr @r2103 br label %if.end104 105if.end: ; preds = %if.then, %entry106 ret void107}108 109; div in one block. mul/div1 each in different block and conditionally guarded. Don't optimize.110define void @bb_constraint_case4(double %a, i32 %c, i32 %d) {111; CHECK-LABEL: define void @bb_constraint_case4(112; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]], i32 [[D:%.*]]) {113; CHECK-NEXT: entry:114; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])115; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]116; CHECK-NEXT: store double [[DIV]], ptr @x, align 8117; CHECK-NEXT: [[C_NOT:%.*]] = icmp eq i32 [[C]], 0118; CHECK-NEXT: br i1 [[C_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]119; CHECK: if.then:120; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]121; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8122; CHECK-NEXT: br label [[IF_END]]123; CHECK: if.end:124; CHECK-NEXT: [[D_NOT:%.*]] = icmp eq i32 [[D]], 0125; CHECK-NEXT: br i1 [[D_NOT]], label [[IF_END1:%.*]], label [[IF_THEN1:%.*]]126; CHECK: if.then1:127; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]128; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8129; CHECK-NEXT: br label [[IF_END1]]130; CHECK: if.end1:131; CHECK-NEXT: ret void132;133entry:134 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)135 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt136 store double %div, ptr @x137 %c.not = icmp eq i32 %c, 0138 br i1 %c.not, label %if.end, label %if.then139 140if.then: ; preds = %entry141 %mul = fmul reassoc double %div, %div142 store double %mul, ptr @r1143 br label %if.end144 145if.end: ; preds = %if.then, %entry146 %d.not = icmp eq i32 %d, 0147 br i1 %d.not, label %if.end1, label %if.then1148 149if.then1: ; preds = %if.end150 %div1 = fdiv reassoc double %a, %sqrt151 store double %div1, ptr @r2152 br label %if.end1153 154if.end1: ; preds = %if.then1, %if.end155 ret void156}157 158; sqrt value comes from different blocks. Don't optimize.159define void @bb_constraint_case5(double %a, i32 %c) {160; CHECK-LABEL: define void @bb_constraint_case5(161; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]]) {162; CHECK-NEXT: entry:163; CHECK-NEXT: [[C_NOT:%.*]] = icmp eq i32 [[C]], 0164; CHECK-NEXT: br i1 [[C_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]165; CHECK: if.then:166; CHECK-NEXT: [[TMP0:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])167; CHECK-NEXT: br label [[IF_END:%.*]]168; CHECK: if.else:169; CHECK-NEXT: [[ADD:%.*]] = fadd double [[A]], 1.000000e+01170; CHECK-NEXT: [[TMP1:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[ADD]])171; CHECK-NEXT: br label [[IF_END]]172; CHECK: if.end:173; CHECK-NEXT: [[SQRT:%.*]] = phi double [ [[TMP0]], [[IF_THEN]] ], [ [[TMP1]], [[IF_ELSE]] ]174; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]175; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]176; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8177; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]178; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8179; CHECK-NEXT: ret void180;181entry:182 %c.not = icmp eq i32 %c, 0183 br i1 %c.not, label %if.else, label %if.then184 185if.then: ; preds = %entry186 %0 = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)187 br label %if.end188 189if.else: ; preds = %entry190 %add = fadd double %a, 1.000000e+01191 %1 = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %add)192 br label %if.end193 194if.end: ; preds = %if.else, %if.then195 %sqrt = phi double[ %0, %if.then], [ %1, %if.else]196 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt197 %mul = fmul reassoc double %div, %div198 store double %mul, ptr @r1199 %div1 = fdiv reassoc double %a, %sqrt200 store double %div1, ptr @r2201 ret void202}203 204; div in one block and conditionally guarded. mul/div1 in other block. Don't optimize.205define void @bb_constraint_case6(double %a, i32 %d) {206; CHECK-LABEL: define void @bb_constraint_case6(207; CHECK-SAME: double [[A:%.*]], i32 [[D:%.*]]) {208; CHECK-NEXT: entry:209; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])210; CHECK-NEXT: [[D_NOT:%.*]] = icmp eq i32 [[D]], 0211; CHECK-NEXT: br i1 [[D_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]212; CHECK: if.else:213; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr @x, align 8214; CHECK-NEXT: br label [[IF_END:%.*]]215; CHECK: if.then:216; CHECK-NEXT: [[TMP1:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]217; CHECK-NEXT: store double [[TMP1]], ptr @x, align 8218; CHECK-NEXT: br label [[IF_END]]219; CHECK: if.end:220; CHECK-NEXT: [[DIV:%.*]] = phi double [ [[TMP0]], [[IF_ELSE]] ], [ [[TMP1]], [[IF_THEN]] ]221; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]222; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8223; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]224; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8225; CHECK-NEXT: ret void226;227entry:228 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)229 %d.not = icmp eq i32 %d, 0230 br i1 %d.not, label %if.else, label %if.then231 232if.else: ; preds = %entry233 %1 = load double, ptr @x234 br label %if.end235 236if.then: ; preds = %entry237 %2 = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt238 store double %2, ptr @x239 br label %if.end240 241if.end: ; preds = %if.else, %if.then242 %div = phi double [ %1, %if.else ], [ %2, %if.then ]243 %mul = fmul reassoc double %div, %div244 store double %mul, ptr @r1245 %div1 = fdiv reassoc double %a, %sqrt246 store double %div1, ptr @r2247 ret void248}249 250; value for mul comes from different blocks. Don't optimize.251define void @bb_constraint_case7(double %a, i32 %c, i32 %d) {252; CHECK-LABEL: define void @bb_constraint_case7(253; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]], i32 [[D:%.*]]) {254; CHECK-NEXT: entry:255; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])256; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]257; CHECK-NEXT: store double [[DIV]], ptr @x, align 8258; CHECK-NEXT: [[C_NOT:%.*]] = icmp eq i32 [[C]], 0259; CHECK-NEXT: br i1 [[C_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]260; CHECK: if.then:261; CHECK-NEXT: [[TMP0:%.*]] = fdiv double 3.000000e+00, [[A]]262; CHECK-NEXT: br label [[IF_END:%.*]]263; CHECK: if.else:264; CHECK-NEXT: [[D_NOT:%.*]] = icmp eq i32 [[D]], 0265; CHECK-NEXT: br i1 [[D_NOT]], label [[IF_ELSE1:%.*]], label [[IF_THEN1:%.*]]266; CHECK: if.then1:267; CHECK-NEXT: [[TMP1:%.*]] = fdiv double 2.000000e+00, [[A]]268; CHECK-NEXT: br label [[IF_END]]269; CHECK: if.else1:270; CHECK-NEXT: [[TMP2:%.*]] = fmul reassoc double [[DIV]], [[DIV]]271; CHECK-NEXT: br label [[IF_END]]272; CHECK: if.end:273; CHECK-NEXT: [[MUL:%.*]] = phi double [ [[TMP1]], [[IF_THEN1]] ], [ [[TMP2]], [[IF_ELSE1]] ], [ [[TMP0]], [[IF_THEN]] ]274; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8275; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]276; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8277; CHECK-NEXT: ret void278;279entry:280 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)281 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt282 store double %div, ptr @x283 %c.not = icmp eq i32 %c, 0284 br i1 %c.not, label %if.else, label %if.then285 286if.then: ; preds = %entry287 %1 = fdiv double 3.000000e+00, %a288 br label %if.end289 290if.else: ; preds = %entry291 %d.not = icmp eq i32 %d, 0292 br i1 %d.not, label %if.else1, label %if.then1293 294if.then1: ; preds = %if.else295 %2 = fdiv double 2.000000e+00, %a296 br label %if.end297 298if.else1: ; preds = %if.else299 %3 = fmul reassoc double %div, %div300 br label %if.end301 302if.end: ; preds = %if.then1, %if.else1, %if.then303 %mul = phi double [ %2, %if.then1 ], [ %3, %if.else1 ], [ %1, %if.then ]304 store double %mul, ptr @r1305 %div1 = fdiv reassoc double %a, %sqrt306 store double %div1, ptr @r2307 ret void308}309 310; value of mul comes from two different blocks(as shown by select ins).311define void @bb_constraint_case8(double %a, i32 %c) {312; CHECK-LABEL: define void @bb_constraint_case8(313; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]]) {314; CHECK-NEXT: entry:315; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])316; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]317; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]]318; CHECK-NEXT: store double [[DIV]], ptr @x, align 8319; CHECK-NEXT: [[C_NOT:%.*]] = icmp eq i32 [[C]], 0320; CHECK-NEXT: [[TMP1:%.*]] = fmul double [[A]], [[A]]321; CHECK-NEXT: [[MUL:%.*]] = select i1 [[C_NOT]], double [[TMP1]], double [[TMP0]]322; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8323; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8324; CHECK-NEXT: ret void325;326entry:327 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)328 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt329 store double %div, ptr @x330 %c.not = icmp eq i32 %c, 0331 %1 = fmul double %a, %a332 %2 = fmul reassoc double %div, %div333 %mul = select i1 %c.not, double %1, double %2334 store double %mul, ptr @r1335 %div1 = fdiv reassoc double %a, %sqrt336 store double %div1, ptr @r2337 ret void338}339 340; multiple instances of multiply ops to optimize. Optimize all.341define void @mutiple_multiply_instances(double %a, i32 %c) {342; CHECK-LABEL: define void @mutiple_multiply_instances(343; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]]) {344; CHECK-NEXT: entry:345; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])346; CHECK-NEXT: [[TMP1:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]347; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP1]], [[SQRT1]]348; CHECK-NEXT: store double [[DIV]], ptr @x, align 8349; CHECK-NEXT: [[C_NOT:%.*]] = icmp eq i32 [[C]], 0350; CHECK-NEXT: [[TMP2:%.*]] = fmul double [[A]], [[A]]351; CHECK-NEXT: [[TMP3:%.*]] = fmul double [[A]], [[A]]352; CHECK-NEXT: [[MUL1:%.*]] = select i1 [[C_NOT]], double [[TMP2]], double [[TMP1]]353; CHECK-NEXT: [[MUL2:%.*]] = select i1 [[C_NOT]], double [[TMP1]], double [[TMP3]]354; CHECK-NEXT: store double [[MUL1]], ptr @r1, align 8355; CHECK-NEXT: store double [[MUL2]], ptr @r3, align 8356; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8357; CHECK-NEXT: ret void358;359entry:360 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)361 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt362 store double %div, ptr @x363 %c.not = icmp eq i32 %c, 0364 %1 = fmul double %a, %a365 %2 = fmul double %a, %a366 %3 = fmul reassoc double %div, %div367 %4 = fmul reassoc double %div, %div368 %mul1 = select i1 %c.not, double %1, double %3369 %mul2 = select i1 %c.not, double %4, double %2370 store double %mul1, ptr @r1371 store double %mul2, ptr @r3372 %div1 = fdiv reassoc double %a, %sqrt373 store double %div1, ptr @r2374 ret void375}376 377; missing flags for optimization.378define void @missing_arcp_flag_on_div(double %a) {379; CHECK-LABEL: define void @missing_arcp_flag_on_div(380; CHECK-SAME: double [[A:%.*]]) {381; CHECK-NEXT: entry:382; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])383; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf double 1.000000e+00, [[SQRT]]384; CHECK-NEXT: store double [[DIV]], ptr @x, align 8385; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]386; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8387; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]388; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8389; CHECK-NEXT: ret void390;391entry:392 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)393 %div = fdiv reassoc ninf double 1.000000e+00, %sqrt394 store double %div, ptr @x395 %mul = fmul reassoc double %div, %div396 store double %mul, ptr @r1397 %div1 = fdiv reassoc double %a, %sqrt398 store double %div1, ptr @r2399 ret void400}401 402; missing flags for optimization.403define void @missing_reassoc_flag_on_mul(double %a) {404; CHECK-LABEL: define void @missing_reassoc_flag_on_mul(405; CHECK-SAME: double [[A:%.*]]) {406; CHECK-NEXT: entry:407; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])408; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]409; CHECK-NEXT: store double [[DIV]], ptr @x, align 8410; CHECK-NEXT: [[MUL:%.*]] = fmul double [[DIV]], [[DIV]]411; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8412; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]413; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8414; CHECK-NEXT: ret void415;416entry:417 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)418 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt419 store double %div, ptr @x420 %mul = fmul double %div, %div421 store double %mul, ptr @r1422 %div1 = fdiv reassoc double %a, %sqrt423 store double %div1, ptr @r2424 ret void425}426 427; missing flags for optimization.428define void @missing_reassoc_flag_on_div1(double %a) {429; CHECK-LABEL: define void @missing_reassoc_flag_on_div1(430; CHECK-SAME: double [[A:%.*]]) {431; CHECK-NEXT: entry:432; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])433; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]434; CHECK-NEXT: store double [[DIV]], ptr @x, align 8435; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]436; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8437; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[A]], [[SQRT]]438; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8439; CHECK-NEXT: ret void440;441entry:442 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)443 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt444 store double %div, ptr @x445 %mul = fmul reassoc double %div, %div446 store double %mul, ptr @r1447 %div1 = fdiv double %a, %sqrt448 store double %div1, ptr @r2449 ret void450}451 452; div = -1/sqrt(a)453define void @negative_fdiv_val(double %a) {454; CHECK-LABEL: define void @negative_fdiv_val(455; CHECK-SAME: double [[A:%.*]]) {456; CHECK-NEXT: entry:457; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])458; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]459; CHECK-NEXT: [[TMP1:%.*]] = fneg reassoc double [[SQRT1]]460; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[TMP1]]461; CHECK-NEXT: store double [[DIV]], ptr @x, align 8462; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8463; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8464; CHECK-NEXT: ret void465;466entry:467 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)468 %div = fdiv reassoc arcp ninf double -1.000000e+00, %sqrt469 store double %div, ptr @x470 %mul = fmul reassoc double %div, %div471 store double %mul, ptr @r1472 %div1 = fdiv reassoc double %a, %sqrt473 store double %div1, ptr @r2474 ret void475}476 477define void @fpmath_metadata_on_div1(double %a) {478; CHECK-LABEL: define void @fpmath_metadata_on_div1(479; CHECK-SAME: double [[A:%.*]]) {480; CHECK-NEXT: entry:481; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]), !fpmath [[META0:![0-9]+]]482; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]483; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]]484; CHECK-NEXT: store double [[DIV]], ptr @x, align 8485; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8486; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8487; CHECK-NEXT: ret void488;489entry:490 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)491 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt492 store double %div, ptr @x493 %mul = fmul reassoc double %div, %div494 store double %mul, ptr @r1495 %div1 = fdiv reassoc double %a, %sqrt, !fpmath !3496 store double %div1, ptr @r2497 ret void498}499 500define void @fpmath_metadata_on_mul(double %a) {501; CHECK-LABEL: define void @fpmath_metadata_on_mul(502; CHECK-SAME: double [[A:%.*]]) {503; CHECK-NEXT: entry:504; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])505; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]], !fpmath [[META1:![0-9]+]]506; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]]507; CHECK-NEXT: store double [[DIV]], ptr @x, align 8508; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8509; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8510; CHECK-NEXT: ret void511;512entry:513 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)514 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt515 store double %div, ptr @x516 %mul = fmul reassoc double %div, %div, !fpmath !2517 store double %mul, ptr @r1518 %div1 = fdiv reassoc double %a, %sqrt519 store double %div1, ptr @r2520 ret void521}522 523; FIXME: DIV in the result should get the fpmath metadata from %div.524define void @fpmath_metadata_on_div(double %a) {525; CHECK-LABEL: define void @fpmath_metadata_on_div(526; CHECK-SAME: double [[A:%.*]]) {527; CHECK-NEXT: entry:528; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])529; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]530; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]], !fpmath [[META2:![0-9]+]]531; CHECK-NEXT: store double [[DIV]], ptr @x, align 8532; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8533; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8534; CHECK-NEXT: ret void535;536entry:537 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)538 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt, !fpmath !1539 store double %div, ptr @x540 %mul = fmul reassoc double %div, %div541 store double %mul, ptr @r1542 %div1 = fdiv reassoc double %a, %sqrt543 store double %div1, ptr @r2544 ret void545}546 547define void @fpmath_metadata_on_all(double %a) {548; CHECK-LABEL: define void @fpmath_metadata_on_all(549; CHECK-SAME: double [[A:%.*]]) {550; CHECK-NEXT: entry:551; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]), !fpmath [[META0]]552; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]], !fpmath [[META1]]553; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]], !fpmath [[META2]]554; CHECK-NEXT: store double [[DIV]], ptr @x, align 8555; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8556; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8557; CHECK-NEXT: ret void558;559entry:560 %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a), !fpmath !0561 %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt, !fpmath !1562 store double %div, ptr @x563 %mul = fmul reassoc double %div, %div, !fpmath !2564 store double %mul, ptr @r1565 %div1 = fdiv reassoc double %a, %sqrt, !fpmath !3566 store double %div1, ptr @r2567 ret void568}569 570define void @vector_input(<2 x double> %a) {571; CHECK-LABEL: define void @vector_input(572; CHECK-SAME: <2 x double> [[A:%.*]]) {573; CHECK-NEXT: entry:574; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc <2 x double> @llvm.sqrt.v2f64(<2 x double> [[A]])575; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc <2 x double> splat (double 1.000000e+00), [[A]]576; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc <2 x double> [[TMP0]], [[SQRT1]]577; CHECK-NEXT: store <2 x double> [[DIV]], ptr @v, align 16578; CHECK-NEXT: store <2 x double> [[TMP0]], ptr @v1, align 16579; CHECK-NEXT: store <2 x double> [[SQRT1]], ptr @v2, align 16580; CHECK-NEXT: ret void581;582entry:583 %sqrt = call reassoc nnan nsz ninf <2 x double> @llvm.sqrt.v2f64(<2 x double> %a)584 %div = fdiv reassoc arcp ninf <2 x double><double 1.000000e+00, double 1.000000e+00>, %sqrt585 store <2 x double> %div, ptr @v586 %mul = fmul reassoc <2 x double> %div, %div587 store <2 x double> %mul, ptr @v1588 %div1 = fdiv reassoc <2 x double> %a, %sqrt589 store <2 x double> %div1, ptr @v2590 ret void591}592 593define void @strict_fp_metadata(double %a) {594; CHECK-LABEL: define void @strict_fp_metadata(595; CHECK-SAME: double [[A:%.*]]) {596; CHECK-NEXT: entry:597; CHECK-NEXT: [[CONV:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 1, metadata !"round.dynamic", metadata !"fpexcept.strict")598; CHECK-NEXT: [[CALL:%.*]] = call double @llvm.sqrt.f64(double noundef [[A]])599; CHECK-NEXT: [[DIV:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[CONV]], double [[CALL]], metadata !"round.dynamic", metadata !"fpexcept.strict")600; CHECK-NEXT: store double [[DIV]], ptr @x, align 8601; CHECK-NEXT: [[MUL:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[DIV]], double [[DIV]], metadata !"round.dynamic", metadata !"fpexcept.strict")602; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8603; CHECK-NEXT: [[DIV2:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A]], double [[CALL]], metadata !"round.dynamic", metadata !"fpexcept.strict")604; CHECK-NEXT: store double [[DIV2]], ptr @r2, align 8605; CHECK-NEXT: ret void606;607entry:608 %conv = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 1, metadata !"round.dynamic", metadata !"fpexcept.strict")609 %call = call double @llvm.sqrt.f64(double noundef %a)610 %div = call double @llvm.experimental.constrained.fdiv.f64(double %conv, double %call, metadata !"round.dynamic", metadata !"fpexcept.strict")611 store double %div, ptr @x612 %mul = call double @llvm.experimental.constrained.fmul.f64(double %div, double %div, metadata !"round.dynamic", metadata !"fpexcept.strict")613 store double %mul, ptr @r1614 %div2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %call, metadata !"round.dynamic", metadata !"fpexcept.strict")615 store double %div2, ptr @r2616 ret void617}618 619declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata)620declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)621declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)622declare double @llvm.sqrt.f64(double)623declare <2 x double> @llvm.sqrt.v2f64(<2 x double>)624 625!0 = !{float 2.5}626!1 = !{float 3.5}627!2 = !{float 4.5}628!3 = !{float 5.5}629; CHECK: [[META0]] = !{float 5.500000e+00}630; CHECK: [[META1]] = !{float 4.500000e+00}631; CHECK: [[META2]] = !{float 3.500000e+00}632