Skip to content

Commit 6169e45

Browse files
committed
[InstCombine] Add pre-commit tests for PR65968. NFC.
1 parent 62ffbe0 commit 6169e45

File tree

1 file changed

+135
-0
lines changed

1 file changed

+135
-0
lines changed
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
declare void @use(i32)
5+
define i1 @cmpeq_xor_cst1(i32 %a, i32 %b) {
6+
; CHECK-LABEL: @cmpeq_xor_cst1(
7+
; CHECK-NEXT: [[C:%.*]] = xor i32 [[A:%.*]], 10
8+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], [[B:%.*]]
9+
; CHECK-NEXT: ret i1 [[CMP]]
10+
;
11+
%c = xor i32 %a, 10
12+
%cmp = icmp eq i32 %c, %b
13+
ret i1 %cmp
14+
}
15+
16+
define i1 @cmpeq_xor_cst2(i32 %a, i32 %b) {
17+
; CHECK-LABEL: @cmpeq_xor_cst2(
18+
; CHECK-NEXT: [[C:%.*]] = xor i32 [[A:%.*]], [[B:%.*]]
19+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], 10
20+
; CHECK-NEXT: ret i1 [[CMP]]
21+
;
22+
%c = xor i32 %a, %b
23+
%cmp = icmp eq i32 %c, 10
24+
ret i1 %cmp
25+
}
26+
27+
define i1 @cmpeq_xor_cst3(i32 %a, i32 %b) {
28+
; CHECK-LABEL: @cmpeq_xor_cst3(
29+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
30+
; CHECK-NEXT: ret i1 [[CMP]]
31+
;
32+
%c = xor i32 %a, 10
33+
%d = xor i32 %b, 10
34+
%cmp = icmp eq i32 %c, %d
35+
ret i1 %cmp
36+
}
37+
38+
define i1 @cmpne_xor_cst1(i32 %a, i32 %b) {
39+
; CHECK-LABEL: @cmpne_xor_cst1(
40+
; CHECK-NEXT: [[C:%.*]] = xor i32 [[A:%.*]], 10
41+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[C]], [[B:%.*]]
42+
; CHECK-NEXT: ret i1 [[CMP]]
43+
;
44+
%c = xor i32 %a, 10
45+
%cmp = icmp ne i32 %c, %b
46+
ret i1 %cmp
47+
}
48+
49+
define i1 @cmpne_xor_cst2(i32 %a, i32 %b) {
50+
; CHECK-LABEL: @cmpne_xor_cst2(
51+
; CHECK-NEXT: [[C:%.*]] = xor i32 [[A:%.*]], [[B:%.*]]
52+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[C]], 10
53+
; CHECK-NEXT: ret i1 [[CMP]]
54+
;
55+
%c = xor i32 %a, %b
56+
%cmp = icmp ne i32 %c, 10
57+
ret i1 %cmp
58+
}
59+
60+
define i1 @cmpne_xor_cst3(i32 %a, i32 %b) {
61+
; CHECK-LABEL: @cmpne_xor_cst3(
62+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], [[B:%.*]]
63+
; CHECK-NEXT: ret i1 [[CMP]]
64+
;
65+
%c = xor i32 %a, 10
66+
%d = xor i32 %b, 10
67+
%cmp = icmp ne i32 %c, %d
68+
ret i1 %cmp
69+
}
70+
71+
define i1 @cmpeq_xor_cst1_multiuse(i32 %a, i32 %b) {
72+
; CHECK-LABEL: @cmpeq_xor_cst1_multiuse(
73+
; CHECK-NEXT: [[C:%.*]] = xor i32 [[A:%.*]], 10
74+
; CHECK-NEXT: call void @use(i32 [[C]])
75+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], [[B:%.*]]
76+
; CHECK-NEXT: ret i1 [[CMP]]
77+
;
78+
%c = xor i32 %a, 10
79+
call void @use(i32 %c)
80+
%cmp = icmp eq i32 %c, %b
81+
ret i1 %cmp
82+
}
83+
84+
define i1 @cmpeq_xor_cst1_commuted(i32 %a, i32 %b) {
85+
; CHECK-LABEL: @cmpeq_xor_cst1_commuted(
86+
; CHECK-NEXT: [[C:%.*]] = xor i32 [[A:%.*]], 10
87+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], [[B:%.*]]
88+
; CHECK-NEXT: ret i1 [[CMP]]
89+
;
90+
%c = xor i32 %a, 10
91+
%cmp = icmp eq i32 %b, %c
92+
ret i1 %cmp
93+
}
94+
95+
define <2 x i1> @cmpeq_xor_cst1_vec(<2 x i32> %a, <2 x i32> %b) {
96+
; CHECK-LABEL: @cmpeq_xor_cst1_vec(
97+
; CHECK-NEXT: [[C:%.*]] = xor <2 x i32> [[A:%.*]], <i32 10, i32 11>
98+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[C]], [[B:%.*]]
99+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
100+
;
101+
%c = xor <2 x i32> %a, <i32 10, i32 11>
102+
%cmp = icmp eq <2 x i32> %b, %c
103+
ret <2 x i1> %cmp
104+
}
105+
106+
; tests from PR65968
107+
define i1 @foo1(i32 %x, i32 %y) {
108+
; CHECK-LABEL: @foo1(
109+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], -2147483648
110+
; CHECK-NEXT: [[NEG:%.*]] = and i32 [[Y:%.*]], -2147483648
111+
; CHECK-NEXT: [[AND1:%.*]] = xor i32 [[NEG]], -2147483648
112+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[AND1]]
113+
; CHECK-NEXT: ret i1 [[CMP]]
114+
;
115+
%and = and i32 %x, -2147483648
116+
%neg = xor i32 %y, -1
117+
%and1 = and i32 %neg, -2147483648
118+
%cmp = icmp eq i32 %and, %and1
119+
ret i1 %cmp
120+
}
121+
122+
define i1 @foo2(i32 %x, i32 %y) {
123+
; CHECK-LABEL: @foo2(
124+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], -2147483648
125+
; CHECK-NEXT: [[NEG:%.*]] = and i32 [[Y:%.*]], -2147483648
126+
; CHECK-NEXT: [[AND1:%.*]] = xor i32 [[NEG]], -2147483648
127+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[AND1]]
128+
; CHECK-NEXT: ret i1 [[CMP]]
129+
;
130+
%and = and i32 %x, -2147483648
131+
%neg = and i32 %y, -2147483648
132+
%and1 = xor i32 %neg, -2147483648
133+
%cmp = icmp eq i32 %and, %and1
134+
ret i1 %cmp
135+
}

0 commit comments

Comments
 (0)