filecheckize this test.
[oota-llvm.git] / test / Transforms / InstCombine / sub.ll
1 ; This test makes sure that these instructions are properly eliminated.
2 ;
3 ; RUN: opt < %s -instcombine -S | FileCheck %s
4
5 define i32 @test1(i32 %A) {
6         %B = sub i32 %A, %A     
7         ret i32 %B
8 ; CHECK: @test1
9 ; CHECK: ret i32 0
10 }
11
12 define i32 @test2(i32 %A) {
13         %B = sub i32 %A, 0      
14         ret i32 %B
15 ; CHECK: @test2
16 ; CHECK: ret i32 %A
17 }
18
19 define i32 @test3(i32 %A) {
20         %B = sub i32 0, %A      
21         %C = sub i32 0, %B      
22         ret i32 %C
23 ; CHECK: @test3
24 ; CHECK: ret i32 %A
25 }
26
27 define i32 @test4(i32 %A, i32 %x) {
28         %B = sub i32 0, %A      
29         %C = sub i32 %x, %B     
30         ret i32 %C
31 ; CHECK: @test4
32 ; CHECK: %C = add i32 %x, %A
33 ; CHECK: ret i32 %C
34 }
35
36 define i32 @test5(i32 %A, i32 %B, i32 %C) {
37         %D = sub i32 %B, %C     
38         %E = sub i32 %A, %D     
39         ret i32 %E
40 ; CHECK: @test5
41 ; CHECK: %D = sub i32 %C, %B
42 ; CHECK: %E = add
43 ; CHECK: ret i32 %E
44 }
45
46 define i32 @test6(i32 %A, i32 %B) {
47         %C = and i32 %A, %B     
48         %D = sub i32 %A, %C     
49         ret i32 %D
50 ; CHECK: @test6
51 ; CHECK-NEXT: xor i32 %B, -1
52 ; CHECK-NEXT: %D = and i32 
53 ; CHECK-NEXT: ret i32 %D
54 }
55
56 define i32 @test7(i32 %A) {
57         %B = sub i32 -1, %A     
58         ret i32 %B
59 ; CHECK: @test7
60 ; CHECK: %B = xor i32 %A, -1
61 ; CHECK: ret i32 %B
62 }
63
64 define i32 @test8(i32 %A) {
65         %B = mul i32 9, %A      
66         %C = sub i32 %B, %A     
67         ret i32 %C
68 ; CHECK: @test8
69 ; CHECK: %C = shl i32 %A, 3
70 ; CHECK: ret i32 %C
71 }
72
73 define i32 @test9(i32 %A) {
74         %B = mul i32 3, %A      
75         %C = sub i32 %A, %B     
76         ret i32 %C
77 ; CHECK: @test9
78 ; CHECK: %C = mul i32 %A, -2
79 ; CHECK: ret i32 %C
80 }
81
82 define i32 @test10(i32 %A, i32 %B) {
83         %C = sub i32 0, %A      
84         %D = sub i32 0, %B      
85         %E = mul i32 %C, %D     
86         ret i32 %E
87 ; CHECK: @test10
88 ; CHECK: %E = mul i32 %A, %B
89 ; CHECK: ret i32 %E
90 }
91
92 define i32 @test10a(i32 %A) {
93         %C = sub i32 0, %A      
94         %E = mul i32 %C, 7      
95         ret i32 %E
96 ; CHECK: @test10a
97 ; CHECK: %E = mul i32 %A, -7
98 ; CHECK: ret i32 %E
99 }
100
101 define i1 @test11(i8 %A, i8 %B) {
102         %C = sub i8 %A, %B      
103         %cD = icmp ne i8 %C, 0  
104         ret i1 %cD
105 ; CHECK: @test11
106 ; CHECK: %cD = icmp ne i8 %A, %B
107 ; CHECK: ret i1 %cD
108 }
109
110 define i32 @test12(i32 %A) {
111         %B = ashr i32 %A, 31    
112         %C = sub i32 0, %B      
113         ret i32 %C
114 ; CHECK: @test12
115 ; CHECK: %C = lshr i32 %A, 31
116 ; CHECK: ret i32 %C
117 }
118
119 define i32 @test13(i32 %A) {
120         %B = lshr i32 %A, 31    
121         %C = sub i32 0, %B      
122         ret i32 %C
123 ; CHECK: @test13
124 ; CHECK: %C = ashr i32 %A, 31
125 ; CHECK: ret i32 %C
126 }
127
128 define i32 @test14(i32 %A) {
129         %B = lshr i32 %A, 31    
130         %C = bitcast i32 %B to i32      
131         %D = sub i32 0, %C      
132         ret i32 %D
133 ; CHECK: @test14
134 ; CHECK: %D = ashr i32 %A, 31
135 ; CHECK: ret i32 %D
136 }
137
138 define i32 @test15(i32 %A, i32 %B) {
139         %C = sub i32 0, %A      
140         %D = srem i32 %B, %C    
141         ret i32 %D
142 ; CHECK: @test15
143 ; CHECK: %D = srem i32 %B, %A 
144 ; CHECK: ret i32 %D
145 }
146
147 define i32 @test16(i32 %A) {
148         %X = sdiv i32 %A, 1123  
149         %Y = sub i32 0, %X      
150         ret i32 %Y
151 ; CHECK: @test16
152 ; CHECK: %Y = sdiv i32 %A, -1123
153 ; CHECK: ret i32 %Y
154 }
155
156 ; Can't fold subtract here because negation it might oveflow.
157 ; PR3142
158 define i32 @test17(i32 %A) {
159         %B = sub i32 0, %A      
160         %C = sdiv i32 %B, 1234  
161         ret i32 %C
162 ; CHECK: @test17
163 ; CHECK: %B = sub i32 0, %A
164 ; CHECK: %C = sdiv i32 %B, 1234
165 ; CHECK: ret i32 %C
166 }
167
168 define i64 @test18(i64 %Y) {
169         %tmp.4 = shl i64 %Y, 2  
170         %tmp.12 = shl i64 %Y, 2 
171         %tmp.8 = sub i64 %tmp.4, %tmp.12        
172         ret i64 %tmp.8
173 ; CHECK: @test18
174 ; CHECK: ret i64 0
175 }
176
177 define i32 @test19(i32 %X, i32 %Y) {
178         %Z = sub i32 %X, %Y     
179         %Q = add i32 %Z, %Y     
180         ret i32 %Q
181 ; CHECK: @test19
182 ; CHECK: ret i32 %X
183 }
184
185 define i1 @test20(i32 %g, i32 %h) {
186         %tmp.2 = sub i32 %g, %h 
187         %tmp.4 = icmp ne i32 %tmp.2, %g 
188         ret i1 %tmp.4
189 ; CHECK: @test20
190 ; CHECK: %tmp.4 = icmp ne i32 %h, 0
191 ; CHECK: ret i1 %tmp.4
192 }
193
194 define i1 @test21(i32 %g, i32 %h) {
195         %tmp.2 = sub i32 %g, %h 
196         %tmp.4 = icmp ne i32 %tmp.2, %g         
197         ret i1 %tmp.4
198 ; CHECK: @test21
199 ; CHECK: %tmp.4 = icmp ne i32 %h, 0
200 ; CHECK: ret i1 %tmp.4
201 }
202
203 ; PR2298
204 define i1 @test22(i32 %a, i32 %b) zeroext nounwind  {
205         %tmp2 = sub i32 0, %a   
206         %tmp4 = sub i32 0, %b   
207         %tmp5 = icmp eq i32 %tmp2, %tmp4        
208         ret i1 %tmp5
209 ; CHECK: @test22
210 ; CHECK: %tmp5 = icmp eq i32 %a, %b
211 ; CHECK: ret i1 %tmp5
212 }
213