1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instsimplify -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @add1(i32 %x) { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @add1( 6*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker; (X + -1) + 1 -> X 9*9880d681SAndroid Build Coastguard Worker %l = add i32 %x, -1 10*9880d681SAndroid Build Coastguard Worker %r = add i32 %l, 1 11*9880d681SAndroid Build Coastguard Worker ret i32 %r 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine i32 @and1(i32 %x, i32 %y) { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @and1( 16*9880d681SAndroid Build Coastguard Worker; CHECK: [[L:%.*]] = and i32 %x, %y 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[L]] 18*9880d681SAndroid Build Coastguard Worker; 19*9880d681SAndroid Build Coastguard Worker; (X & Y) & X -> X & Y 20*9880d681SAndroid Build Coastguard Worker %l = and i32 %x, %y 21*9880d681SAndroid Build Coastguard Worker %r = and i32 %l, %x 22*9880d681SAndroid Build Coastguard Worker ret i32 %r 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine i32 @and2(i32 %x, i32 %y) { 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @and2( 27*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%.*]] = and i32 %x, %y 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[R]] 29*9880d681SAndroid Build Coastguard Worker; 30*9880d681SAndroid Build Coastguard Worker; X & (X & Y) -> X & Y 31*9880d681SAndroid Build Coastguard Worker %r = and i32 %x, %y 32*9880d681SAndroid Build Coastguard Worker %l = and i32 %x, %r 33*9880d681SAndroid Build Coastguard Worker ret i32 %l 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine i32 @or1(i32 %x, i32 %y) { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @or1( 38*9880d681SAndroid Build Coastguard Worker; CHECK: [[L:%.*]] = or i32 %x, %y 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[L]] 40*9880d681SAndroid Build Coastguard Worker; 41*9880d681SAndroid Build Coastguard Worker; (X | Y) | X -> X | Y 42*9880d681SAndroid Build Coastguard Worker %l = or i32 %x, %y 43*9880d681SAndroid Build Coastguard Worker %r = or i32 %l, %x 44*9880d681SAndroid Build Coastguard Worker ret i32 %r 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine i32 @or2(i32 %x, i32 %y) { 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @or2( 49*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%.*]] = or i32 %x, %y 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[R]] 51*9880d681SAndroid Build Coastguard Worker; 52*9880d681SAndroid Build Coastguard Worker; X | (X | Y) -> X | Y 53*9880d681SAndroid Build Coastguard Worker %r = or i32 %x, %y 54*9880d681SAndroid Build Coastguard Worker %l = or i32 %x, %r 55*9880d681SAndroid Build Coastguard Worker ret i32 %l 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine i32 @xor1(i32 %x, i32 %y) { 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @xor1( 60*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %y 61*9880d681SAndroid Build Coastguard Worker; 62*9880d681SAndroid Build Coastguard Worker; (X ^ Y) ^ X = Y 63*9880d681SAndroid Build Coastguard Worker %l = xor i32 %x, %y 64*9880d681SAndroid Build Coastguard Worker %r = xor i32 %l, %x 65*9880d681SAndroid Build Coastguard Worker ret i32 %r 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine i32 @xor2(i32 %x, i32 %y) { 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @xor2( 70*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %y 71*9880d681SAndroid Build Coastguard Worker; 72*9880d681SAndroid Build Coastguard Worker; X ^ (X ^ Y) = Y 73*9880d681SAndroid Build Coastguard Worker %r = xor i32 %x, %y 74*9880d681SAndroid Build Coastguard Worker %l = xor i32 %x, %r 75*9880d681SAndroid Build Coastguard Worker ret i32 %l 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine i32 @sub1(i32 %x, i32 %y) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sub1( 80*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %y 81*9880d681SAndroid Build Coastguard Worker; 82*9880d681SAndroid Build Coastguard Worker %d = sub i32 %x, %y 83*9880d681SAndroid Build Coastguard Worker %r = sub i32 %x, %d 84*9880d681SAndroid Build Coastguard Worker ret i32 %r 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine i32 @sub2(i32 %x) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sub2( 89*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 -1 90*9880d681SAndroid Build Coastguard Worker; 91*9880d681SAndroid Build Coastguard Worker; X - (X + 1) -> -1 92*9880d681SAndroid Build Coastguard Worker %xp1 = add i32 %x, 1 93*9880d681SAndroid Build Coastguard Worker %r = sub i32 %x, %xp1 94*9880d681SAndroid Build Coastguard Worker ret i32 %r 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine i32 @sub3(i32 %x, i32 %y) { 98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sub3( 99*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 100*9880d681SAndroid Build Coastguard Worker; 101*9880d681SAndroid Build Coastguard Worker; ((X + 1) + Y) - (Y + 1) -> X 102*9880d681SAndroid Build Coastguard Worker %xp1 = add i32 %x, 1 103*9880d681SAndroid Build Coastguard Worker %lhs = add i32 %xp1, %y 104*9880d681SAndroid Build Coastguard Worker %rhs = add i32 %y, 1 105*9880d681SAndroid Build Coastguard Worker %r = sub i32 %lhs, %rhs 106*9880d681SAndroid Build Coastguard Worker ret i32 %r 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv1(i32 %x, i32 %y) { 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv1( 111*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 112*9880d681SAndroid Build Coastguard Worker; 113*9880d681SAndroid Build Coastguard Worker; (no overflow X * Y) / Y -> X 114*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %x, %y 115*9880d681SAndroid Build Coastguard Worker %r = sdiv i32 %mul, %y 116*9880d681SAndroid Build Coastguard Worker ret i32 %r 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv2(i32 %x, i32 %y) { 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv2( 121*9880d681SAndroid Build Coastguard Worker; CHECK: [[DIV:%.*]] = sdiv i32 %x, %y 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[DIV]] 123*9880d681SAndroid Build Coastguard Worker; 124*9880d681SAndroid Build Coastguard Worker; (((X / Y) * Y) / Y) -> X / Y 125*9880d681SAndroid Build Coastguard Worker %div = sdiv i32 %x, %y 126*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %div, %y 127*9880d681SAndroid Build Coastguard Worker %r = sdiv i32 %mul, %y 128*9880d681SAndroid Build Coastguard Worker ret i32 %r 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv3(i32 %x, i32 %y) { 132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv3( 133*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 134*9880d681SAndroid Build Coastguard Worker; 135*9880d681SAndroid Build Coastguard Worker; (X rem Y) / Y -> 0 136*9880d681SAndroid Build Coastguard Worker %rem = srem i32 %x, %y 137*9880d681SAndroid Build Coastguard Worker %div = sdiv i32 %rem, %y 138*9880d681SAndroid Build Coastguard Worker ret i32 %div 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv4(i32 %x, i32 %y) { 142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv4( 143*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 144*9880d681SAndroid Build Coastguard Worker; 145*9880d681SAndroid Build Coastguard Worker; (X / Y) * Y -> X if the division is exact 146*9880d681SAndroid Build Coastguard Worker %div = sdiv exact i32 %x, %y 147*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %div, %y 148*9880d681SAndroid Build Coastguard Worker ret i32 %mul 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv5(i32 %x, i32 %y) { 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv5( 153*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 154*9880d681SAndroid Build Coastguard Worker; 155*9880d681SAndroid Build Coastguard Worker; Y * (X / Y) -> X if the division is exact 156*9880d681SAndroid Build Coastguard Worker %div = sdiv exact i32 %x, %y 157*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %y, %div 158*9880d681SAndroid Build Coastguard Worker ret i32 %mul 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv1(i32 %x, i32 %y) { 163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv1( 164*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 165*9880d681SAndroid Build Coastguard Worker; 166*9880d681SAndroid Build Coastguard Worker; (no overflow X * Y) / Y -> X 167*9880d681SAndroid Build Coastguard Worker %mul = mul nuw i32 %x, %y 168*9880d681SAndroid Build Coastguard Worker %r = udiv i32 %mul, %y 169*9880d681SAndroid Build Coastguard Worker ret i32 %r 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv2(i32 %x, i32 %y) { 173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv2( 174*9880d681SAndroid Build Coastguard Worker; CHECK: [[DIV:%.*]] = udiv i32 %x, %y 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[DIV]] 176*9880d681SAndroid Build Coastguard Worker; 177*9880d681SAndroid Build Coastguard Worker; (((X / Y) * Y) / Y) -> X / Y 178*9880d681SAndroid Build Coastguard Worker %div = udiv i32 %x, %y 179*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %div, %y 180*9880d681SAndroid Build Coastguard Worker %r = udiv i32 %mul, %y 181*9880d681SAndroid Build Coastguard Worker ret i32 %r 182*9880d681SAndroid Build Coastguard Worker} 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv3(i32 %x, i32 %y) { 185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv3( 186*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 187*9880d681SAndroid Build Coastguard Worker; 188*9880d681SAndroid Build Coastguard Worker; (X rem Y) / Y -> 0 189*9880d681SAndroid Build Coastguard Worker %rem = urem i32 %x, %y 190*9880d681SAndroid Build Coastguard Worker %div = udiv i32 %rem, %y 191*9880d681SAndroid Build Coastguard Worker ret i32 %div 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv4(i32 %x, i32 %y) { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv4( 196*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 197*9880d681SAndroid Build Coastguard Worker; 198*9880d681SAndroid Build Coastguard Worker; (X / Y) * Y -> X if the division is exact 199*9880d681SAndroid Build Coastguard Worker %div = udiv exact i32 %x, %y 200*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %div, %y 201*9880d681SAndroid Build Coastguard Worker ret i32 %mul 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv5(i32 %x, i32 %y) { 205*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv5( 206*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 207*9880d681SAndroid Build Coastguard Worker; 208*9880d681SAndroid Build Coastguard Worker; Y * (X / Y) -> X if the division is exact 209*9880d681SAndroid Build Coastguard Worker %div = udiv exact i32 %x, %y 210*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %y, %div 211*9880d681SAndroid Build Coastguard Worker ret i32 %mul 212*9880d681SAndroid Build Coastguard Worker} 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerdefine i16 @trunc1(i32 %x) { 215*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @trunc1( 216*9880d681SAndroid Build Coastguard Worker; CHECK: ret i16 1 217*9880d681SAndroid Build Coastguard Worker; 218*9880d681SAndroid Build Coastguard Worker %y = add i32 %x, 1 219*9880d681SAndroid Build Coastguard Worker %tx = trunc i32 %x to i16 220*9880d681SAndroid Build Coastguard Worker %ty = trunc i32 %y to i16 221*9880d681SAndroid Build Coastguard Worker %d = sub i16 %ty, %tx 222*9880d681SAndroid Build Coastguard Worker ret i16 %d 223*9880d681SAndroid Build Coastguard Worker} 224