Remove llvm-upgrade and update test cases.
[oota-llvm.git] / test / Transforms / InstCombine / xor.ll
1 ; This test makes sure that these instructions are properly eliminated.
2 ;
3 ; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \
4 ; RUN:    not grep {xor }
5 @G1 = global i32 0              ; <i32*> [#uses=1]
6 @G2 = global i32 0              ; <i32*> [#uses=1]
7
8 define i1 @test0(i1 %A) {
9         %B = xor i1 %A, false           ; <i1> [#uses=1]
10         ret i1 %B
11 }
12
13 define i32 @test1(i32 %A) {
14         %B = xor i32 %A, 0              ; <i32> [#uses=1]
15         ret i32 %B
16 }
17
18 define i1 @test2(i1 %A) {
19         %B = xor i1 %A, %A              ; <i1> [#uses=1]
20         ret i1 %B
21 }
22
23 define i32 @test3(i32 %A) {
24         %B = xor i32 %A, %A             ; <i32> [#uses=1]
25         ret i32 %B
26 }
27
28 define i32 @test4(i32 %A) {
29         %NotA = xor i32 -1, %A          ; <i32> [#uses=1]
30         %B = xor i32 %A, %NotA          ; <i32> [#uses=1]
31         ret i32 %B
32 }
33
34 define i32 @test5(i32 %A) {
35         %t1 = or i32 %A, 123            ; <i32> [#uses=1]
36         %r = xor i32 %t1, 123           ; <i32> [#uses=1]
37         ret i32 %r
38 }
39
40 define i8 @test6(i8 %A) {
41         %B = xor i8 %A, 17              ; <i8> [#uses=1]
42         %C = xor i8 %B, 17              ; <i8> [#uses=1]
43         ret i8 %C
44 }
45
46 define i32 @test7(i32 %A, i32 %B) {
47         %A1 = and i32 %A, 7             ; <i32> [#uses=1]
48         %B1 = and i32 %B, 128           ; <i32> [#uses=1]
49         %C1 = xor i32 %A1, %B1          ; <i32> [#uses=1]
50         ret i32 %C1
51 }
52
53 define i8 @test8(i1 %c) {
54         %d = xor i1 %c, true            ; <i1> [#uses=1]
55         br i1 %d, label %True, label %False
56
57 True:           ; preds = %0
58         ret i8 1
59
60 False:          ; preds = %0
61         ret i8 3
62 }
63
64 define i1 @test9(i8 %A) {
65         %B = xor i8 %A, 123             ; <i8> [#uses=1]
66         %C = icmp eq i8 %B, 34          ; <i1> [#uses=1]
67         ret i1 %C
68 }
69
70 define i8 @test10(i8 %A) {
71         %B = and i8 %A, 3               ; <i8> [#uses=1]
72         %C = xor i8 %B, 4               ; <i8> [#uses=1]
73         ret i8 %C
74 }
75
76 define i8 @test11(i8 %A) {
77         %B = or i8 %A, 12               ; <i8> [#uses=1]
78         %C = xor i8 %B, 4               ; <i8> [#uses=1]
79         ret i8 %C
80 }
81
82 define i1 @test12(i8 %A) {
83         %B = xor i8 %A, 4               ; <i8> [#uses=1]
84         %c = icmp ne i8 %B, 0           ; <i1> [#uses=1]
85         ret i1 %c
86 }
87
88 define i1 @test13(i8 %A, i8 %B) {
89         %C = icmp ult i8 %A, %B         ; <i1> [#uses=1]
90         %D = icmp ugt i8 %A, %B         ; <i1> [#uses=1]
91         %E = xor i1 %C, %D              ; <i1> [#uses=1]
92         ret i1 %E
93 }
94
95 define i1 @test14(i8 %A, i8 %B) {
96         %C = icmp eq i8 %A, %B          ; <i1> [#uses=1]
97         %D = icmp ne i8 %B, %A          ; <i1> [#uses=1]
98         %E = xor i1 %C, %D              ; <i1> [#uses=1]
99         ret i1 %E
100 }
101
102 define i32 @test15(i32 %A) {
103         %B = add i32 %A, -1             ; <i32> [#uses=1]
104         %C = xor i32 %B, -1             ; <i32> [#uses=1]
105         ret i32 %C
106 }
107
108 define i32 @test16(i32 %A) {
109         %B = add i32 %A, 123            ; <i32> [#uses=1]
110         %C = xor i32 %B, -1             ; <i32> [#uses=1]
111         ret i32 %C
112 }
113
114 define i32 @test17(i32 %A) {
115         %B = sub i32 123, %A            ; <i32> [#uses=1]
116         %C = xor i32 %B, -1             ; <i32> [#uses=1]
117         ret i32 %C
118 }
119
120 define i32 @test18(i32 %A) {
121         %B = xor i32 %A, -1             ; <i32> [#uses=1]
122         %C = sub i32 123, %B            ; <i32> [#uses=1]
123         ret i32 %C
124 }
125
126 define i32 @test19(i32 %A, i32 %B) {
127         %C = xor i32 %A, %B             ; <i32> [#uses=1]
128         %D = xor i32 %C, %A             ; <i32> [#uses=1]
129         ret i32 %D
130 }
131
132 define void @test20(i32 %A, i32 %B) {
133         %tmp.2 = xor i32 %B, %A         ; <i32> [#uses=2]
134         %tmp.5 = xor i32 %tmp.2, %B             ; <i32> [#uses=2]
135         %tmp.8 = xor i32 %tmp.5, %tmp.2         ; <i32> [#uses=1]
136         store i32 %tmp.8, i32* @G1
137         store i32 %tmp.5, i32* @G2
138         ret void
139 }
140
141 define i32 @test21(i1 %C, i32 %A, i32 %B) {
142         %C2 = xor i1 %C, true           ; <i1> [#uses=1]
143         %D = select i1 %C2, i32 %A, i32 %B              ; <i32> [#uses=1]
144         ret i32 %D
145 }
146
147 define i32 @test22(i1 %X) {
148         %Y = xor i1 %X, true            ; <i1> [#uses=1]
149         %Z = zext i1 %Y to i32          ; <i32> [#uses=1]
150         %Q = xor i32 %Z, 1              ; <i32> [#uses=1]
151         ret i32 %Q
152 }
153
154 define i1 @test23(i32 %a, i32 %b) {
155         %tmp.2 = xor i32 %b, %a         ; <i32> [#uses=1]
156         %tmp.4 = icmp eq i32 %tmp.2, %a         ; <i1> [#uses=1]
157         ret i1 %tmp.4
158 }
159
160 define i1 @test24(i32 %c, i32 %d) {
161         %tmp.2 = xor i32 %d, %c         ; <i32> [#uses=1]
162         %tmp.4 = icmp ne i32 %tmp.2, %c         ; <i1> [#uses=1]
163         ret i1 %tmp.4
164 }
165
166 define i32 @test25(i32 %g, i32 %h) {
167         %h2 = xor i32 %h, -1            ; <i32> [#uses=1]
168         %tmp2 = and i32 %h2, %g         ; <i32> [#uses=1]
169         %tmp4 = xor i32 %tmp2, %g               ; <i32> [#uses=1]
170         ret i32 %tmp4
171 }
172
173 define i32 @test26(i32 %a, i32 %b) {
174         %b2 = xor i32 %b, -1            ; <i32> [#uses=1]
175         %tmp2 = xor i32 %a, %b2         ; <i32> [#uses=1]
176         %tmp4 = and i32 %tmp2, %a               ; <i32> [#uses=1]
177         ret i32 %tmp4
178 }
179
180 define i32 @test27(i32 %b, i32 %c, i32 %d) {
181         %tmp2 = xor i32 %d, %b          ; <i32> [#uses=1]
182         %tmp5 = xor i32 %d, %c          ; <i32> [#uses=1]
183         %tmp = icmp eq i32 %tmp2, %tmp5         ; <i1> [#uses=1]
184         %tmp6 = zext i1 %tmp to i32             ; <i32> [#uses=1]
185         ret i32 %tmp6
186 }
187
188 define i32 @test28(i32 %indvar) {
189         %tmp7 = add i32 %indvar, -2147483647            ; <i32> [#uses=1]
190         %tmp214 = xor i32 %tmp7, -2147483648            ; <i32> [#uses=1]
191         ret i32 %tmp214
192 }