1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; This test makes sure that all icmp instructions are eliminated. 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker@X = external global i32 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i1 @test1(i32 %A) { 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 10*9880d681SAndroid Build Coastguard Worker; 11*9880d681SAndroid Build Coastguard Worker %B = icmp eq i32 %A, %A 12*9880d681SAndroid Build Coastguard Worker ; Never true 13*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32* @X, null 14*9880d681SAndroid Build Coastguard Worker %D = and i1 %B, %C 15*9880d681SAndroid Build Coastguard Worker ret i1 %D 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine i1 @test2(i32 %A) { 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 21*9880d681SAndroid Build Coastguard Worker; 22*9880d681SAndroid Build Coastguard Worker %B = icmp ne i32 %A, %A 23*9880d681SAndroid Build Coastguard Worker ; Never false 24*9880d681SAndroid Build Coastguard Worker %C = icmp ne i32* @X, null 25*9880d681SAndroid Build Coastguard Worker %D = or i1 %B, %C 26*9880d681SAndroid Build Coastguard Worker ret i1 %D 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i1 @test3(i32 %A) { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 32*9880d681SAndroid Build Coastguard Worker; 33*9880d681SAndroid Build Coastguard Worker %B = icmp slt i32 %A, %A 34*9880d681SAndroid Build Coastguard Worker ret i1 %B 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine i1 @test4(i32 %A) { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 41*9880d681SAndroid Build Coastguard Worker; 42*9880d681SAndroid Build Coastguard Worker %B = icmp sgt i32 %A, %A 43*9880d681SAndroid Build Coastguard Worker ret i1 %B 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine i1 @test5(i32 %A) { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 49*9880d681SAndroid Build Coastguard Worker; 50*9880d681SAndroid Build Coastguard Worker %B = icmp sle i32 %A, %A 51*9880d681SAndroid Build Coastguard Worker ret i1 %B 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine i1 @test6(i32 %A) { 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 57*9880d681SAndroid Build Coastguard Worker; 58*9880d681SAndroid Build Coastguard Worker %B = icmp sge i32 %A, %A 59*9880d681SAndroid Build Coastguard Worker ret i1 %B 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine i1 @test7(i32 %A) { 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 65*9880d681SAndroid Build Coastguard Worker; 66*9880d681SAndroid Build Coastguard Worker %B = icmp uge i32 %A, 0 67*9880d681SAndroid Build Coastguard Worker ret i1 %B 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdefine i1 @test8(i32 %A) { 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 73*9880d681SAndroid Build Coastguard Worker; 74*9880d681SAndroid Build Coastguard Worker %B = icmp ult i32 %A, 0 75*9880d681SAndroid Build Coastguard Worker ret i1 %B 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker;; test operations on boolean values these should all be eliminated$a 79*9880d681SAndroid Build Coastguard Workerdefine i1 @test9(i1 %A) { 80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 82*9880d681SAndroid Build Coastguard Worker; 83*9880d681SAndroid Build Coastguard Worker %B = icmp ult i1 %A, false 84*9880d681SAndroid Build Coastguard Worker ret i1 %B 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine i1 @test10(i1 %A) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 90*9880d681SAndroid Build Coastguard Worker; 91*9880d681SAndroid Build Coastguard Worker %B = icmp ugt i1 %A, true 92*9880d681SAndroid Build Coastguard Worker ret i1 %B 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine i1 @test11(i1 %A) { 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 98*9880d681SAndroid Build Coastguard Worker; 99*9880d681SAndroid Build Coastguard Worker %B = icmp ule i1 %A, true 100*9880d681SAndroid Build Coastguard Worker ret i1 %B 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine i1 @test12(i1 %A) { 104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 106*9880d681SAndroid Build Coastguard Worker; 107*9880d681SAndroid Build Coastguard Worker %B = icmp uge i1 %A, false 108*9880d681SAndroid Build Coastguard Worker ret i1 %B 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdefine i1 @test13(i1 %A, i1 %B) { 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CTMP:%.*]] = xor i1 %B, true 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = or i1 [[CTMP]], %A 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 116*9880d681SAndroid Build Coastguard Worker; 117*9880d681SAndroid Build Coastguard Worker %C = icmp uge i1 %A, %B 118*9880d681SAndroid Build Coastguard Worker ret i1 %C 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test13vec(<2 x i1> %A, <2 x i1> %B) { 122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13vec( 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CTMP:%.*]] = xor <2 x i1> %B, <i1 true, i1 true> 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = or <2 x i1> [[CTMP]], %A 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[C]] 126*9880d681SAndroid Build Coastguard Worker; 127*9880d681SAndroid Build Coastguard Worker %C = icmp uge <2 x i1> %A, %B 128*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %C 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdefine i1 @test14(i1 %A, i1 %B) { 132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14( 133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CTMP:%.*]] = xor i1 %A, %B 134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = xor i1 [[CTMP]], true 135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 136*9880d681SAndroid Build Coastguard Worker; 137*9880d681SAndroid Build Coastguard Worker %C = icmp eq i1 %A, %B 138*9880d681SAndroid Build Coastguard Worker ret i1 %C 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdefine <3 x i1> @test14vec(<3 x i1> %A, <3 x i1> %B) { 142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14vec( 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CTMP:%.*]] = xor <3 x i1> %A, %B 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = xor <3 x i1> [[CTMP]], <i1 true, i1 true, i1 true> 145*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <3 x i1> [[C]] 146*9880d681SAndroid Build Coastguard Worker; 147*9880d681SAndroid Build Coastguard Worker %C = icmp eq <3 x i1> %A, %B 148*9880d681SAndroid Build Coastguard Worker ret <3 x i1> %C 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine i1 @test16(i32 %A) { 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16( 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 154*9880d681SAndroid Build Coastguard Worker; 155*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, 5 156*9880d681SAndroid Build Coastguard Worker ; Is never true 157*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32 %B, 8 158*9880d681SAndroid Build Coastguard Worker ret i1 %C 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdefine i1 @test17(i8 %A) { 162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17( 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 164*9880d681SAndroid Build Coastguard Worker; 165*9880d681SAndroid Build Coastguard Worker %B = or i8 %A, 1 166*9880d681SAndroid Build Coastguard Worker ; Always false 167*9880d681SAndroid Build Coastguard Worker %C = icmp eq i8 %B, 2 168*9880d681SAndroid Build Coastguard Worker ret i1 %C 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdefine i1 @test18(i1 %C, i32 %a) { 172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18( 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %C, label %endif, label %else 175*9880d681SAndroid Build Coastguard Worker; CHECK: else: 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %endif 177*9880d681SAndroid Build Coastguard Worker; CHECK: endif: 178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 179*9880d681SAndroid Build Coastguard Worker; 180*9880d681SAndroid Build Coastguard Workerentry: 181*9880d681SAndroid Build Coastguard Worker br i1 %C, label %endif, label %else 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerelse: 184*9880d681SAndroid Build Coastguard Worker br label %endif 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerendif: 187*9880d681SAndroid Build Coastguard Worker %b.0 = phi i32 [ 0, %entry ], [ 1, %else ] 188*9880d681SAndroid Build Coastguard Worker %tmp.4 = icmp slt i32 %b.0, 123 189*9880d681SAndroid Build Coastguard Worker ret i1 %tmp.4 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdefine i1 @test19(i1 %A, i1 %B) { 193*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19( 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CTMP:%.*]] = xor i1 %A, %B 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = xor i1 [[CTMP]], true 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 197*9880d681SAndroid Build Coastguard Worker; 198*9880d681SAndroid Build Coastguard Worker %a = zext i1 %A to i32 199*9880d681SAndroid Build Coastguard Worker %b = zext i1 %B to i32 200*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32 %a, %b 201*9880d681SAndroid Build Coastguard Worker ret i1 %C 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Workerdefine i32 @test20(i32 %A) { 205*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20( 206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = and i32 %A, 1 207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[B]] 208*9880d681SAndroid Build Coastguard Worker; 209*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, 1 210*9880d681SAndroid Build Coastguard Worker %C = icmp ne i32 %B, 0 211*9880d681SAndroid Build Coastguard Worker %D = zext i1 %C to i32 212*9880d681SAndroid Build Coastguard Worker ret i32 %D 213*9880d681SAndroid Build Coastguard Worker} 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Workerdefine i32 @test21(i32 %a) { 216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21( 217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_6:%.*]] = lshr i32 %a, 2 218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_6_LOBIT:%.*]] = and i32 [[TMP_6]], 1 219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TMP_6_LOBIT]] 220*9880d681SAndroid Build Coastguard Worker; 221*9880d681SAndroid Build Coastguard Worker %tmp.6 = and i32 %a, 4 222*9880d681SAndroid Build Coastguard Worker %not.tmp.7 = icmp ne i32 %tmp.6, 0 223*9880d681SAndroid Build Coastguard Worker %retval = zext i1 %not.tmp.7 to i32 224*9880d681SAndroid Build Coastguard Worker ret i32 %retval 225*9880d681SAndroid Build Coastguard Worker} 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Workerdefine i1 @test22(i32 %A, i32 %X) { 228*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test22( 229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 230*9880d681SAndroid Build Coastguard Worker; 231*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, 100663295 232*9880d681SAndroid Build Coastguard Worker %C = icmp ult i32 %B, 268435456 233*9880d681SAndroid Build Coastguard Worker %Y = and i32 %X, 7 234*9880d681SAndroid Build Coastguard Worker %Z = icmp sgt i32 %Y, -1 235*9880d681SAndroid Build Coastguard Worker %R = or i1 %C, %Z 236*9880d681SAndroid Build Coastguard Worker ret i1 %R 237*9880d681SAndroid Build Coastguard Worker} 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Workerdefine i32 @test23(i32 %a) { 240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23( 241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_1:%.*]] = and i32 %a, 1 242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[TMP_1]], 1 243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TMP1]] 244*9880d681SAndroid Build Coastguard Worker; 245*9880d681SAndroid Build Coastguard Worker %tmp.1 = and i32 %a, 1 246*9880d681SAndroid Build Coastguard Worker %tmp.2 = icmp eq i32 %tmp.1, 0 247*9880d681SAndroid Build Coastguard Worker %tmp.3 = zext i1 %tmp.2 to i32 248*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.3 249*9880d681SAndroid Build Coastguard Worker} 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Workerdefine i32 @test24(i32 %a) { 252*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24( 253*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_1:%.*]] = lshr i32 %a, 2 254*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_1_LOBIT:%.*]] = and i32 [[TMP_1]], 1 255*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[TMP_1_LOBIT]], 1 256*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TMP1]] 257*9880d681SAndroid Build Coastguard Worker; 258*9880d681SAndroid Build Coastguard Worker %tmp1 = and i32 %a, 4 259*9880d681SAndroid Build Coastguard Worker %tmp.1 = lshr i32 %tmp1, 2 260*9880d681SAndroid Build Coastguard Worker %tmp.2 = icmp eq i32 %tmp.1, 0 261*9880d681SAndroid Build Coastguard Worker %tmp.3 = zext i1 %tmp.2 to i32 262*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.3 263*9880d681SAndroid Build Coastguard Worker} 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Workerdefine i1 @test25(i32 %A) { 266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25( 267*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 268*9880d681SAndroid Build Coastguard Worker; 269*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, 2 270*9880d681SAndroid Build Coastguard Worker %C = icmp ugt i32 %B, 2 271*9880d681SAndroid Build Coastguard Worker ret i1 %C 272*9880d681SAndroid Build Coastguard Worker} 273*9880d681SAndroid Build Coastguard Worker 274