1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; <rdar://problem/10889741> 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine void @func(double %r, double %g, double %b, double* %outH, double* %outS, double* %outL) nounwind uwtable ssp { 5*9880d681SAndroid Build Coastguard Workerbb: 6*9880d681SAndroid Build Coastguard Worker %tmp = alloca double, align 8 7*9880d681SAndroid Build Coastguard Worker %tmp1 = alloca double, align 8 8*9880d681SAndroid Build Coastguard Worker %tmp2 = alloca double, align 8 9*9880d681SAndroid Build Coastguard Worker store double %r, double* %tmp, align 8 10*9880d681SAndroid Build Coastguard Worker store double %g, double* %tmp1, align 8 11*9880d681SAndroid Build Coastguard Worker store double %b, double* %tmp2, align 8 12*9880d681SAndroid Build Coastguard Worker %tmp3 = fcmp ogt double %r, %g 13*9880d681SAndroid Build Coastguard Worker br i1 %tmp3, label %bb4, label %bb8 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerbb4: ; preds = %bb 16*9880d681SAndroid Build Coastguard Worker %tmp5 = fcmp ogt double %r, %b 17*9880d681SAndroid Build Coastguard Worker br i1 %tmp5, label %bb6, label %bb7 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerbb6: ; preds = %bb4 20*9880d681SAndroid Build Coastguard Worker br label %bb12 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerbb7: ; preds = %bb4 23*9880d681SAndroid Build Coastguard Worker br label %bb12 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerbb8: ; preds = %bb 26*9880d681SAndroid Build Coastguard Worker %tmp9 = fcmp ogt double %g, %b 27*9880d681SAndroid Build Coastguard Worker br i1 %tmp9, label %bb10, label %bb11 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerbb10: ; preds = %bb8 30*9880d681SAndroid Build Coastguard Worker br label %bb12 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerbb11: ; preds = %bb8 33*9880d681SAndroid Build Coastguard Worker br label %bb12 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerbb12: ; preds = %bb11, %bb10, %bb7, %bb6 36*9880d681SAndroid Build Coastguard Worker %max.0 = phi double* [ %tmp, %bb6 ], [ %tmp2, %bb7 ], [ %tmp1, %bb10 ], [ %tmp2, %bb11 ] 37*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp13 = load double, double* %tmp, align 8 38*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp14 = load double, double* %tmp1, align 8 39*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp15 = fcmp olt double %tmp13, %tmp14 40*9880d681SAndroid Build Coastguard Worker %tmp13 = load double, double* %tmp, align 8 41*9880d681SAndroid Build Coastguard Worker %tmp14 = load double, double* %tmp1, align 8 42*9880d681SAndroid Build Coastguard Worker %tmp15 = fcmp olt double %tmp13, %tmp14 43*9880d681SAndroid Build Coastguard Worker br i1 %tmp15, label %bb16, label %bb21 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerbb16: ; preds = %bb12 46*9880d681SAndroid Build Coastguard Worker %tmp17 = load double, double* %tmp2, align 8 47*9880d681SAndroid Build Coastguard Worker %tmp18 = fcmp olt double %tmp13, %tmp17 48*9880d681SAndroid Build Coastguard Worker br i1 %tmp18, label %bb19, label %bb20 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerbb19: ; preds = %bb16 51*9880d681SAndroid Build Coastguard Worker br label %bb26 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerbb20: ; preds = %bb16 54*9880d681SAndroid Build Coastguard Worker br label %bb26 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerbb21: ; preds = %bb12 57*9880d681SAndroid Build Coastguard Worker %tmp22 = load double, double* %tmp2, align 8 58*9880d681SAndroid Build Coastguard Worker %tmp23 = fcmp olt double %tmp14, %tmp22 59*9880d681SAndroid Build Coastguard Worker br i1 %tmp23, label %bb24, label %bb25 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerbb24: ; preds = %bb21 62*9880d681SAndroid Build Coastguard Worker br label %bb26 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerbb25: ; preds = %bb21 65*9880d681SAndroid Build Coastguard Worker br label %bb26 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerbb26: ; preds = %bb25, %bb24, %bb20, %bb19 68*9880d681SAndroid Build Coastguard Worker %min.0 = phi double* [ %tmp, %bb19 ], [ %tmp2, %bb20 ], [ %tmp1, %bb24 ], [ %tmp2, %bb25 ] 69*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp27 = load double, double* %min.0, align 8 70*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp28 = load double, double* %max.0 71*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp29 = fadd double %tmp27, %tmp28 72*9880d681SAndroid Build Coastguard Worker %tmp27 = load double, double* %min.0, align 8 73*9880d681SAndroid Build Coastguard Worker %tmp28 = load double, double* %max.0 74*9880d681SAndroid Build Coastguard Worker %tmp29 = fadd double %tmp27, %tmp28 75*9880d681SAndroid Build Coastguard Worker %tmp30 = fdiv double %tmp29, 2.000000e+00 76*9880d681SAndroid Build Coastguard Worker store double %tmp30, double* %outL 77*9880d681SAndroid Build Coastguard Worker %tmp31 = load double, double* %min.0 78*9880d681SAndroid Build Coastguard Worker %tmp32 = load double, double* %max.0 79*9880d681SAndroid Build Coastguard Worker %tmp33 = fcmp oeq double %tmp31, %tmp32 80*9880d681SAndroid Build Coastguard Worker br i1 %tmp33, label %bb34, label %bb35 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerbb34: ; preds = %bb26 83*9880d681SAndroid Build Coastguard Worker store double 0.000000e+00, double* %outS 84*9880d681SAndroid Build Coastguard Worker store double 0.000000e+00, double* %outH 85*9880d681SAndroid Build Coastguard Worker br label %bb81 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerbb35: ; preds = %bb26 88*9880d681SAndroid Build Coastguard Worker %tmp36 = fcmp olt double %tmp30, 5.000000e-01 89*9880d681SAndroid Build Coastguard Worker %tmp37 = fsub double %tmp32, %tmp31 90*9880d681SAndroid Build Coastguard Worker br i1 %tmp36, label %bb38, label %bb41 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerbb38: ; preds = %bb35 93*9880d681SAndroid Build Coastguard Worker %tmp39 = fadd double %tmp32, %tmp31 94*9880d681SAndroid Build Coastguard Worker %tmp40 = fdiv double %tmp37, %tmp39 95*9880d681SAndroid Build Coastguard Worker store double %tmp40, double* %outS 96*9880d681SAndroid Build Coastguard Worker br label %bb45 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerbb41: ; preds = %bb35 99*9880d681SAndroid Build Coastguard Worker %tmp42 = fsub double 2.000000e+00, %tmp32 100*9880d681SAndroid Build Coastguard Worker %tmp43 = fsub double %tmp42, %tmp31 101*9880d681SAndroid Build Coastguard Worker %tmp44 = fdiv double %tmp37, %tmp43 102*9880d681SAndroid Build Coastguard Worker store double %tmp44, double* %outS 103*9880d681SAndroid Build Coastguard Worker br label %bb45 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerbb45: ; preds = %bb41, %bb38 106*9880d681SAndroid Build Coastguard Worker %tmp46 = icmp eq double* %max.0, %tmp 107*9880d681SAndroid Build Coastguard Worker br i1 %tmp46, label %bb47, label %bb55 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerbb47: ; preds = %bb45 110*9880d681SAndroid Build Coastguard Worker %tmp48 = load double, double* %tmp1, align 8 111*9880d681SAndroid Build Coastguard Worker %tmp49 = load double, double* %tmp2, align 8 112*9880d681SAndroid Build Coastguard Worker %tmp50 = fsub double %tmp48, %tmp49 113*9880d681SAndroid Build Coastguard Worker %tmp51 = load double, double* %max.0 114*9880d681SAndroid Build Coastguard Worker %tmp52 = load double, double* %min.0 115*9880d681SAndroid Build Coastguard Worker %tmp53 = fsub double %tmp51, %tmp52 116*9880d681SAndroid Build Coastguard Worker %tmp54 = fdiv double %tmp50, %tmp53 117*9880d681SAndroid Build Coastguard Worker store double %tmp54, double* %outH 118*9880d681SAndroid Build Coastguard Worker br label %bb75 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerbb55: ; preds = %bb45 121*9880d681SAndroid Build Coastguard Worker %tmp56 = icmp eq double* %max.0, %tmp1 122*9880d681SAndroid Build Coastguard Worker br i1 %tmp56, label %bb57, label %bb66 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerbb57: ; preds = %bb55 125*9880d681SAndroid Build Coastguard Worker %tmp58 = load double, double* %tmp2, align 8 126*9880d681SAndroid Build Coastguard Worker %tmp59 = load double, double* %tmp, align 8 127*9880d681SAndroid Build Coastguard Worker %tmp60 = fsub double %tmp58, %tmp59 128*9880d681SAndroid Build Coastguard Worker %tmp61 = load double, double* %max.0 129*9880d681SAndroid Build Coastguard Worker %tmp62 = load double, double* %min.0 130*9880d681SAndroid Build Coastguard Worker %tmp63 = fsub double %tmp61, %tmp62 131*9880d681SAndroid Build Coastguard Worker %tmp64 = fdiv double %tmp60, %tmp63 132*9880d681SAndroid Build Coastguard Worker %tmp65 = fadd double 2.000000e+00, %tmp64 133*9880d681SAndroid Build Coastguard Worker store double %tmp65, double* %outH 134*9880d681SAndroid Build Coastguard Worker br label %bb75 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerbb66: ; preds = %bb55 137*9880d681SAndroid Build Coastguard Worker %tmp67 = load double, double* %tmp, align 8 138*9880d681SAndroid Build Coastguard Worker %tmp68 = load double, double* %tmp1, align 8 139*9880d681SAndroid Build Coastguard Worker %tmp69 = fsub double %tmp67, %tmp68 140*9880d681SAndroid Build Coastguard Worker %tmp70 = load double, double* %max.0 141*9880d681SAndroid Build Coastguard Worker %tmp71 = load double, double* %min.0 142*9880d681SAndroid Build Coastguard Worker %tmp72 = fsub double %tmp70, %tmp71 143*9880d681SAndroid Build Coastguard Worker %tmp73 = fdiv double %tmp69, %tmp72 144*9880d681SAndroid Build Coastguard Worker %tmp74 = fadd double 4.000000e+00, %tmp73 145*9880d681SAndroid Build Coastguard Worker store double %tmp74, double* %outH 146*9880d681SAndroid Build Coastguard Worker br label %bb75 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerbb75: ; preds = %bb66, %bb57, %bb47 149*9880d681SAndroid Build Coastguard Worker %tmp76 = load double, double* %outH 150*9880d681SAndroid Build Coastguard Worker %tmp77 = fdiv double %tmp76, 6.000000e+00 151*9880d681SAndroid Build Coastguard Worker store double %tmp77, double* %outH 152*9880d681SAndroid Build Coastguard Worker %tmp78 = fcmp olt double %tmp77, 0.000000e+00 153*9880d681SAndroid Build Coastguard Worker br i1 %tmp78, label %bb79, label %bb81 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerbb79: ; preds = %bb75 156*9880d681SAndroid Build Coastguard Worker %tmp80 = fadd double %tmp77, 1.000000e+00 157*9880d681SAndroid Build Coastguard Worker store double %tmp80, double* %outH 158*9880d681SAndroid Build Coastguard Worker br label %bb81 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerbb81: ; preds = %bb79, %bb75, %bb34 161*9880d681SAndroid Build Coastguard Worker ret void 162*9880d681SAndroid Build Coastguard Worker} 163