blob: 11c67bea2cb0a2a1680806813f644383b0902494 [file] [log] [blame]
Chad Rosier5ea14e02014-06-11 18:28:45 +00001; RUN: opt < %s -reassociate -gvn -instcombine -S | FileCheck %s
Justin Bognerc2bf63d2016-04-26 23:39:29 +00002; RUN: opt < %s -passes='reassociate,gvn,instcombine' -S | FileCheck %s
Chris Lattner5a2dbc22002-05-08 21:34:22 +00003
Chris Lattner19a4baa2009-12-31 08:29:56 +00004define i32 @test1(i32 %arg) {
Chad Rosier5ea14e02014-06-11 18:28:45 +00005 %tmp1 = sub i32 -12, %arg
6 %tmp2 = add i32 %tmp1, 12
7 ret i32 %tmp2
8
9; CHECK-LABEL: @test1
Chris Lattner19a4baa2009-12-31 08:29:56 +000010; CHECK-NEXT: sub i32 0, %arg
11; CHECK-NEXT: ret i32
Chris Lattner5a2dbc22002-05-08 21:34:22 +000012}
Tanya Lattner0ea4c8d2008-03-19 04:36:04 +000013
Chris Lattner19a4baa2009-12-31 08:29:56 +000014define i32 @test2(i32 %reg109, i32 %reg1111) {
Chad Rosier5ea14e02014-06-11 18:28:45 +000015 %reg115 = add i32 %reg109, -30
16 %reg116 = add i32 %reg115, %reg1111
17 %reg117 = add i32 %reg116, 30
18 ret i32 %reg117
19
20; CHECK-LABEL: @test2
Chad Rosier90a2f9b2014-11-19 23:21:20 +000021; CHECK-NEXT: %reg117 = add i32 %reg1111, %reg109
Chad Rosier5ea14e02014-06-11 18:28:45 +000022; CHECK-NEXT: ret i32 %reg117
Chris Lattner19a4baa2009-12-31 08:29:56 +000023}
24
Chad Rosier5ea14e02014-06-11 18:28:45 +000025@e = external global i32
26@a = external global i32
27@b = external global i32
28@c = external global i32
29@f = external global i32
Chris Lattner19a4baa2009-12-31 08:29:56 +000030
31define void @test3() {
David Blaikiea79ac142015-02-27 21:17:42 +000032 %A = load i32, i32* @a
33 %B = load i32, i32* @b
34 %C = load i32, i32* @c
Chad Rosier5ea14e02014-06-11 18:28:45 +000035 %t1 = add i32 %A, %B
36 %t2 = add i32 %t1, %C
37 %t3 = add i32 %C, %A
38 %t4 = add i32 %t3, %B
39 ; e = (a+b)+c;
40 store i32 %t2, i32* @e
41 ; f = (a+c)+b
42 store i32 %t4, i32* @f
43 ret void
44
45; CHECK-LABEL: @test3
Chris Lattner19a4baa2009-12-31 08:29:56 +000046; CHECK: add i32
47; CHECK: add i32
48; CHECK-NOT: add i32
49; CHECK: ret void
50}
51
52define void @test4() {
David Blaikiea79ac142015-02-27 21:17:42 +000053 %A = load i32, i32* @a
54 %B = load i32, i32* @b
55 %C = load i32, i32* @c
Chad Rosier5ea14e02014-06-11 18:28:45 +000056 %t1 = add i32 %A, %B
57 %t2 = add i32 %t1, %C
58 %t3 = add i32 %C, %A
59 %t4 = add i32 %t3, %B
60 ; e = c+(a+b)
61 store i32 %t2, i32* @e
62 ; f = (c+a)+b
63 store i32 %t4, i32* @f
64 ret void
65
66; CHECK-LABEL: @test4
Chris Lattner19a4baa2009-12-31 08:29:56 +000067; CHECK: add i32
68; CHECK: add i32
69; CHECK-NOT: add i32
70; CHECK: ret void
71}
72
73define void @test5() {
David Blaikiea79ac142015-02-27 21:17:42 +000074 %A = load i32, i32* @a
75 %B = load i32, i32* @b
76 %C = load i32, i32* @c
Chad Rosier5ea14e02014-06-11 18:28:45 +000077 %t1 = add i32 %B, %A
78 %t2 = add i32 %t1, %C
79 %t3 = add i32 %C, %A
80 %t4 = add i32 %t3, %B
81 ; e = c+(b+a)
82 store i32 %t2, i32* @e
83 ; f = (c+a)+b
84 store i32 %t4, i32* @f
85 ret void
86
87; CHECK-LABEL: @test5
Chris Lattner19a4baa2009-12-31 08:29:56 +000088; CHECK: add i32
89; CHECK: add i32
90; CHECK-NOT: add i32
91; CHECK: ret void
92}
93
94define i32 @test6() {
David Blaikiea79ac142015-02-27 21:17:42 +000095 %tmp.0 = load i32, i32* @a
96 %tmp.1 = load i32, i32* @b
Chad Rosier5ea14e02014-06-11 18:28:45 +000097 ; (a+b)
98 %tmp.2 = add i32 %tmp.0, %tmp.1
David Blaikiea79ac142015-02-27 21:17:42 +000099 %tmp.4 = load i32, i32* @c
Chad Rosier5ea14e02014-06-11 18:28:45 +0000100 ; (a+b)+c
101 %tmp.5 = add i32 %tmp.2, %tmp.4
102 ; (a+c)
103 %tmp.8 = add i32 %tmp.0, %tmp.4
104 ; (a+c)+b
105 %tmp.11 = add i32 %tmp.8, %tmp.1
106 ; X ^ X = 0
107 %RV = xor i32 %tmp.5, %tmp.11
108 ret i32 %RV
109
110; CHECK-LABEL: @test6
Chris Lattner19a4baa2009-12-31 08:29:56 +0000111; CHECK: ret i32 0
112}
Chris Lattner2d3b53a2009-12-31 08:32:22 +0000113
114; This should be one add and two multiplies.
115define i32 @test7(i32 %A, i32 %B, i32 %C) {
Chad Rosier5ea14e02014-06-11 18:28:45 +0000116 ; A*A*B + A*C*A
117 %aa = mul i32 %A, %A
118 %aab = mul i32 %aa, %B
119 %ac = mul i32 %A, %C
120 %aac = mul i32 %ac, %A
121 %r = add i32 %aab, %aac
122 ret i32 %r
123
124; CHECK-LABEL: @test7
Chad Rosier90a2f9b2014-11-19 23:21:20 +0000125; CHECK-NEXT: add i32 %C, %B
Chris Lattner2d3b53a2009-12-31 08:32:22 +0000126; CHECK-NEXT: mul i32
127; CHECK-NEXT: mul i32
128; CHECK-NEXT: ret i32
129}
130
Chris Lattner2d3b53a2009-12-31 08:32:22 +0000131define i32 @test8(i32 %X, i32 %Y, i32 %Z) {
Chad Rosier5ea14e02014-06-11 18:28:45 +0000132 %A = sub i32 0, %X
133 %B = mul i32 %A, %Y
134 ; (-X)*Y + Z -> Z-X*Y
135 %C = add i32 %B, %Z
136 ret i32 %C
137
138; CHECK-LABEL: @test8
Chad Rosier90a2f9b2014-11-19 23:21:20 +0000139; CHECK-NEXT: %A = mul i32 %Y, %X
Chris Lattner2d3b53a2009-12-31 08:32:22 +0000140; CHECK-NEXT: %C = sub i32 %Z, %A
141; CHECK-NEXT: ret i32 %C
142}
Chris Lattner4e3a5672009-12-31 08:33:49 +0000143
Chris Lattner4e3a5672009-12-31 08:33:49 +0000144; PR5458
145define i32 @test9(i32 %X) {
146 %Y = mul i32 %X, 47
147 %Z = add i32 %Y, %Y
148 ret i32 %Z
Chad Rosier5ea14e02014-06-11 18:28:45 +0000149; CHECK-LABEL: @test9
Chris Lattner60b71b52009-12-31 19:24:52 +0000150; CHECK-NEXT: mul i32 %X, 94
151; CHECK-NEXT: ret i32
Chris Lattner4e3a5672009-12-31 08:33:49 +0000152}
Chris Lattner60b71b52009-12-31 19:24:52 +0000153
154define i32 @test10(i32 %X) {
155 %Y = add i32 %X ,%X
156 %Z = add i32 %Y, %X
157 ret i32 %Z
Chad Rosier5ea14e02014-06-11 18:28:45 +0000158; CHECK-LABEL: @test10
Chris Lattner60b71b52009-12-31 19:24:52 +0000159; CHECK-NEXT: mul i32 %X, 3
160; CHECK-NEXT: ret i32
161}
162
163define i32 @test11(i32 %W) {
164 %X = mul i32 %W, 127
165 %Y = add i32 %X ,%X
166 %Z = add i32 %Y, %X
167 ret i32 %Z
Chad Rosier5ea14e02014-06-11 18:28:45 +0000168; CHECK-LABEL: @test11
Chris Lattner60b71b52009-12-31 19:24:52 +0000169; CHECK-NEXT: mul i32 %W, 381
170; CHECK-NEXT: ret i32
171}
172
David Majnemerf6e500a2015-06-24 21:27:36 +0000173declare void @mumble(i32)
174
Chris Lattnerfed33972009-12-31 20:34:32 +0000175define i32 @test12(i32 %X) {
David Majnemerf6e500a2015-06-24 21:27:36 +0000176 %X.neg = sub nsw nuw i32 0, %X
177 call void @mumble(i32 %X.neg)
Chris Lattnerfed33972009-12-31 20:34:32 +0000178 %A = sub i32 1, %X
179 %B = sub i32 2, %X
180 %C = sub i32 3, %X
Chris Lattnerfed33972009-12-31 20:34:32 +0000181 %Y = add i32 %A ,%B
182 %Z = add i32 %Y, %C
183 ret i32 %Z
Chad Rosier5ea14e02014-06-11 18:28:45 +0000184; CHECK-LABEL: @test12
David Majnemerf6e500a2015-06-24 21:27:36 +0000185; CHECK: %[[mul:.*]] = mul i32 %X, -3
186; CHECK-NEXT: add i32 %[[mul]], 6
Chris Lattnerfed33972009-12-31 20:34:32 +0000187; CHECK-NEXT: ret i32
188}
Chris Lattner60b71b52009-12-31 19:24:52 +0000189
Chris Lattner2f03e642010-01-01 00:50:00 +0000190define i32 @test13(i32 %X1, i32 %X2, i32 %X3) {
191 %A = sub i32 0, %X1
192 %B = mul i32 %A, %X2 ; -X1*X2
193 %C = mul i32 %X1, %X3 ; X1*X3
194 %D = add i32 %B, %C ; -X1*X2 + X1*X3 -> X1*(X3-X2)
195 ret i32 %D
Chad Rosier5ea14e02014-06-11 18:28:45 +0000196; CHECK-LABEL: @test13
Chris Lattner2f03e642010-01-01 00:50:00 +0000197; CHECK-NEXT: sub i32 %X3, %X2
198; CHECK-NEXT: mul i32 {{.*}}, %X1
199; CHECK-NEXT: ret i32
200}
201
Chris Lattner0c59ac32010-01-01 01:13:15 +0000202; PR5359
203define i32 @test14(i32 %X1, i32 %X2) {
204 %B = mul i32 %X1, 47 ; X1*47
205 %C = mul i32 %X2, -47 ; X2*-47
206 %D = add i32 %B, %C ; X1*47 + X2*-47 -> 47*(X1-X2)
207 ret i32 %D
Chad Rosier5ea14e02014-06-11 18:28:45 +0000208
209; CHECK-LABEL: @test14
David Majnemer587336d2015-05-28 06:16:39 +0000210; CHECK-NEXT: %[[SUB:.*]] = sub i32 %X1, %X2
211; CHECK-NEXT: mul i32 %[[SUB]], 47
Chris Lattner0c59ac32010-01-01 01:13:15 +0000212; CHECK-NEXT: ret i32
213}
214
Bob Wilsona10e65c2010-02-06 01:16:25 +0000215; Do not reassociate expressions of type i1
216define i32 @test15(i32 %X1, i32 %X2, i32 %X3) {
217 %A = icmp ne i32 %X1, 0
218 %B = icmp slt i32 %X2, %X3
219 %C = and i1 %A, %B
220 %D = select i1 %C, i32 %X1, i32 0
221 ret i32 %D
Chad Rosier5ea14e02014-06-11 18:28:45 +0000222; CHECK-LABEL: @test15
Bob Wilsona10e65c2010-02-06 01:16:25 +0000223; CHECK: and i1 %A, %B
224}