1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -reassociate -gvn -instcombine -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes='reassociate,gvn,instcombine' -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %arg) { 5*9880d681SAndroid Build Coastguard Worker %tmp1 = sub i32 -12, %arg 6*9880d681SAndroid Build Coastguard Worker %tmp2 = add i32 %tmp1, 12 7*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i32 0, %arg 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %reg109, i32 %reg1111) { 15*9880d681SAndroid Build Coastguard Worker %reg115 = add i32 %reg109, -30 16*9880d681SAndroid Build Coastguard Worker %reg116 = add i32 %reg115, %reg1111 17*9880d681SAndroid Build Coastguard Worker %reg117 = add i32 %reg116, 30 18*9880d681SAndroid Build Coastguard Worker ret i32 %reg117 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %reg117 = add i32 %reg1111, %reg109 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %reg117 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker@e = external global i32 26*9880d681SAndroid Build Coastguard Worker@a = external global i32 27*9880d681SAndroid Build Coastguard Worker@b = external global i32 28*9880d681SAndroid Build Coastguard Worker@c = external global i32 29*9880d681SAndroid Build Coastguard Worker@f = external global i32 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine void @test3() { 32*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* @a 33*9880d681SAndroid Build Coastguard Worker %B = load i32, i32* @b 34*9880d681SAndroid Build Coastguard Worker %C = load i32, i32* @c 35*9880d681SAndroid Build Coastguard Worker %t1 = add i32 %A, %B 36*9880d681SAndroid Build Coastguard Worker %t2 = add i32 %t1, %C 37*9880d681SAndroid Build Coastguard Worker %t3 = add i32 %C, %A 38*9880d681SAndroid Build Coastguard Worker %t4 = add i32 %t3, %B 39*9880d681SAndroid Build Coastguard Worker ; e = (a+b)+c; 40*9880d681SAndroid Build Coastguard Worker store i32 %t2, i32* @e 41*9880d681SAndroid Build Coastguard Worker ; f = (a+c)+b 42*9880d681SAndroid Build Coastguard Worker store i32 %t4, i32* @f 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3 46*9880d681SAndroid Build Coastguard Worker; CHECK: add i32 47*9880d681SAndroid Build Coastguard Worker; CHECK: add i32 48*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add i32 49*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdefine void @test4() { 53*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* @a 54*9880d681SAndroid Build Coastguard Worker %B = load i32, i32* @b 55*9880d681SAndroid Build Coastguard Worker %C = load i32, i32* @c 56*9880d681SAndroid Build Coastguard Worker %t1 = add i32 %A, %B 57*9880d681SAndroid Build Coastguard Worker %t2 = add i32 %t1, %C 58*9880d681SAndroid Build Coastguard Worker %t3 = add i32 %C, %A 59*9880d681SAndroid Build Coastguard Worker %t4 = add i32 %t3, %B 60*9880d681SAndroid Build Coastguard Worker ; e = c+(a+b) 61*9880d681SAndroid Build Coastguard Worker store i32 %t2, i32* @e 62*9880d681SAndroid Build Coastguard Worker ; f = (c+a)+b 63*9880d681SAndroid Build Coastguard Worker store i32 %t4, i32* @f 64*9880d681SAndroid Build Coastguard Worker ret void 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4 67*9880d681SAndroid Build Coastguard Worker; CHECK: add i32 68*9880d681SAndroid Build Coastguard Worker; CHECK: add i32 69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add i32 70*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdefine void @test5() { 74*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* @a 75*9880d681SAndroid Build Coastguard Worker %B = load i32, i32* @b 76*9880d681SAndroid Build Coastguard Worker %C = load i32, i32* @c 77*9880d681SAndroid Build Coastguard Worker %t1 = add i32 %B, %A 78*9880d681SAndroid Build Coastguard Worker %t2 = add i32 %t1, %C 79*9880d681SAndroid Build Coastguard Worker %t3 = add i32 %C, %A 80*9880d681SAndroid Build Coastguard Worker %t4 = add i32 %t3, %B 81*9880d681SAndroid Build Coastguard Worker ; e = c+(b+a) 82*9880d681SAndroid Build Coastguard Worker store i32 %t2, i32* @e 83*9880d681SAndroid Build Coastguard Worker ; f = (c+a)+b 84*9880d681SAndroid Build Coastguard Worker store i32 %t4, i32* @f 85*9880d681SAndroid Build Coastguard Worker ret void 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5 88*9880d681SAndroid Build Coastguard Worker; CHECK: add i32 89*9880d681SAndroid Build Coastguard Worker; CHECK: add i32 90*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add i32 91*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerdefine i32 @test6() { 95*9880d681SAndroid Build Coastguard Worker %tmp.0 = load i32, i32* @a 96*9880d681SAndroid Build Coastguard Worker %tmp.1 = load i32, i32* @b 97*9880d681SAndroid Build Coastguard Worker ; (a+b) 98*9880d681SAndroid Build Coastguard Worker %tmp.2 = add i32 %tmp.0, %tmp.1 99*9880d681SAndroid Build Coastguard Worker %tmp.4 = load i32, i32* @c 100*9880d681SAndroid Build Coastguard Worker ; (a+b)+c 101*9880d681SAndroid Build Coastguard Worker %tmp.5 = add i32 %tmp.2, %tmp.4 102*9880d681SAndroid Build Coastguard Worker ; (a+c) 103*9880d681SAndroid Build Coastguard Worker %tmp.8 = add i32 %tmp.0, %tmp.4 104*9880d681SAndroid Build Coastguard Worker ; (a+c)+b 105*9880d681SAndroid Build Coastguard Worker %tmp.11 = add i32 %tmp.8, %tmp.1 106*9880d681SAndroid Build Coastguard Worker ; X ^ X = 0 107*9880d681SAndroid Build Coastguard Worker %RV = xor i32 %tmp.5, %tmp.11 108*9880d681SAndroid Build Coastguard Worker ret i32 %RV 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6 111*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; This should be one add and two multiplies. 115*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %A, i32 %B, i32 %C) { 116*9880d681SAndroid Build Coastguard Worker ; A*A*B + A*C*A 117*9880d681SAndroid Build Coastguard Worker %aa = mul i32 %A, %A 118*9880d681SAndroid Build Coastguard Worker %aab = mul i32 %aa, %B 119*9880d681SAndroid Build Coastguard Worker %ac = mul i32 %A, %C 120*9880d681SAndroid Build Coastguard Worker %aac = mul i32 %ac, %A 121*9880d681SAndroid Build Coastguard Worker %r = add i32 %aab, %aac 122*9880d681SAndroid Build Coastguard Worker ret i32 %r 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add i32 %C, %B 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32 %X, i32 %Y, i32 %Z) { 132*9880d681SAndroid Build Coastguard Worker %A = sub i32 0, %X 133*9880d681SAndroid Build Coastguard Worker %B = mul i32 %A, %Y 134*9880d681SAndroid Build Coastguard Worker ; (-X)*Y + Z -> Z-X*Y 135*9880d681SAndroid Build Coastguard Worker %C = add i32 %B, %Z 136*9880d681SAndroid Build Coastguard Worker ret i32 %C 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %A = mul i32 %Y, %X 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %C = sub i32 %Z, %A 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %C 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; PR5458 145*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32 %X) { 146*9880d681SAndroid Build Coastguard Worker %Y = mul i32 %X, 47 147*9880d681SAndroid Build Coastguard Worker %Z = add i32 %Y, %Y 148*9880d681SAndroid Build Coastguard Worker ret i32 %Z 149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %X, 94 151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 152*9880d681SAndroid Build Coastguard Worker} 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32 %X) { 155*9880d681SAndroid Build Coastguard Worker %Y = add i32 %X ,%X 156*9880d681SAndroid Build Coastguard Worker %Z = add i32 %Y, %X 157*9880d681SAndroid Build Coastguard Worker ret i32 %Z 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %X, 3 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %W) { 164*9880d681SAndroid Build Coastguard Worker %X = mul i32 %W, 127 165*9880d681SAndroid Build Coastguard Worker %Y = add i32 %X ,%X 166*9880d681SAndroid Build Coastguard Worker %Z = add i32 %Y, %X 167*9880d681SAndroid Build Coastguard Worker ret i32 %Z 168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %W, 381 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdeclare void @mumble(i32) 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(i32 %X) { 176*9880d681SAndroid Build Coastguard Worker %X.neg = sub nsw nuw i32 0, %X 177*9880d681SAndroid Build Coastguard Worker call void @mumble(i32 %X.neg) 178*9880d681SAndroid Build Coastguard Worker %A = sub i32 1, %X 179*9880d681SAndroid Build Coastguard Worker %B = sub i32 2, %X 180*9880d681SAndroid Build Coastguard Worker %C = sub i32 3, %X 181*9880d681SAndroid Build Coastguard Worker %Y = add i32 %A ,%B 182*9880d681SAndroid Build Coastguard Worker %Z = add i32 %Y, %C 183*9880d681SAndroid Build Coastguard Worker ret i32 %Z 184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12 185*9880d681SAndroid Build Coastguard Worker; CHECK: %[[mul:.*]] = mul i32 %X, -3 186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add i32 %[[mul]], 6 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 188*9880d681SAndroid Build Coastguard Worker} 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(i32 %X1, i32 %X2, i32 %X3) { 191*9880d681SAndroid Build Coastguard Worker %A = sub i32 0, %X1 192*9880d681SAndroid Build Coastguard Worker %B = mul i32 %A, %X2 ; -X1*X2 193*9880d681SAndroid Build Coastguard Worker %C = mul i32 %X1, %X3 ; X1*X3 194*9880d681SAndroid Build Coastguard Worker %D = add i32 %B, %C ; -X1*X2 + X1*X3 -> X1*(X3-X2) 195*9880d681SAndroid Build Coastguard Worker ret i32 %D 196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13 197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i32 %X3, %X2 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 {{.*}}, %X1 199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 200*9880d681SAndroid Build Coastguard Worker} 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker; PR5359 203*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(i32 %X1, i32 %X2) { 204*9880d681SAndroid Build Coastguard Worker %B = mul i32 %X1, 47 ; X1*47 205*9880d681SAndroid Build Coastguard Worker %C = mul i32 %X2, -47 ; X2*-47 206*9880d681SAndroid Build Coastguard Worker %D = add i32 %B, %C ; X1*47 + X2*-47 -> 47*(X1-X2) 207*9880d681SAndroid Build Coastguard Worker ret i32 %D 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[SUB:.*]] = sub i32 %X1, %X2 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %[[SUB]], 47 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 213*9880d681SAndroid Build Coastguard Worker} 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Worker; Do not reassociate expressions of type i1 216*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(i32 %X1, i32 %X2, i32 %X3) { 217*9880d681SAndroid Build Coastguard Worker %A = icmp ne i32 %X1, 0 218*9880d681SAndroid Build Coastguard Worker %B = icmp slt i32 %X2, %X3 219*9880d681SAndroid Build Coastguard Worker %C = and i1 %A, %B 220*9880d681SAndroid Build Coastguard Worker %D = select i1 %C, i32 %X1, i32 0 221*9880d681SAndroid Build Coastguard Worker ret i32 %D 222*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15 223*9880d681SAndroid Build Coastguard Worker; CHECK: and i1 %A, %B 224*9880d681SAndroid Build Coastguard Worker} 225