brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.5 KiB · 6296954 Raw
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