1*6ad1dd3bSLee Wei; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2*6ad1dd3bSLee Wei; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3*6ad1dd3bSLee Wei 4*6ad1dd3bSLee Weideclare void @use(i8) 5*6ad1dd3bSLee Wei 6*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and(i8 %x) { 7*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and( 8*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 9*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -127 10*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP1]], 1 11*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 [[TMP3]] 12*6ad1dd3bSLee Wei; 13*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 14*6ad1dd3bSLee Wei %2 = and i32 %1, -2147483647 15*6ad1dd3bSLee Wei %3 = icmp eq i32 %2, 1 16*6ad1dd3bSLee Wei ret i1 %3 17*6ad1dd3bSLee Wei} 18*6ad1dd3bSLee Wei 19*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and1(i8 %x) { 20*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and1( 21*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 22*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -127 23*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP1]], 1 24*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 [[TMP3]] 25*6ad1dd3bSLee Wei; 26*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 27*6ad1dd3bSLee Wei %2 = and i32 %1, -2147483647 28*6ad1dd3bSLee Wei %3 = icmp ne i32 %2, 1 29*6ad1dd3bSLee Wei ret i1 %3 30*6ad1dd3bSLee Wei} 31*6ad1dd3bSLee Wei 32*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and2(i8 %x) { 33*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and2( 34*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 35*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -126 36*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP1]], 2 37*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 [[TMP3]] 38*6ad1dd3bSLee Wei; 39*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 40*6ad1dd3bSLee Wei %2 = and i32 %1, 1073741826 41*6ad1dd3bSLee Wei %3 = icmp eq i32 %2, 2 42*6ad1dd3bSLee Wei ret i1 %3 43*6ad1dd3bSLee Wei} 44*6ad1dd3bSLee Wei 45*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and3(i8 %x) { 46*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and3( 47*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 48*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -126 49*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP1]], 2 50*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 [[TMP3]] 51*6ad1dd3bSLee Wei; 52*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 53*6ad1dd3bSLee Wei %2 = and i32 %1, 1073741826 54*6ad1dd3bSLee Wei %3 = icmp ne i32 %2, 2 55*6ad1dd3bSLee Wei ret i1 %3 56*6ad1dd3bSLee Wei} 57*6ad1dd3bSLee Wei 58*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_multi_use(i8 %x) { 59*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use( 60*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 61*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32 62*6ad1dd3bSLee Wei; CHECK-NEXT: call void @use(i32 [[TMP1]]) 63*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -127 64*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], 1 65*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 [[TMP3]] 66*6ad1dd3bSLee Wei; 67*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 68*6ad1dd3bSLee Wei call void @use(i32 %1) 69*6ad1dd3bSLee Wei %2 = and i32 %1, -2147483647 70*6ad1dd3bSLee Wei %3 = icmp eq i32 %2, 1 71*6ad1dd3bSLee Wei ret i1 %3 72*6ad1dd3bSLee Wei} 73*6ad1dd3bSLee Wei 74*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_multi_use1(i8 %x) { 75*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use1( 76*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 77*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32 78*6ad1dd3bSLee Wei; CHECK-NEXT: call void @use(i32 [[TMP1]]) 79*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -127 80*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], 1 81*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 [[TMP3]] 82*6ad1dd3bSLee Wei; 83*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 84*6ad1dd3bSLee Wei call void @use(i32 %1) 85*6ad1dd3bSLee Wei %2 = and i32 %1, -2147483647 86*6ad1dd3bSLee Wei %3 = icmp ne i32 %2, 1 87*6ad1dd3bSLee Wei ret i1 %3 88*6ad1dd3bSLee Wei} 89*6ad1dd3bSLee Wei 90*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_multi_use2(i8 %x) { 91*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use2( 92*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 93*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32 94*6ad1dd3bSLee Wei; CHECK-NEXT: call void @use(i32 [[TMP1]]) 95*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -126 96*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], 2 97*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 [[TMP3]] 98*6ad1dd3bSLee Wei; 99*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 100*6ad1dd3bSLee Wei call void @use(i32 %1) 101*6ad1dd3bSLee Wei %2 = and i32 %1, 1073741826 102*6ad1dd3bSLee Wei %3 = icmp eq i32 %2, 2 103*6ad1dd3bSLee Wei ret i1 %3 104*6ad1dd3bSLee Wei} 105*6ad1dd3bSLee Wei 106*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_multi_use3(i8 %x) { 107*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use3( 108*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 109*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32 110*6ad1dd3bSLee Wei; CHECK-NEXT: call void @use(i32 [[TMP1]]) 111*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -126 112*6ad1dd3bSLee Wei; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], 2 113*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 [[TMP3]] 114*6ad1dd3bSLee Wei; 115*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 116*6ad1dd3bSLee Wei call void @use(i32 %1) 117*6ad1dd3bSLee Wei %2 = and i32 %1, 1073741826 118*6ad1dd3bSLee Wei %3 = icmp ne i32 %2, 2 119*6ad1dd3bSLee Wei ret i1 %3 120*6ad1dd3bSLee Wei} 121*6ad1dd3bSLee Wei 122*6ad1dd3bSLee Wei; Negative tests 123*6ad1dd3bSLee Wei 124*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong(i8 %x) { 125*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong( 126*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 127*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 false 128*6ad1dd3bSLee Wei; 129*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 130*6ad1dd3bSLee Wei %2 = and i32 %1, -2147483647 131*6ad1dd3bSLee Wei %3 = icmp eq i32 %2, -1 132*6ad1dd3bSLee Wei ret i1 %3 133*6ad1dd3bSLee Wei} 134*6ad1dd3bSLee Wei 135*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong2(i8 %x) { 136*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong2( 137*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 138*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 false 139*6ad1dd3bSLee Wei; 140*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 141*6ad1dd3bSLee Wei %2 = and i32 %1, -2147483647 142*6ad1dd3bSLee Wei %3 = icmp eq i32 %2, 128 143*6ad1dd3bSLee Wei ret i1 %3 144*6ad1dd3bSLee Wei} 145*6ad1dd3bSLee Wei 146*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong3(i8 %x) { 147*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong3( 148*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 149*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 false 150*6ad1dd3bSLee Wei; 151*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 152*6ad1dd3bSLee Wei %2 = and i32 %1, 128 153*6ad1dd3bSLee Wei %3 = icmp eq i32 %2, -2147483648 154*6ad1dd3bSLee Wei ret i1 %3 155*6ad1dd3bSLee Wei} 156*6ad1dd3bSLee Wei 157*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong4(i8 %x) { 158*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong4( 159*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 160*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 false 161*6ad1dd3bSLee Wei; 162*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 163*6ad1dd3bSLee Wei %2 = and i32 %1, 128 164*6ad1dd3bSLee Wei %3 = icmp eq i32 %2, 1 165*6ad1dd3bSLee Wei ret i1 %3 166*6ad1dd3bSLee Wei} 167*6ad1dd3bSLee Wei 168*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong5(i8 %x) { 169*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong5( 170*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 171*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 false 172*6ad1dd3bSLee Wei; 173*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 174*6ad1dd3bSLee Wei %2 = and i32 %1, -256 175*6ad1dd3bSLee Wei %3 = icmp eq i32 %2, 1 176*6ad1dd3bSLee Wei ret i1 %3 177*6ad1dd3bSLee Wei} 178*6ad1dd3bSLee Wei 179*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong6(i8 %x) { 180*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong6( 181*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 182*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 true 183*6ad1dd3bSLee Wei; 184*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 185*6ad1dd3bSLee Wei %2 = and i32 %1, -2147483647 186*6ad1dd3bSLee Wei %3 = icmp ne i32 %2, -1 187*6ad1dd3bSLee Wei ret i1 %3 188*6ad1dd3bSLee Wei} 189*6ad1dd3bSLee Wei 190*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong7(i8 %x) { 191*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong7( 192*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 193*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 true 194*6ad1dd3bSLee Wei; 195*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 196*6ad1dd3bSLee Wei %2 = and i32 %1, -2147483647 197*6ad1dd3bSLee Wei %3 = icmp ne i32 %2, 128 198*6ad1dd3bSLee Wei ret i1 %3 199*6ad1dd3bSLee Wei} 200*6ad1dd3bSLee Wei 201*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong8(i8 %x) { 202*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong8( 203*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 204*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 true 205*6ad1dd3bSLee Wei; 206*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 207*6ad1dd3bSLee Wei %2 = and i32 %1, 128 208*6ad1dd3bSLee Wei %3 = icmp ne i32 %2, -2147483648 209*6ad1dd3bSLee Wei ret i1 %3 210*6ad1dd3bSLee Wei} 211*6ad1dd3bSLee Wei 212*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong9(i8 %x) { 213*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong9( 214*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 215*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 true 216*6ad1dd3bSLee Wei; 217*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 218*6ad1dd3bSLee Wei %2 = and i32 %1, 128 219*6ad1dd3bSLee Wei %3 = icmp ne i32 %2, 1 220*6ad1dd3bSLee Wei ret i1 %3 221*6ad1dd3bSLee Wei} 222*6ad1dd3bSLee Wei 223*6ad1dd3bSLee Weidefine i1 @fold_sext_to_and_wrong10(i8 %x) { 224*6ad1dd3bSLee Wei; CHECK-LABEL: define i1 @fold_sext_to_and_wrong10( 225*6ad1dd3bSLee Wei; CHECK-SAME: i8 [[X:%.*]]) { 226*6ad1dd3bSLee Wei; CHECK-NEXT: ret i1 true 227*6ad1dd3bSLee Wei; 228*6ad1dd3bSLee Wei %1 = sext i8 %x to i32 229*6ad1dd3bSLee Wei %2 = and i32 %1, -256 230*6ad1dd3bSLee Wei %3 = icmp ne i32 %2, 1 231*6ad1dd3bSLee Wei ret i1 %3 232*6ad1dd3bSLee Wei} 233