1
; This test makes sure that add instructions are properly eliminated.
3
; RUN: opt < %s -instcombine -S | \
4
; RUN: grep -v OK | not grep add
6
define i32 @test1(i32 %A) {
7
%B = add i32 %A, 0 ; <i32> [#uses=1]
11
define i32 @test2(i32 %A) {
12
%B = add i32 %A, 5 ; <i32> [#uses=1]
13
%C = add i32 %B, -5 ; <i32> [#uses=1]
17
define i32 @test3(i32 %A) {
18
%B = add i32 %A, 5 ; <i32> [#uses=1]
19
;; This should get converted to an add
20
%C = sub i32 %B, 5 ; <i32> [#uses=1]
24
define i32 @test4(i32 %A, i32 %B) {
25
%C = sub i32 0, %A ; <i32> [#uses=1]
27
%D = add i32 %B, %C ; <i32> [#uses=1]
31
define i32 @test5(i32 %A, i32 %B) {
32
%C = sub i32 0, %A ; <i32> [#uses=1]
34
%D = add i32 %C, %B ; <i32> [#uses=1]
38
define i32 @test6(i32 %A) {
39
%B = mul i32 7, %A ; <i32> [#uses=1]
40
; C = 7*A+A == 8*A == A << 3
41
%C = add i32 %B, %A ; <i32> [#uses=1]
45
define i32 @test7(i32 %A) {
46
%B = mul i32 7, %A ; <i32> [#uses=1]
47
; C = A+7*A == 8*A == A << 3
48
%C = add i32 %A, %B ; <i32> [#uses=1]
52
; (A & C1)+(B & C2) -> (A & C1)|(B & C2) iff C1&C2 == 0
53
define i32 @test8(i32 %A, i32 %B) {
54
%A1 = and i32 %A, 7 ; <i32> [#uses=1]
55
%B1 = and i32 %B, 128 ; <i32> [#uses=1]
56
%C = add i32 %A1, %B1 ; <i32> [#uses=1]
60
define i32 @test9(i32 %A) {
61
%B = shl i32 %A, 4 ; <i32> [#uses=2]
63
%C = add i32 %B, %B ; <i32> [#uses=1]
67
define i1 @test10(i8 %A, i8 %b) {
68
%B = add i8 %A, %b ; <i8> [#uses=1]
70
%c = icmp ne i8 %B, 0 ; <i1> [#uses=1]
74
define i1 @test11(i8 %A) {
75
%B = add i8 %A, -1 ; <i8> [#uses=1]
77
%c = icmp ne i8 %B, 0 ; <i1> [#uses=1]
81
define i32 @test12(i32 %A, i32 %B) {
82
; Should be transformed into shl A, 1
83
%C_OK = add i32 %B, %A ; <i32> [#uses=1]
87
%D = add i32 %C_OK, %A ; <i32> [#uses=1]
91
define i32 @test13(i32 %A, i32 %B, i32 %C) {
92
%D_OK = add i32 %A, %B ; <i32> [#uses=1]
93
%E_OK = add i32 %D_OK, %C ; <i32> [#uses=1]
95
%F = add i32 %E_OK, %A ; <i32> [#uses=1]
99
define i32 @test14(i32 %offset, i32 %difference) {
100
%tmp.2 = and i32 %difference, 3 ; <i32> [#uses=1]
101
%tmp.3_OK = add i32 %tmp.2, %offset ; <i32> [#uses=1]
102
%tmp.5.mask = and i32 %difference, -4 ; <i32> [#uses=1]
103
; == add %offset, %difference
104
%tmp.8 = add i32 %tmp.3_OK, %tmp.5.mask ; <i32> [#uses=1]
108
define i8 @test15(i8 %A) {
109
; Does not effect result
110
%B = add i8 %A, -64 ; <i8> [#uses=1]
112
%C = and i8 %B, 16 ; <i8> [#uses=1]
116
define i8 @test16(i8 %A) {
117
; Turn this into a XOR
118
%B = add i8 %A, 16 ; <i8> [#uses=1]
120
%C = and i8 %B, 16 ; <i8> [#uses=1]
124
define i32 @test17(i32 %A) {
125
%B = xor i32 %A, -1 ; <i32> [#uses=1]
127
%C = add i32 %B, 1 ; <i32> [#uses=1]
131
define i8 @test18(i8 %A) {
132
%B = xor i8 %A, -1 ; <i8> [#uses=1]
133
; == sub ubyte 16, %A
134
%C = add i8 %B, 17 ; <i8> [#uses=1]
138
define i32 @test19(i1 %C) {
139
%A = select i1 %C, i32 1000, i32 10 ; <i32> [#uses=1]
140
%V = add i32 %A, 123 ; <i32> [#uses=1]
144
define i32 @test20(i32 %x) {
145
%tmp.2 = xor i32 %x, -2147483648 ; <i32> [#uses=1]
146
;; Add of sign bit -> xor of sign bit.
147
%tmp.4 = add i32 %tmp.2, -2147483648 ; <i32> [#uses=1]
151
define i1 @test21(i32 %x) {
152
%t = add i32 %x, 4 ; <i32> [#uses=1]
153
%y = icmp eq i32 %t, 123 ; <i1> [#uses=1]
157
define i32 @test22(i32 %V) {
158
%V2 = add i32 %V, 10 ; <i32> [#uses=1]
159
switch i32 %V2, label %Default [
164
Default: ; preds = %0
174
define i32 @test23(i1 %C, i32 %a) {
176
br i1 %C, label %endif, label %else
178
else: ; preds = %entry
181
endif: ; preds = %else, %entry
182
%b.0 = phi i32 [ 0, %entry ], [ 1, %else ] ; <i32> [#uses=1]
183
%tmp.4 = add i32 %b.0, 1 ; <i32> [#uses=1]
187
define i32 @test24(i32 %A) {
188
%B = add i32 %A, 1 ; <i32> [#uses=1]
189
%C = shl i32 %B, 1 ; <i32> [#uses=1]
190
%D = sub i32 %C, 2 ; <i32> [#uses=1]
194
define i64 @test25(i64 %Y) {
195
%tmp.4 = shl i64 %Y, 2 ; <i64> [#uses=1]
196
%tmp.12 = shl i64 %Y, 2 ; <i64> [#uses=1]
197
%tmp.8 = add i64 %tmp.4, %tmp.12 ; <i64> [#uses=1]
201
define i32 @test26(i32 %A, i32 %B) {
202
%C = add i32 %A, %B ; <i32> [#uses=1]
203
%D = sub i32 %C, %B ; <i32> [#uses=1]
207
define i32 @test27(i1 %C, i32 %X, i32 %Y) {
208
%A = add i32 %X, %Y ; <i32> [#uses=1]
209
%B = add i32 %Y, 123 ; <i32> [#uses=1]
210
;; Fold add through select.
211
%C.upgrd.1 = select i1 %C, i32 %A, i32 %B ; <i32> [#uses=1]
212
%D = sub i32 %C.upgrd.1, %Y ; <i32> [#uses=1]
216
define i32 @test28(i32 %X) {
217
%Y = add i32 %X, 1234 ; <i32> [#uses=1]
218
%Z = sub i32 42, %Y ; <i32> [#uses=1]
222
define i32 @test29(i32 %X, i32 %x) {
223
%tmp.2 = sub i32 %X, %x ; <i32> [#uses=2]
224
%tmp.2.mask = and i32 %tmp.2, 63 ; <i32> [#uses=1]
225
%tmp.6 = add i32 %tmp.2.mask, %x ; <i32> [#uses=1]
226
%tmp.7 = and i32 %tmp.6, 63 ; <i32> [#uses=1]
227
%tmp.9 = and i32 %tmp.2, -64 ; <i32> [#uses=1]
228
%tmp.10 = or i32 %tmp.7, %tmp.9 ; <i32> [#uses=1]
232
define i64 @test30(i64 %x) {
233
%tmp.2 = xor i64 %x, -9223372036854775808 ; <i64> [#uses=1]
234
;; Add of sign bit -> xor of sign bit.
235
%tmp.4 = add i64 %tmp.2, -9223372036854775808 ; <i64> [#uses=1]
239
define i32 @test31(i32 %A) {
240
%B = add i32 %A, 4 ; <i32> [#uses=1]
241
%C = mul i32 %B, 5 ; <i32> [#uses=1]
242
%D = sub i32 %C, 20 ; <i32> [#uses=1]
246
define i32 @test32(i32 %A) {
247
%B = add i32 %A, 4 ; <i32> [#uses=1]
248
%C = shl i32 %B, 2 ; <i32> [#uses=1]
249
%D = sub i32 %C, 16 ; <i32> [#uses=1]
253
define i8 @test33(i8 %A) {
254
%B = and i8 %A, -2 ; <i8> [#uses=1]
255
%C = add i8 %B, 1 ; <i8> [#uses=1]
259
define i8 @test34(i8 %A) {
260
%B = add i8 %A, 64 ; <i8> [#uses=1]
261
%C = and i8 %B, 12 ; <i8> [#uses=1]
265
define i32 @test35(i32 %a) {
266
%tmpnot = xor i32 %a, -1 ; <i32> [#uses=1]
267
%tmp2 = add i32 %tmpnot, %a ; <i32> [#uses=1]
271
define i32 @test36(i32 %a) {
273
%y = and i32 %a, -126
275
%q = and i32 %z, 1 ; always zero
279
define i1 @test37(i32 %a, i32 %b) nounwind readnone {
280
%add = add i32 %a, %b
281
%cmp = icmp eq i32 %add, %a
285
define i1 @test38(i32 %a, i32 %b) nounwind readnone {
286
%add = add i32 %a, %b
287
%cmp = icmp eq i32 %add, %b
291
define i1 @test39(i32 %a, i32 %b) nounwind readnone {
292
%add = add i32 %b, %a
293
%cmp = icmp eq i32 %add, %a
297
define i1 @test40(i32 %a, i32 %b) nounwind readnone {
298
%add = add i32 %b, %a
299
%cmp = icmp eq i32 %add, %b