1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -instcombine < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t1 4*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oge float %a, 5.000000e+00 5*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float 5.000000e+00, float %a 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %1 to double 7*9880d681SAndroid Build Coastguard Workerdefine double @t1(float %a) { 8*9880d681SAndroid Build Coastguard Worker ; This is the canonical form for a type-changing min/max. 9*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult float %a, 5.0 10*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %a, float 5.0 11*9880d681SAndroid Build Coastguard Worker %3 = fpext float %2 to double 12*9880d681SAndroid Build Coastguard Worker ret double %3 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t2 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oge float %a, 5.000000e+00 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float 5.000000e+00, float %a 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %1 to double 19*9880d681SAndroid Build Coastguard Workerdefine double @t2(float %a) { 20*9880d681SAndroid Build Coastguard Worker ; Check this is converted into canonical form, as above. 21*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult float %a, 5.0 22*9880d681SAndroid Build Coastguard Worker %2 = fpext float %a to double 23*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, double %2, double 5.0 24*9880d681SAndroid Build Coastguard Worker ret double %3 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t4 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oge double %a, 5.000000e+00 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, double 5.000000e+00, double %a 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptrunc double %1 to float 31*9880d681SAndroid Build Coastguard Workerdefine float @t4(double %a) { 32*9880d681SAndroid Build Coastguard Worker ; Same again, with trunc. 33*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult double %a, 5.0 34*9880d681SAndroid Build Coastguard Worker %2 = fptrunc double %a to float 35*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, float %2, float 5.0 36*9880d681SAndroid Build Coastguard Worker ret float %3 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t5 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ult float %a, 5.000000e+00 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %a to double 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %1, double %2, double 5.001 43*9880d681SAndroid Build Coastguard Workerdefine double @t5(float %a) { 44*9880d681SAndroid Build Coastguard Worker ; different values, should not be converted. 45*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult float %a, 5.0 46*9880d681SAndroid Build Coastguard Worker %2 = fpext float %a to double 47*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, double %2, double 5.001 48*9880d681SAndroid Build Coastguard Worker ret double %3 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t6 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ult float %a, -0.0 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %a to double 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %1, double %2, double 0.0 55*9880d681SAndroid Build Coastguard Workerdefine double @t6(float %a) { 56*9880d681SAndroid Build Coastguard Worker ; Signed zero, should not be converted 57*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult float %a, -0.0 58*9880d681SAndroid Build Coastguard Worker %2 = fpext float %a to double 59*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, double %2, double 0.0 60*9880d681SAndroid Build Coastguard Worker ret double %3 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t7 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ult float %a, 0.0 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %a to double 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %1, double %2, double -0.0 67*9880d681SAndroid Build Coastguard Workerdefine double @t7(float %a) { 68*9880d681SAndroid Build Coastguard Worker ; Signed zero, should not be converted 69*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult float %a, 0.0 70*9880d681SAndroid Build Coastguard Worker %2 = fpext float %a to double 71*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, double %2, double -0.0 72*9880d681SAndroid Build Coastguard Worker ret double %3 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t8 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oge float %a, 5.000000e+00 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float 5.000000e+00, float %a 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptoui float %1 to i64 79*9880d681SAndroid Build Coastguard Workerdefine i64 @t8(float %a) { 80*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult float %a, 5.0 81*9880d681SAndroid Build Coastguard Worker %2 = fptoui float %a to i64 82*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, i64 %2, i64 5 83*9880d681SAndroid Build Coastguard Worker ret i64 %3 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t9 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oge float %a, 0.000000e+00 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float 0.000000e+00, float %a 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi float %1 to i8 90*9880d681SAndroid Build Coastguard Workerdefine i8 @t9(float %a) { 91*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult float %a, 0.0 92*9880d681SAndroid Build Coastguard Worker %2 = fptosi float %a to i8 93*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, i8 %2, i8 0 94*9880d681SAndroid Build Coastguard Worker ret i8 %3 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t11 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp fast oge float %b, %a 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float %a, float %b 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi 101*9880d681SAndroid Build Coastguard Workerdefine i8 @t11(float %a, float %b) { 102*9880d681SAndroid Build Coastguard Worker ; Either operand could be NaN, but fast modifier applied. 103*9880d681SAndroid Build Coastguard Worker %1 = fcmp fast ult float %b, %a 104*9880d681SAndroid Build Coastguard Worker %2 = fptosi float %a to i8 105*9880d681SAndroid Build Coastguard Worker %3 = fptosi float %b to i8 106*9880d681SAndroid Build Coastguard Worker %4 = select i1 %1, i8 %3, i8 %2 107*9880d681SAndroid Build Coastguard Worker ret i8 %4 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t12 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp nnan oge float %b, %a 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float %a, float %b 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi float %.v to i8 114*9880d681SAndroid Build Coastguard Workerdefine i8 @t12(float %a, float %b) { 115*9880d681SAndroid Build Coastguard Worker ; Either operand could be NaN, but nnan modifier applied. 116*9880d681SAndroid Build Coastguard Worker %1 = fcmp nnan ult float %b, %a 117*9880d681SAndroid Build Coastguard Worker %2 = fptosi float %a to i8 118*9880d681SAndroid Build Coastguard Worker %3 = fptosi float %b to i8 119*9880d681SAndroid Build Coastguard Worker %4 = select i1 %1, i8 %3, i8 %2 120*9880d681SAndroid Build Coastguard Worker ret i8 %4 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t13 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ult float %a, 1.500000e+00 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi float %a to i8 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %1, i8 %2, i8 1 127*9880d681SAndroid Build Coastguard Workerdefine i8 @t13(float %a) { 128*9880d681SAndroid Build Coastguard Worker ; Float and int values do not match. 129*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult float %a, 1.5 130*9880d681SAndroid Build Coastguard Worker %2 = fptosi float %a to i8 131*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, i8 %2, i8 1 132*9880d681SAndroid Build Coastguard Worker ret i8 %3 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t14 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ule float %a, 0.000000e+00 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi float %a to i8 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %1, i8 %2, i8 0 139*9880d681SAndroid Build Coastguard Workerdefine i8 @t14(float %a) { 140*9880d681SAndroid Build Coastguard Worker ; <= comparison, where %a could be -0.0. Not safe. 141*9880d681SAndroid Build Coastguard Worker %1 = fcmp ule float %a, 0.0 142*9880d681SAndroid Build Coastguard Worker %2 = fptosi float %a to i8 143*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, i8 %2, i8 0 144*9880d681SAndroid Build Coastguard Worker ret i8 %3 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t15 148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp nsz oge float %a, 0.000000e+00 149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float 0.000000e+00, float %a 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi float %1 to i8 151*9880d681SAndroid Build Coastguard Workerdefine i8 @t15(float %a) { 152*9880d681SAndroid Build Coastguard Worker %1 = fcmp nsz ule float %a, 0.0 153*9880d681SAndroid Build Coastguard Worker %2 = fptosi float %a to i8 154*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, i8 %2, i8 0 155*9880d681SAndroid Build Coastguard Worker ret i8 %3 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t16 159*9880d681SAndroid Build Coastguard Worker; CHECK: %[[cmp:.*]] = icmp sgt i32 %x, 0 160*9880d681SAndroid Build Coastguard Worker; CHECK: %[[cst:.*]] = sitofp i32 %x to double 161*9880d681SAndroid Build Coastguard Worker; CHECK: %[[sel:.*]] = select i1 %[[cmp]], double %[[cst]], double 5.000000e-01 162*9880d681SAndroid Build Coastguard Worker; CHECK: ret double %[[sel]] 163*9880d681SAndroid Build Coastguard Workerdefine double @t16(i32 %x) { 164*9880d681SAndroid Build Coastguard Workerentry: 165*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %x, 0 166*9880d681SAndroid Build Coastguard Worker %cst = sitofp i32 %x to double 167*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, double %cst, double 5.000000e-01 168*9880d681SAndroid Build Coastguard Worker ret double %sel 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t17 172*9880d681SAndroid Build Coastguard Worker; CHECK: %[[cmp:.*]] = icmp sgt i32 %x, 2 173*9880d681SAndroid Build Coastguard Worker; CHECK: %[[sel:.*]] = select i1 %[[cmp]], i32 %x, i32 2 174*9880d681SAndroid Build Coastguard Worker; CHECK: %[[cst:.*]] = sitofp i32 %[[sel]] to double 175*9880d681SAndroid Build Coastguard Worker; CHECK: ret double %[[cst]] 176*9880d681SAndroid Build Coastguard Workerdefine double @t17(i32 %x) { 177*9880d681SAndroid Build Coastguard Workerentry: 178*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %x, 2 179*9880d681SAndroid Build Coastguard Worker %cst = sitofp i32 %x to double 180*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, double %cst, double 2.0 181*9880d681SAndroid Build Coastguard Worker ret double %sel 182*9880d681SAndroid Build Coastguard Worker} 183