blob: 2c5b6181bc6c4d8545f1a8834d9d1537dc3aea71 [file] [log] [blame]
Sanjay Patel0b24b7e2017-05-10 15:57:47 +00001; RUN: opt < %s -instsimplify -S | FileCheck %s
2
3define i32 @test1(i32 %A) {
4; CHECK-LABEL: @test1(
5; CHECK-NEXT: ret i32 %A
6;
7 %B = or i32 %A, 0
8 ret i32 %B
9}
10
11define i32 @test2(i32 %A) {
12; CHECK-LABEL: @test2(
13; CHECK-NEXT: ret i32 -1
14;
15 %B = or i32 %A, -1
16 ret i32 %B
17}
18
19define i8 @test2a(i8 %A) {
20; CHECK-LABEL: @test2a(
21; CHECK-NEXT: ret i8 -1
22;
23 %B = or i8 %A, -1
24 ret i8 %B
25}
26
27define i1 @test3(i1 %A) {
28; CHECK-LABEL: @test3(
29; CHECK-NEXT: ret i1 %A
30;
31 %B = or i1 %A, false
32 ret i1 %B
33}
34
35define i1 @test4(i1 %A) {
36; CHECK-LABEL: @test4(
37; CHECK-NEXT: ret i1 true
38;
39 %B = or i1 %A, true
40 ret i1 %B
41}
42
43define i1 @test5(i1 %A) {
44; CHECK-LABEL: @test5(
45; CHECK-NEXT: ret i1 %A
46;
47 %B = or i1 %A, %A
48 ret i1 %B
49}
50
51define i32 @test6(i32 %A) {
52; CHECK-LABEL: @test6(
53; CHECK-NEXT: ret i32 %A
54;
55 %B = or i32 %A, %A
56 ret i32 %B
57}
58
59; A | ~A == -1
60define i32 @test7(i32 %A) {
61; CHECK-LABEL: @test7(
62; CHECK-NEXT: ret i32 -1
63;
64 %NotA = xor i32 %A, -1
65 %B = or i32 %A, %NotA
66 ret i32 %B
67}
68
69define i8 @test8(i8 %A) {
70; CHECK-LABEL: @test8(
71; CHECK-NEXT: ret i8 -1
72;
73 %B = or i8 %A, -2
74 %C = or i8 %B, 1
75 ret i8 %C
76}
77
78; Test that (A|c1)|(B|c2) == (A|B)|(c1|c2)
79define i8 @test9(i8 %A, i8 %B) {
80; CHECK-LABEL: @test9(
81; CHECK-NEXT: ret i8 -1
82;
83 %C = or i8 %A, 1
84 %D = or i8 %B, -2
85 %E = or i8 %C, %D
86 ret i8 %E
87}
88
89define i8 @test10(i8 %A) {
90; CHECK-LABEL: @test10(
91; CHECK-NEXT: ret i8 -2
92;
93 %B = or i8 %A, 1
94 %C = and i8 %B, -2
95 ; (X & C1) | C2 --> (X | C2) & (C1|C2)
96 %D = or i8 %C, -2
97 ret i8 %D
98}
99
100define i8 @test11(i8 %A) {
101; CHECK-LABEL: @test11(
102; CHECK-NEXT: ret i8 -1
103;
104 %B = or i8 %A, -2
105 %C = xor i8 %B, 13
106 ; (X ^ C1) | C2 --> (X | C2) ^ (C1&~C2)
107 %D = or i8 %C, 1
108 %E = xor i8 %D, 12
109 ret i8 %E
110}
111
112; Test the case where integer BitWidth <= 64 && BitWidth % 2 != 0.
113define i39 @test1_apint(i39 %V, i39 %M) {
114; CHECK-LABEL: @test1_apint(
115; CHECK: [[N:%.*]] = and i39 %M, -274877906944
116; CHECK-NEXT: [[A:%.*]] = add i39 %V, [[N]]
117; CHECK-NEXT: ret i39 [[A]]
118;
119 ;; If we have: ((V + N) & C1) | (V & C2)
120 ;; .. and C2 = ~C1 and C2 is 0+1+ and (N & C2) == 0
121 ;; replace with V+N.
122 %C1 = xor i39 274877906943, -1 ;; C2 = 274877906943
123 %N = and i39 %M, 274877906944
124 %A = add i39 %V, %N
125 %B = and i39 %A, %C1
126 %D = and i39 %V, 274877906943
127 %R = or i39 %B, %D
128 ret i39 %R
129}
130
131define i7 @test2_apint(i7 %X) {
132; CHECK-LABEL: @test2_apint(
133; CHECK: ret i7 %X
134;
135 %Y = or i7 %X, 0
136 ret i7 %Y
137}
138
139define i17 @test3_apint(i17 %X) {
140; CHECK-LABEL: @test3_apint(
141; CHECK: ret i17 -1
142;
143 %Y = or i17 %X, -1
144 ret i17 %Y
145}
146
147; Test the case where Integer BitWidth > 64 && BitWidth <= 1024.
148define i399 @test4_apint(i399 %V, i399 %M) {
149; CHECK-LABEL: @test4_apint(
150; CHECK: [[N:%.*]] = and i399 %M, 18446742974197923840
151; CHECK-NEXT: [[A:%.*]] = add i399 %V, [[N]]
152; CHECK-NEXT: ret i399 [[A]]
153;
154 ;; If we have: ((V + N) & C1) | (V & C2)
155 ;; .. and C2 = ~C1 and C2 is 0+1+ and (N & C2) == 0
156 ;; replace with V+N.
157 %C1 = xor i399 274877906943, -1 ;; C2 = 274877906943
158 %N = and i399 %M, 18446742974197923840
159 %A = add i399 %V, %N
160 %B = and i399 %A, %C1
161 %D = and i399 %V, 274877906943
162 %R = or i399 %B, %D
163 ret i399 %R
164}
165
166define i777 @test5_apint(i777 %X) {
167; CHECK-LABEL: @test5_apint(
168; CHECK: ret i777 %X
169;
170 %Y = or i777 %X, 0
171 ret i777 %Y
172}
173
174define i117 @test6_apint(i117 %X) {
175; CHECK-LABEL: @test6_apint(
176; CHECK: ret i117 -1
177;
178 %Y = or i117 %X, -1
179 ret i117 %Y
180}
181