1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -reassociate -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Tests involving repeated operations on the same value. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine i8 @nilpotent(i8 %x) { 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nilpotent( 7*9880d681SAndroid Build Coastguard Worker %tmp = xor i8 %x, %x 8*9880d681SAndroid Build Coastguard Worker ret i8 %tmp 9*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 0 10*9880d681SAndroid Build Coastguard Worker} 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine i2 @idempotent(i2 %x) { 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @idempotent( 14*9880d681SAndroid Build Coastguard Worker %tmp1 = and i2 %x, %x 15*9880d681SAndroid Build Coastguard Worker %tmp2 = and i2 %tmp1, %x 16*9880d681SAndroid Build Coastguard Worker %tmp3 = and i2 %tmp2, %x 17*9880d681SAndroid Build Coastguard Worker ret i2 %tmp3 18*9880d681SAndroid Build Coastguard Worker; CHECK: ret i2 %x 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine i2 @add(i2 %x) { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @add( 23*9880d681SAndroid Build Coastguard Worker %tmp1 = add i2 %x, %x 24*9880d681SAndroid Build Coastguard Worker %tmp2 = add i2 %tmp1, %x 25*9880d681SAndroid Build Coastguard Worker %tmp3 = add i2 %tmp2, %x 26*9880d681SAndroid Build Coastguard Worker ret i2 %tmp3 27*9880d681SAndroid Build Coastguard Worker; CHECK: ret i2 0 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine i2 @cst_add() { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cst_add( 32*9880d681SAndroid Build Coastguard Worker %tmp1 = add i2 1, 1 33*9880d681SAndroid Build Coastguard Worker %tmp2 = add i2 %tmp1, 1 34*9880d681SAndroid Build Coastguard Worker ret i2 %tmp2 35*9880d681SAndroid Build Coastguard Worker; CHECK: ret i2 -1 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine i8 @cst_mul() { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cst_mul( 40*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i8 3, 3 41*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i8 %tmp1, 3 42*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i8 %tmp2, 3 43*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i8 %tmp3, 3 44*9880d681SAndroid Build Coastguard Worker ret i8 %tmp4 45*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 -13 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i3 @foo3x5(i3 %x) { 49*9880d681SAndroid Build Coastguard Worker; Can be done with two multiplies. 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo3x5( 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 54*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i3 %x, %x 55*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i3 %tmp1, %x 56*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i3 %tmp2, %x 57*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i3 %tmp3, %x 58*9880d681SAndroid Build Coastguard Worker ret i3 %tmp4 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine i3 @foo3x6(i3 %x) { 62*9880d681SAndroid Build Coastguard Worker; Can be done with two multiplies. 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo3x6( 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 67*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i3 %x, %x 68*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i3 %tmp1, %x 69*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i3 %tmp2, %x 70*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i3 %tmp3, %x 71*9880d681SAndroid Build Coastguard Worker %tmp5 = mul i3 %tmp4, %x 72*9880d681SAndroid Build Coastguard Worker ret i3 %tmp5 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine i3 @foo3x7(i3 %x) { 76*9880d681SAndroid Build Coastguard Worker; Can be done with two multiplies. 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo3x7( 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 81*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i3 %x, %x 82*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i3 %tmp1, %x 83*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i3 %tmp2, %x 84*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i3 %tmp3, %x 85*9880d681SAndroid Build Coastguard Worker %tmp5 = mul i3 %tmp4, %x 86*9880d681SAndroid Build Coastguard Worker %tmp6 = mul i3 %tmp5, %x 87*9880d681SAndroid Build Coastguard Worker ret i3 %tmp6 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine i4 @foo4x8(i4 %x) { 91*9880d681SAndroid Build Coastguard Worker; Can be done with two multiplies. 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo4x8( 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 96*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i4 %x, %x 97*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i4 %tmp1, %x 98*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i4 %tmp2, %x 99*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i4 %tmp3, %x 100*9880d681SAndroid Build Coastguard Worker %tmp5 = mul i4 %tmp4, %x 101*9880d681SAndroid Build Coastguard Worker %tmp6 = mul i4 %tmp5, %x 102*9880d681SAndroid Build Coastguard Worker %tmp7 = mul i4 %tmp6, %x 103*9880d681SAndroid Build Coastguard Worker ret i4 %tmp7 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine i4 @foo4x9(i4 %x) { 107*9880d681SAndroid Build Coastguard Worker; Can be done with three multiplies. 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo4x9( 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 113*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i4 %x, %x 114*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i4 %tmp1, %x 115*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i4 %tmp2, %x 116*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i4 %tmp3, %x 117*9880d681SAndroid Build Coastguard Worker %tmp5 = mul i4 %tmp4, %x 118*9880d681SAndroid Build Coastguard Worker %tmp6 = mul i4 %tmp5, %x 119*9880d681SAndroid Build Coastguard Worker %tmp7 = mul i4 %tmp6, %x 120*9880d681SAndroid Build Coastguard Worker %tmp8 = mul i4 %tmp7, %x 121*9880d681SAndroid Build Coastguard Worker ret i4 %tmp8 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerdefine i4 @foo4x10(i4 %x) { 125*9880d681SAndroid Build Coastguard Worker; Can be done with three multiplies. 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo4x10( 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 131*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i4 %x, %x 132*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i4 %tmp1, %x 133*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i4 %tmp2, %x 134*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i4 %tmp3, %x 135*9880d681SAndroid Build Coastguard Worker %tmp5 = mul i4 %tmp4, %x 136*9880d681SAndroid Build Coastguard Worker %tmp6 = mul i4 %tmp5, %x 137*9880d681SAndroid Build Coastguard Worker %tmp7 = mul i4 %tmp6, %x 138*9880d681SAndroid Build Coastguard Worker %tmp8 = mul i4 %tmp7, %x 139*9880d681SAndroid Build Coastguard Worker %tmp9 = mul i4 %tmp8, %x 140*9880d681SAndroid Build Coastguard Worker ret i4 %tmp9 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Workerdefine i4 @foo4x11(i4 %x) { 144*9880d681SAndroid Build Coastguard Worker; Can be done with four multiplies. 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo4x11( 146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 151*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i4 %x, %x 152*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i4 %tmp1, %x 153*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i4 %tmp2, %x 154*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i4 %tmp3, %x 155*9880d681SAndroid Build Coastguard Worker %tmp5 = mul i4 %tmp4, %x 156*9880d681SAndroid Build Coastguard Worker %tmp6 = mul i4 %tmp5, %x 157*9880d681SAndroid Build Coastguard Worker %tmp7 = mul i4 %tmp6, %x 158*9880d681SAndroid Build Coastguard Worker %tmp8 = mul i4 %tmp7, %x 159*9880d681SAndroid Build Coastguard Worker %tmp9 = mul i4 %tmp8, %x 160*9880d681SAndroid Build Coastguard Worker %tmp10 = mul i4 %tmp9, %x 161*9880d681SAndroid Build Coastguard Worker ret i4 %tmp10 162*9880d681SAndroid Build Coastguard Worker} 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Workerdefine i4 @foo4x12(i4 %x) { 165*9880d681SAndroid Build Coastguard Worker; Can be done with two multiplies. 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo4x12( 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 170*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i4 %x, %x 171*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i4 %tmp1, %x 172*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i4 %tmp2, %x 173*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i4 %tmp3, %x 174*9880d681SAndroid Build Coastguard Worker %tmp5 = mul i4 %tmp4, %x 175*9880d681SAndroid Build Coastguard Worker %tmp6 = mul i4 %tmp5, %x 176*9880d681SAndroid Build Coastguard Worker %tmp7 = mul i4 %tmp6, %x 177*9880d681SAndroid Build Coastguard Worker %tmp8 = mul i4 %tmp7, %x 178*9880d681SAndroid Build Coastguard Worker %tmp9 = mul i4 %tmp8, %x 179*9880d681SAndroid Build Coastguard Worker %tmp10 = mul i4 %tmp9, %x 180*9880d681SAndroid Build Coastguard Worker %tmp11 = mul i4 %tmp10, %x 181*9880d681SAndroid Build Coastguard Worker ret i4 %tmp11 182*9880d681SAndroid Build Coastguard Worker} 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Workerdefine i4 @foo4x13(i4 %x) { 185*9880d681SAndroid Build Coastguard Worker; Can be done with three multiplies. 186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo4x13( 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 191*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i4 %x, %x 192*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i4 %tmp1, %x 193*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i4 %tmp2, %x 194*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i4 %tmp3, %x 195*9880d681SAndroid Build Coastguard Worker %tmp5 = mul i4 %tmp4, %x 196*9880d681SAndroid Build Coastguard Worker %tmp6 = mul i4 %tmp5, %x 197*9880d681SAndroid Build Coastguard Worker %tmp7 = mul i4 %tmp6, %x 198*9880d681SAndroid Build Coastguard Worker %tmp8 = mul i4 %tmp7, %x 199*9880d681SAndroid Build Coastguard Worker %tmp9 = mul i4 %tmp8, %x 200*9880d681SAndroid Build Coastguard Worker %tmp10 = mul i4 %tmp9, %x 201*9880d681SAndroid Build Coastguard Worker %tmp11 = mul i4 %tmp10, %x 202*9880d681SAndroid Build Coastguard Worker %tmp12 = mul i4 %tmp11, %x 203*9880d681SAndroid Build Coastguard Worker ret i4 %tmp12 204*9880d681SAndroid Build Coastguard Worker} 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerdefine i4 @foo4x14(i4 %x) { 207*9880d681SAndroid Build Coastguard Worker; Can be done with three multiplies. 208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo4x14( 209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 213*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i4 %x, %x 214*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i4 %tmp1, %x 215*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i4 %tmp2, %x 216*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i4 %tmp3, %x 217*9880d681SAndroid Build Coastguard Worker %tmp5 = mul i4 %tmp4, %x 218*9880d681SAndroid Build Coastguard Worker %tmp6 = mul i4 %tmp5, %x 219*9880d681SAndroid Build Coastguard Worker %tmp7 = mul i4 %tmp6, %x 220*9880d681SAndroid Build Coastguard Worker %tmp8 = mul i4 %tmp7, %x 221*9880d681SAndroid Build Coastguard Worker %tmp9 = mul i4 %tmp8, %x 222*9880d681SAndroid Build Coastguard Worker %tmp10 = mul i4 %tmp9, %x 223*9880d681SAndroid Build Coastguard Worker %tmp11 = mul i4 %tmp10, %x 224*9880d681SAndroid Build Coastguard Worker %tmp12 = mul i4 %tmp11, %x 225*9880d681SAndroid Build Coastguard Worker %tmp13 = mul i4 %tmp12, %x 226*9880d681SAndroid Build Coastguard Worker ret i4 %tmp13 227*9880d681SAndroid Build Coastguard Worker} 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerdefine i4 @foo4x15(i4 %x) { 230*9880d681SAndroid Build Coastguard Worker; Can be done with four multiplies. 231*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo4x15( 232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul 236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 237*9880d681SAndroid Build Coastguard Worker %tmp1 = mul i4 %x, %x 238*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i4 %tmp1, %x 239*9880d681SAndroid Build Coastguard Worker %tmp3 = mul i4 %tmp2, %x 240*9880d681SAndroid Build Coastguard Worker %tmp4 = mul i4 %tmp3, %x 241*9880d681SAndroid Build Coastguard Worker %tmp5 = mul i4 %tmp4, %x 242*9880d681SAndroid Build Coastguard Worker %tmp6 = mul i4 %tmp5, %x 243*9880d681SAndroid Build Coastguard Worker %tmp7 = mul i4 %tmp6, %x 244*9880d681SAndroid Build Coastguard Worker %tmp8 = mul i4 %tmp7, %x 245*9880d681SAndroid Build Coastguard Worker %tmp9 = mul i4 %tmp8, %x 246*9880d681SAndroid Build Coastguard Worker %tmp10 = mul i4 %tmp9, %x 247*9880d681SAndroid Build Coastguard Worker %tmp11 = mul i4 %tmp10, %x 248*9880d681SAndroid Build Coastguard Worker %tmp12 = mul i4 %tmp11, %x 249*9880d681SAndroid Build Coastguard Worker %tmp13 = mul i4 %tmp12, %x 250*9880d681SAndroid Build Coastguard Worker %tmp14 = mul i4 %tmp13, %x 251*9880d681SAndroid Build Coastguard Worker ret i4 %tmp14 252*9880d681SAndroid Build Coastguard Worker} 253