1; RUN: opt < %s -instsimplify -S | FileCheck %s
2
3define i64 @pow2(i32 %x) {
4; CHECK-LABEL: @pow2(
5  %negx = sub i32 0, %x
6  %x2 = and i32 %x, %negx
7  %e = zext i32 %x2 to i64
8  %nege = sub i64 0, %e
9  %e2 = and i64 %e, %nege
10  ret i64 %e2
11; CHECK: ret i64 %e
12}
13
14define i64 @pow2b(i32 %x) {
15; CHECK-LABEL: @pow2b(
16  %sh = shl i32 2, %x
17  %e = zext i32 %sh to i64
18  %nege = sub i64 0, %e
19  %e2 = and i64 %e, %nege
20  ret i64 %e2
21; CHECK: ret i64 %e
22}
23
24define i32 @sub_neg_nuw(i32 %x, i32 %y) {
25; CHECK-LABEL: @sub_neg_nuw(
26  %neg = sub nuw i32 0, %y
27  %sub = sub i32 %x, %neg
28  ret i32 %sub
29; CHECK: ret i32 %x
30}
31
32define i1 @and_of_icmps0(i32 %b) {
33; CHECK-LABEL: @and_of_icmps0(
34  %1 = add i32 %b, 2
35  %2 = icmp ult i32 %1, 4
36  %cmp3 = icmp sgt i32 %b, 2
37  %cmp = and i1 %2, %cmp3
38  ret i1 %cmp
39; CHECK: ret i1 false
40}
41
42define i1 @and_of_icmps1(i32 %b) {
43; CHECK-LABEL: @and_of_icmps1(
44  %1 = add nsw i32 %b, 2
45  %2 = icmp slt i32 %1, 4
46  %cmp3 = icmp sgt i32 %b, 2
47  %cmp = and i1 %2, %cmp3
48  ret i1 %cmp
49; CHECK: ret i1 false
50}
51
52define i1 @and_of_icmps2(i32 %b) {
53; CHECK-LABEL: @and_of_icmps2(
54  %1 = add i32 %b, 2
55  %2 = icmp ule i32 %1, 3
56  %cmp3 = icmp sgt i32 %b, 2
57  %cmp = and i1 %2, %cmp3
58  ret i1 %cmp
59; CHECK: ret i1 false
60}
61
62define i1 @and_of_icmps3(i32 %b) {
63; CHECK-LABEL: @and_of_icmps3(
64  %1 = add nsw i32 %b, 2
65  %2 = icmp sle i32 %1, 3
66  %cmp3 = icmp sgt i32 %b, 2
67  %cmp = and i1 %2, %cmp3
68  ret i1 %cmp
69; CHECK: ret i1 false
70}
71
72define i1 @and_of_icmps4(i32 %b) {
73; CHECK-LABEL: @and_of_icmps4(
74  %1 = add nuw i32 %b, 2
75  %2 = icmp ult i32 %1, 4
76  %cmp3 = icmp ugt i32 %b, 2
77  %cmp = and i1 %2, %cmp3
78  ret i1 %cmp
79; CHECK: ret i1 false
80}
81
82define i1 @and_of_icmps5(i32 %b) {
83; CHECK-LABEL: @and_of_icmps5(
84  %1 = add nuw i32 %b, 2
85  %2 = icmp ule i32 %1, 3
86  %cmp3 = icmp ugt i32 %b, 2
87  %cmp = and i1 %2, %cmp3
88  ret i1 %cmp
89; CHECK: ret i1 false
90}
91
92define i1 @or_of_icmps0(i32 %b) {
93; CHECK-LABEL: @or_of_icmps0(
94  %1 = add i32 %b, 2
95  %2 = icmp uge i32 %1, 4
96  %cmp3 = icmp sle i32 %b, 2
97  %cmp = or i1 %2, %cmp3
98  ret i1 %cmp
99; CHECK: ret i1 true
100}
101
102define i1 @or_of_icmps1(i32 %b) {
103; CHECK-LABEL: @or_of_icmps1(
104  %1 = add nsw i32 %b, 2
105  %2 = icmp sge i32 %1, 4
106  %cmp3 = icmp sle i32 %b, 2
107  %cmp = or i1 %2, %cmp3
108  ret i1 %cmp
109; CHECK: ret i1 true
110}
111
112define i1 @or_of_icmps2(i32 %b) {
113; CHECK-LABEL: @or_of_icmps2(
114  %1 = add i32 %b, 2
115  %2 = icmp ugt i32 %1, 3
116  %cmp3 = icmp sle i32 %b, 2
117  %cmp = or i1 %2, %cmp3
118  ret i1 %cmp
119; CHECK: ret i1 true
120}
121
122define i1 @or_of_icmps3(i32 %b) {
123; CHECK-LABEL: @or_of_icmps3(
124  %1 = add nsw i32 %b, 2
125  %2 = icmp sgt i32 %1, 3
126  %cmp3 = icmp sle i32 %b, 2
127  %cmp = or i1 %2, %cmp3
128  ret i1 %cmp
129; CHECK: ret i1 true
130}
131
132define i1 @or_of_icmps4(i32 %b) {
133; CHECK-LABEL: @or_of_icmps4(
134  %1 = add nuw i32 %b, 2
135  %2 = icmp uge i32 %1, 4
136  %cmp3 = icmp ule i32 %b, 2
137  %cmp = or i1 %2, %cmp3
138  ret i1 %cmp
139; CHECK: ret i1 true
140}
141
142define i1 @or_of_icmps5(i32 %b) {
143; CHECK-LABEL: @or_of_icmps5(
144  %1 = add nuw i32 %b, 2
145  %2 = icmp ugt i32 %1, 3
146  %cmp3 = icmp ule i32 %b, 2
147  %cmp = or i1 %2, %cmp3
148  ret i1 %cmp
149; CHECK: ret i1 true
150}
151
152define i32 @neg_nuw(i32 %x) {
153; CHECK-LABEL: @neg_nuw(
154  %neg = sub nuw i32 0, %x
155  ret i32 %neg
156; CHECK: ret i32 0
157}
158
159define i1 @and_icmp1(i32 %x, i32 %y) {
160  %1 = icmp ult i32 %x, %y
161  %2 = icmp ne i32 %y, 0
162  %3 = and i1 %1, %2
163  ret i1 %3
164}
165; CHECK-LABEL: @and_icmp1(
166; CHECK: %[[cmp:.*]] = icmp ult i32 %x, %y
167; CHECK: ret i1 %[[cmp]]
168
169define i1 @and_icmp2(i32 %x, i32 %y) {
170  %1 = icmp ult i32 %x, %y
171  %2 = icmp eq i32 %y, 0
172  %3 = and i1 %1, %2
173  ret i1 %3
174}
175; CHECK-LABEL: @and_icmp2(
176; CHECK: ret i1 false
177
178define i1 @or_icmp1(i32 %x, i32 %y) {
179  %1 = icmp ult i32 %x, %y
180  %2 = icmp ne i32 %y, 0
181  %3 = or i1 %1, %2
182  ret i1 %3
183}
184; CHECK-LABEL: @or_icmp1(
185; CHECK: %[[cmp:.*]] = icmp ne i32 %y, 0
186; CHECK: ret i1 %[[cmp]]
187
188define i1 @or_icmp2(i32 %x, i32 %y) {
189  %1 = icmp uge i32 %x, %y
190  %2 = icmp ne i32 %y, 0
191  %3 = or i1 %1, %2
192  ret i1 %3
193}
194; CHECK-LABEL: @or_icmp2(
195; CHECK: ret i1 true
196
197define i1 @or_icmp3(i32 %x, i32 %y) {
198  %1 = icmp uge i32 %x, %y
199  %2 = icmp eq i32 %y, 0
200  %3 = or i1 %1, %2
201  ret i1 %3
202}
203; CHECK-LABEL: @or_icmp3(
204; CHECK: %[[cmp:.*]] = icmp uge i32 %x, %y
205; CHECK: ret i1 %[[cmp]]
206