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: icmp 5*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sext 7*9880d681SAndroid Build Coastguard Workerdefine i64 @t1(i32 %a) { 8*9880d681SAndroid Build Coastguard Worker ; This is the canonical form for a type-changing min/max. 9*9880d681SAndroid Build Coastguard Worker %1 = icmp slt i32 %a, 5 10*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, i32 %a, i32 5 11*9880d681SAndroid Build Coastguard Worker %3 = sext i32 %2 to i64 12*9880d681SAndroid Build Coastguard Worker ret i64 %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: icmp 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sext 19*9880d681SAndroid Build Coastguard Workerdefine i64 @t2(i32 %a) { 20*9880d681SAndroid Build Coastguard Worker ; Check this is converted into canonical form, as above. 21*9880d681SAndroid Build Coastguard Worker %1 = icmp slt i32 %a, 5 22*9880d681SAndroid Build Coastguard Worker %2 = sext i32 %a to i64 23*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, i64 %2, i64 5 24*9880d681SAndroid Build Coastguard Worker ret i64 %3 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t3 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: zext 31*9880d681SAndroid Build Coastguard Workerdefine i64 @t3(i32 %a) { 32*9880d681SAndroid Build Coastguard Worker ; Same as @t2, with flipped operands and zext instead of sext. 33*9880d681SAndroid Build Coastguard Worker %1 = icmp ult i32 %a, 5 34*9880d681SAndroid Build Coastguard Worker %2 = zext i32 %a to i64 35*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, i64 5, i64 %2 36*9880d681SAndroid Build Coastguard Worker ret i64 %3 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t4 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: trunc 43*9880d681SAndroid Build Coastguard Workerdefine i32 @t4(i64 %a) { 44*9880d681SAndroid Build Coastguard Worker ; Same again, with trunc. 45*9880d681SAndroid Build Coastguard Worker %1 = icmp slt i64 %a, 5 46*9880d681SAndroid Build Coastguard Worker %2 = trunc i64 %a to i32 47*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, i32 %2, i32 5 48*9880d681SAndroid Build Coastguard Worker ret i32 %3 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t5 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: zext 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select 55*9880d681SAndroid Build Coastguard Workerdefine i64 @t5(i32 %a) { 56*9880d681SAndroid Build Coastguard Worker ; Same as @t3, but with mismatched signedness between icmp and zext. 57*9880d681SAndroid Build Coastguard Worker ; InstCombine should leave this alone. 58*9880d681SAndroid Build Coastguard Worker %1 = icmp slt i32 %a, 5 59*9880d681SAndroid Build Coastguard Worker %2 = zext i32 %a to i64 60*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, i64 5, i64 %2 61*9880d681SAndroid Build Coastguard Worker ret i64 %3 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t6 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sitofp 68*9880d681SAndroid Build Coastguard Workerdefine float @t6(i32 %a) { 69*9880d681SAndroid Build Coastguard Worker %1 = icmp slt i32 %a, 0 70*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, i32 %a, i32 0 71*9880d681SAndroid Build Coastguard Worker %3 = sitofp i32 %2 to float 72*9880d681SAndroid Build Coastguard Worker ret float %3 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t7 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: trunc 79*9880d681SAndroid Build Coastguard Workerdefine i16 @t7(i32 %a) { 80*9880d681SAndroid Build Coastguard Worker %1 = icmp slt i32 %a, -32768 81*9880d681SAndroid Build Coastguard Worker %2 = trunc i32 %a to i16 82*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, i16 %2, i16 -32768 83*9880d681SAndroid Build Coastguard Worker ret i16 %3 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; Just check for no infinite loop. InstSimplify liked to 87*9880d681SAndroid Build Coastguard Worker; "simplify" -32767 by removing all the sign bits, 88*9880d681SAndroid Build Coastguard Worker; which led to a canonicalization fight between different 89*9880d681SAndroid Build Coastguard Worker; parts of instcombine. 90*9880d681SAndroid Build Coastguard Workerdefine i32 @t8(i64 %a, i32 %b) { 91*9880d681SAndroid Build Coastguard Worker %1 = icmp slt i64 %a, -32767 92*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, i64 %a, i64 -32767 93*9880d681SAndroid Build Coastguard Worker %3 = trunc i64 %2 to i32 94*9880d681SAndroid Build Coastguard Worker %4 = icmp slt i32 %b, 42 95*9880d681SAndroid Build Coastguard Worker %5 = select i1 %4, i32 42, i32 %3 96*9880d681SAndroid Build Coastguard Worker %6 = icmp ne i32 %5, %b 97*9880d681SAndroid Build Coastguard Worker %7 = zext i1 %6 to i32 98*9880d681SAndroid Build Coastguard Worker ret i32 %7 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; Ensure this doesn't get converted to a min/max. 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t9 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sext 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 4294967295 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 107*9880d681SAndroid Build Coastguard Workerdefine i64 @t9(i32 %a) { 108*9880d681SAndroid Build Coastguard Worker %1 = icmp sgt i32 %a, -1 109*9880d681SAndroid Build Coastguard Worker %2 = sext i32 %a to i64 110*9880d681SAndroid Build Coastguard Worker %3 = select i1 %1, i64 %2, i64 4294967295 111*9880d681SAndroid Build Coastguard Worker ret i64 %3 112*9880d681SAndroid Build Coastguard Worker} 113