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