1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv1(i32 %x) { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv1( 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = sdiv i32 %x, 8 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Y]] 8*9880d681SAndroid Build Coastguard Worker; 9*9880d681SAndroid Build Coastguard Worker %y = sdiv i32 %x, 8 10*9880d681SAndroid Build Coastguard Worker ret i32 %y 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv2(i32 %x) { 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv2( 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = ashr exact i32 %x, 3 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Y]] 17*9880d681SAndroid Build Coastguard Worker; 18*9880d681SAndroid Build Coastguard Worker %y = sdiv exact i32 %x, 8 19*9880d681SAndroid Build Coastguard Worker ret i32 %y 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @sdiv2_vec(<2 x i32> %x) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv2_vec( 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = ashr exact <2 x i32> %x, <i32 7, i32 7> 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i32> [[Y]] 26*9880d681SAndroid Build Coastguard Worker; 27*9880d681SAndroid Build Coastguard Worker %y = sdiv exact <2 x i32> %x, <i32 128, i32 128> 28*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %y 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv3(i32 %x) { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv3( 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = srem i32 %x, 3 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = sub i32 %x, [[Y]] 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Z]] 36*9880d681SAndroid Build Coastguard Worker; 37*9880d681SAndroid Build Coastguard Worker %y = sdiv i32 %x, 3 38*9880d681SAndroid Build Coastguard Worker %z = mul i32 %y, 3 39*9880d681SAndroid Build Coastguard Worker ret i32 %z 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv4(i32 %x) { 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv4( 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %x 45*9880d681SAndroid Build Coastguard Worker; 46*9880d681SAndroid Build Coastguard Worker %y = sdiv exact i32 %x, 3 47*9880d681SAndroid Build Coastguard Worker %z = mul i32 %y, 3 48*9880d681SAndroid Build Coastguard Worker ret i32 %z 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv5(i32 %x) { 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv5( 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = srem i32 %x, 3 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = sub i32 [[Y]], %x 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Z]] 56*9880d681SAndroid Build Coastguard Worker; 57*9880d681SAndroid Build Coastguard Worker %y = sdiv i32 %x, 3 58*9880d681SAndroid Build Coastguard Worker %z = mul i32 %y, -3 59*9880d681SAndroid Build Coastguard Worker ret i32 %z 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv6(i32 %x) { 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv6( 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = sub i32 0, %x 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Z]] 66*9880d681SAndroid Build Coastguard Worker; 67*9880d681SAndroid Build Coastguard Worker %y = sdiv exact i32 %x, 3 68*9880d681SAndroid Build Coastguard Worker %z = mul i32 %y, -3 69*9880d681SAndroid Build Coastguard Worker ret i32 %z 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv1(i32 %x, i32 %w) { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv1( 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %x 75*9880d681SAndroid Build Coastguard Worker; 76*9880d681SAndroid Build Coastguard Worker %y = udiv exact i32 %x, %w 77*9880d681SAndroid Build Coastguard Worker %z = mul i32 %y, %w 78*9880d681SAndroid Build Coastguard Worker ret i32 %z 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv2(i32 %x, i32 %w) { 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv2( 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = lshr exact i32 %x, %w 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Z]] 85*9880d681SAndroid Build Coastguard Worker; 86*9880d681SAndroid Build Coastguard Worker %y = shl i32 1, %w 87*9880d681SAndroid Build Coastguard Worker %z = udiv exact i32 %x, %y 88*9880d681SAndroid Build Coastguard Worker ret i32 %z 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdefine i64 @ashr1(i64 %X) nounwind { 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ashr1( 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = shl i64 %X, 8 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = ashr exact i64 [[A]], 2 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[B]] 96*9880d681SAndroid Build Coastguard Worker; 97*9880d681SAndroid Build Coastguard Worker %A = shl i64 %X, 8 98*9880d681SAndroid Build Coastguard Worker %B = ashr i64 %A, 2 ; X/4 99*9880d681SAndroid Build Coastguard Worker ret i64 %B 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; PR9120 103*9880d681SAndroid Build Coastguard Workerdefine i1 @ashr_icmp1(i64 %X) nounwind { 104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ashr_icmp1( 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = icmp eq i64 %X, 0 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[B]] 107*9880d681SAndroid Build Coastguard Worker; 108*9880d681SAndroid Build Coastguard Worker %A = ashr exact i64 %X, 2 ; X/4 109*9880d681SAndroid Build Coastguard Worker %B = icmp eq i64 %A, 0 110*9880d681SAndroid Build Coastguard Worker ret i1 %B 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine i1 @ashr_icmp2(i64 %X) nounwind { 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ashr_icmp2( 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = icmp slt i64 %X, 16 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[Z]] 117*9880d681SAndroid Build Coastguard Worker; 118*9880d681SAndroid Build Coastguard Worker %Y = ashr exact i64 %X, 2 ; x / 4 119*9880d681SAndroid Build Coastguard Worker %Z = icmp slt i64 %Y, 4 ; x < 16 120*9880d681SAndroid Build Coastguard Worker ret i1 %Z 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; PR9998 124*9880d681SAndroid Build Coastguard Worker; Make sure we don't transform the ashr here into an sdiv 125*9880d681SAndroid Build Coastguard Workerdefine i1 @pr9998(i32 %V) nounwind { 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr9998( 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[W_MASK:%.*]] = and i32 %V, 1 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = icmp ne i32 [[W_MASK]], 0 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[Z]] 130*9880d681SAndroid Build Coastguard Worker; 131*9880d681SAndroid Build Coastguard Worker %W = shl i32 %V, 31 132*9880d681SAndroid Build Coastguard Worker %X = ashr exact i32 %W, 31 133*9880d681SAndroid Build Coastguard Worker %Y = sext i32 %X to i64 134*9880d681SAndroid Build Coastguard Worker %Z = icmp ugt i64 %Y, 7297771788697658747 135*9880d681SAndroid Build Coastguard Worker ret i1 %Z 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdefine i1 @udiv_icmp1(i64 %X) { 139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv_icmp1( 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 %X, 0 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 142*9880d681SAndroid Build Coastguard Worker; 143*9880d681SAndroid Build Coastguard Worker %A = udiv exact i64 %X, 5 ; X/5 144*9880d681SAndroid Build Coastguard Worker %B = icmp ne i64 %A, 0 145*9880d681SAndroid Build Coastguard Worker ret i1 %B 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerdefine i1 @udiv_icmp2(i64 %X) { 149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv_icmp2( 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 %X, 0 151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 152*9880d681SAndroid Build Coastguard Worker; 153*9880d681SAndroid Build Coastguard Worker %A = udiv exact i64 %X, 5 ; X/5 == 0 --> x == 0 154*9880d681SAndroid Build Coastguard Worker %B = icmp eq i64 %A, 0 155*9880d681SAndroid Build Coastguard Worker ret i1 %B 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp1(i64 %X) { 159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp1( 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 %X, 0 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 162*9880d681SAndroid Build Coastguard Worker; 163*9880d681SAndroid Build Coastguard Worker %A = sdiv exact i64 %X, 5 ; X/5 == 0 --> x == 0 164*9880d681SAndroid Build Coastguard Worker %B = icmp eq i64 %A, 0 165*9880d681SAndroid Build Coastguard Worker ret i1 %B 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp2(i64 %X) { 169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp2( 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 %X, 5 171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 172*9880d681SAndroid Build Coastguard Worker; 173*9880d681SAndroid Build Coastguard Worker %A = sdiv exact i64 %X, 5 ; X/5 == 1 --> x == 5 174*9880d681SAndroid Build Coastguard Worker %B = icmp eq i64 %A, 1 175*9880d681SAndroid Build Coastguard Worker ret i1 %B 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp3(i64 %X) { 179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp3( 180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 %X, -5 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 182*9880d681SAndroid Build Coastguard Worker; 183*9880d681SAndroid Build Coastguard Worker %A = sdiv exact i64 %X, 5 ; X/5 == -1 --> x == -5 184*9880d681SAndroid Build Coastguard Worker %B = icmp eq i64 %A, -1 185*9880d681SAndroid Build Coastguard Worker ret i1 %B 186*9880d681SAndroid Build Coastguard Worker} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp4(i64 %X) { 189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp4( 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 %X, 0 191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 192*9880d681SAndroid Build Coastguard Worker; 193*9880d681SAndroid Build Coastguard Worker %A = sdiv exact i64 %X, -5 ; X/-5 == 0 --> x == 0 194*9880d681SAndroid Build Coastguard Worker %B = icmp eq i64 %A, 0 195*9880d681SAndroid Build Coastguard Worker ret i1 %B 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp5(i64 %X) { 199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp5( 200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 %X, -5 201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 202*9880d681SAndroid Build Coastguard Worker; 203*9880d681SAndroid Build Coastguard Worker %A = sdiv exact i64 %X, -5 ; X/-5 == 1 --> x == -5 204*9880d681SAndroid Build Coastguard Worker %B = icmp eq i64 %A, 1 205*9880d681SAndroid Build Coastguard Worker ret i1 %B 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp6(i64 %X) { 209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp6( 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 %X, 5 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 212*9880d681SAndroid Build Coastguard Worker; 213*9880d681SAndroid Build Coastguard Worker %A = sdiv exact i64 %X, -5 ; X/-5 == 1 --> x == 5 214*9880d681SAndroid Build Coastguard Worker %B = icmp eq i64 %A, -1 215*9880d681SAndroid Build Coastguard Worker ret i1 %B 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218