Skip to content

Commit 3368e4a

Browse files
committed
Add mixed bitwise and or test cases
1 parent 40fc765 commit 3368e4a

File tree

1 file changed

+162
-0
lines changed

1 file changed

+162
-0
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3+
4+
declare void @use(i1)
5+
6+
define void @test_decompose_mixed_bitwise_and_or(i4 %x, i4 %y, i4 %z) {
7+
; CHECK-LABEL: @test_decompose_mixed_bitwise_and_or(
8+
; CHECK-NEXT: entry:
9+
; CHECK-NEXT: [[AND_1:%.*]] = and i4 [[Y:%.*]], [[X:%.*]]
10+
; CHECK-NEXT: [[OR_1:%.*]] = or i4 [[AND_1]], [[Z:%.*]]
11+
; CHECK-NEXT: [[C_1:%.*]] = icmp sgt i4 [[OR_1]], -1
12+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
13+
; CHECK: then:
14+
; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i4 [[X]], -1
15+
; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i4 [[Y]], -1
16+
; CHECK-NEXT: call void @use(i1 [[C_2]])
17+
; CHECK-NEXT: call void @use(i1 [[C_3]])
18+
; CHECK-NEXT: call void @use(i1 true)
19+
; CHECK-NEXT: ret void
20+
; CHECK: end:
21+
; CHECK-NEXT: ret void
22+
;
23+
entry:
24+
%and.1 = and i4 %y, %x
25+
%or.1 = or i4 %and.1, %z
26+
%c.1= icmp sgt i4 %or.1, -1
27+
br i1 %c.1, label %then, label %end
28+
29+
then:
30+
; fact: %or.1 > -1 => %and.1 >= 0 && %z >= 0
31+
; %and.1 >= 0 => %x >= 0 || %y >= 0 (constraint system doesn't support logical OR)
32+
%c.2 = icmp sgt i4 %x, -1
33+
%c.3 = icmp sgt i4 %y, -1
34+
%t.1 = icmp sgt i4 %z, -1
35+
call void @use(i1 %c.2)
36+
call void @use(i1 %c.3)
37+
; only %t.1 can be replaced
38+
call void @use(i1 %t.1)
39+
ret void
40+
41+
end:
42+
ret void
43+
}
44+
45+
define void @test_decompose_mixed_bitwise_and_or2(i4 %x, i4 %y, i4 %z) {
46+
; CHECK-LABEL: @test_decompose_mixed_bitwise_and_or2(
47+
; CHECK-NEXT: entry:
48+
; CHECK-NEXT: [[AND_1:%.*]] = and i4 [[Y:%.*]], [[X:%.*]]
49+
; CHECK-NEXT: [[OR_1:%.*]] = or i4 [[AND_1]], [[Z:%.*]]
50+
; CHECK-NEXT: [[C_1:%.*]] = icmp slt i4 [[OR_1]], 0
51+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
52+
; CHECK: then:
53+
; CHECK-NEXT: ret void
54+
; CHECK: end:
55+
; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i4 [[X]], -1
56+
; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i4 [[Y]], -1
57+
; CHECK-NEXT: call void @use(i1 [[C_2]])
58+
; CHECK-NEXT: call void @use(i1 [[C_3]])
59+
; CHECK-NEXT: call void @use(i1 true)
60+
; CHECK-NEXT: ret void
61+
;
62+
entry:
63+
%and.1 = and i4 %y, %x
64+
%or.1 = or i4 %and.1, %z
65+
%c.1 = icmp slt i4 %or.1, 0
66+
br i1 %c.1, label %then, label %end
67+
68+
then:
69+
; fact: %or.1 < 0
70+
ret void
71+
72+
end:
73+
; fact: %or.1 >= 0 => %and.1 >= 0 && %z >= 0
74+
; %and.1 >= 0 => %x >= 0 || %y >= 0 (constraint system doesn't support logical OR)
75+
%c.2 = icmp sgt i4 %x, -1
76+
%c.3 = icmp sgt i4 %y, -1
77+
%t.1 = icmp sgt i4 %z, -1
78+
call void @use(i1 %c.2)
79+
call void @use(i1 %c.3)
80+
; only %t.1 can be replaced
81+
call void @use(i1 %t.1)
82+
ret void
83+
}
84+
85+
define void @test_decompose_mixed_bitwise_and_or3(i4 %x, i4 %y, i4 %z) {
86+
; CHECK-LABEL: @test_decompose_mixed_bitwise_and_or3(
87+
; CHECK-NEXT: entry:
88+
; CHECK-NEXT: [[OR_1:%.*]] = or i4 [[Y:%.*]], [[X:%.*]]
89+
; CHECK-NEXT: [[AND_1:%.*]] = and i4 [[OR_1]], [[Z:%.*]]
90+
; CHECK-NEXT: [[C_1:%.*]] = icmp slt i4 [[AND_1]], 0
91+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
92+
; CHECK: then:
93+
; CHECK-NEXT: [[C_2:%.*]] = icmp slt i4 [[X]], 0
94+
; CHECK-NEXT: [[C_3:%.*]] = icmp slt i4 [[Y]], 0
95+
; CHECK-NEXT: call void @use(i1 [[C_2]])
96+
; CHECK-NEXT: call void @use(i1 [[C_3]])
97+
; CHECK-NEXT: call void @use(i1 true)
98+
; CHECK-NEXT: ret void
99+
; CHECK: end:
100+
; CHECK-NEXT: ret void
101+
;
102+
entry:
103+
%or.1 = or i4 %y, %x
104+
%and.1 = and i4 %or.1, %z
105+
%c.1= icmp slt i4 %and.1, 0
106+
br i1 %c.1, label %then, label %end
107+
108+
then:
109+
; fact: %and.1 < 0 => %or.1 < 0 && %z < 0
110+
; %or.1 < 0 => %x < 0 || %y < 0 (constraint system doesn't support logical OR)
111+
%c.2 = icmp slt i4 %x, 0
112+
%c.3 = icmp slt i4 %y, 0
113+
%t.1 = icmp slt i4 %z, 0
114+
call void @use(i1 %c.2)
115+
call void @use(i1 %c.3)
116+
; only %t.1 can be replaced
117+
call void @use(i1 %t.1)
118+
ret void
119+
120+
end:
121+
ret void
122+
}
123+
124+
define void @test_decompose_mixed_bitwise_and_or4(i4 %x, i4 %y, i4 %z) {
125+
; CHECK-LABEL: @test_decompose_mixed_bitwise_and_or4(
126+
; CHECK-NEXT: entry:
127+
; CHECK-NEXT: [[OR_1:%.*]] = or i4 [[Y:%.*]], [[X:%.*]]
128+
; CHECK-NEXT: [[AND_1:%.*]] = and i4 [[OR_1]], [[Z:%.*]]
129+
; CHECK-NEXT: [[C_1:%.*]] = icmp sgt i4 [[AND_1]], -1
130+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
131+
; CHECK: then:
132+
; CHECK-NEXT: ret void
133+
; CHECK: end:
134+
; CHECK-NEXT: [[C_2:%.*]] = icmp slt i4 [[X]], 0
135+
; CHECK-NEXT: [[C_3:%.*]] = icmp slt i4 [[Y]], 0
136+
; CHECK-NEXT: call void @use(i1 [[C_2]])
137+
; CHECK-NEXT: call void @use(i1 [[C_3]])
138+
; CHECK-NEXT: call void @use(i1 true)
139+
; CHECK-NEXT: ret void
140+
;
141+
entry:
142+
%or.1 = or i4 %y, %x
143+
%and.1 = and i4 %or.1, %z
144+
%c.1 = icmp sgt i4 %and.1, -1
145+
br i1 %c.1, label %then, label %end
146+
147+
then:
148+
; fact: %and.1 > -1
149+
ret void
150+
151+
end:
152+
; fact: %and.1 <= -1 => %or.1 < 0 && %z < 0
153+
; %or.1 < 0 => %x < 0 || %y < 0 (constraint system doesn't support logical OR)
154+
%c.2 = icmp slt i4 %x, 0
155+
%c.3 = icmp slt i4 %y, 0
156+
%t.1 = icmp slt i4 %z, 0
157+
call void @use(i1 %c.2)
158+
call void @use(i1 %c.3)
159+
; only %t.1 can be replaced
160+
call void @use(i1 %t.1)
161+
ret void
162+
}

0 commit comments

Comments
 (0)