Skip to content

Commit 155e3aa

Browse files
committed
[InstCombine] Add tests for reassosiating (add/sub (sub/add) (sub/add)); NFC
1 parent ff81f9f commit 155e3aa

File tree

1 file changed

+207
-0
lines changed

1 file changed

+207
-0
lines changed
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
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.i8(i8)
5+
define i8 @test_add_nsw(i8 %x, i8 %y, i8 %z) {
6+
; CHECK-LABEL: @test_add_nsw(
7+
; CHECK-NEXT: [[LHS:%.*]] = add nsw i8 [[X:%.*]], [[Y:%.*]]
8+
; CHECK-NEXT: [[RHS:%.*]] = add nsw i8 [[X]], [[Z:%.*]]
9+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
10+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
11+
; CHECK-NEXT: [[R:%.*]] = sub nsw i8 [[LHS]], [[RHS]]
12+
; CHECK-NEXT: ret i8 [[R]]
13+
;
14+
%lhs = add nsw i8 %x, %y
15+
%rhs = add nsw i8 %x, %z
16+
call void @use.i8(i8 %lhs)
17+
call void @use.i8(i8 %rhs)
18+
%r = sub nsw i8 %lhs, %rhs
19+
ret i8 %r
20+
}
21+
22+
define i8 @test_add_nsw_no_prop(i8 %x, i8 %y, i8 %z) {
23+
; CHECK-LABEL: @test_add_nsw_no_prop(
24+
; CHECK-NEXT: [[LHS:%.*]] = add nsw i8 [[X:%.*]], [[Y:%.*]]
25+
; CHECK-NEXT: [[RHS:%.*]] = add nuw i8 [[X]], [[Z:%.*]]
26+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
27+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
28+
; CHECK-NEXT: [[R:%.*]] = sub nsw i8 [[LHS]], [[RHS]]
29+
; CHECK-NEXT: ret i8 [[R]]
30+
;
31+
%lhs = add nsw i8 %x, %y
32+
%rhs = add nuw i8 %x, %z
33+
call void @use.i8(i8 %lhs)
34+
call void @use.i8(i8 %rhs)
35+
%r = sub nsw i8 %lhs, %rhs
36+
ret i8 %r
37+
}
38+
39+
define i8 @test_add(i8 %x, i8 %y, i8 %z) {
40+
; CHECK-LABEL: @test_add(
41+
; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]
42+
; CHECK-NEXT: [[RHS:%.*]] = add i8 [[X]], [[Z:%.*]]
43+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
44+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
45+
; CHECK-NEXT: [[R:%.*]] = sub i8 [[LHS]], [[RHS]]
46+
; CHECK-NEXT: ret i8 [[R]]
47+
;
48+
%lhs = add i8 %x, %y
49+
%rhs = add i8 %x, %z
50+
call void @use.i8(i8 %lhs)
51+
call void @use.i8(i8 %rhs)
52+
%r = sub i8 %lhs, %rhs
53+
ret i8 %r
54+
}
55+
56+
define i8 @test_add_fail(i8 %w, i8 %x, i8 %y, i8 %z) {
57+
; CHECK-LABEL: @test_add_fail(
58+
; CHECK-NEXT: [[LHS:%.*]] = add i8 [[W:%.*]], [[Y:%.*]]
59+
; CHECK-NEXT: [[RHS:%.*]] = add i8 [[X:%.*]], [[Z:%.*]]
60+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
61+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
62+
; CHECK-NEXT: [[R:%.*]] = sub i8 [[LHS]], [[RHS]]
63+
; CHECK-NEXT: ret i8 [[R]]
64+
;
65+
%lhs = add i8 %w, %y
66+
%rhs = add i8 %x, %z
67+
call void @use.i8(i8 %lhs)
68+
call void @use.i8(i8 %rhs)
69+
%r = sub i8 %lhs, %rhs
70+
ret i8 %r
71+
}
72+
73+
define i8 @test_add_nuw(i8 %x, i8 %y, i8 %z) {
74+
; CHECK-LABEL: @test_add_nuw(
75+
; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]
76+
; CHECK-NEXT: [[RHS:%.*]] = or disjoint i8 [[X]], [[Z:%.*]]
77+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
78+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
79+
; CHECK-NEXT: [[R:%.*]] = sub nuw i8 [[LHS]], [[RHS]]
80+
; CHECK-NEXT: ret i8 [[R]]
81+
;
82+
%lhs = add i8 %x, %y
83+
%rhs = or disjoint i8 %x, %z
84+
call void @use.i8(i8 %lhs)
85+
call void @use.i8(i8 %rhs)
86+
%r = sub nuw i8 %lhs, %rhs
87+
ret i8 %r
88+
}
89+
90+
define i8 @test_add_nuw_no_prop(i8 %x, i8 %y, i8 %z) {
91+
; CHECK-LABEL: @test_add_nuw_no_prop(
92+
; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]
93+
; CHECK-NEXT: [[RHS:%.*]] = or disjoint i8 [[X]], [[Z:%.*]]
94+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
95+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
96+
; CHECK-NEXT: [[R:%.*]] = sub i8 [[LHS]], [[RHS]]
97+
; CHECK-NEXT: ret i8 [[R]]
98+
;
99+
%lhs = add i8 %x, %y
100+
%rhs = or disjoint i8 %x, %z
101+
call void @use.i8(i8 %lhs)
102+
call void @use.i8(i8 %rhs)
103+
%r = sub i8 %lhs, %rhs
104+
ret i8 %r
105+
}
106+
107+
define i8 @test_sub_nuw(i8 %x, i8 %y, i8 %z) {
108+
; CHECK-LABEL: @test_sub_nuw(
109+
; CHECK-NEXT: [[LHS:%.*]] = sub nuw i8 [[X:%.*]], [[Y:%.*]]
110+
; CHECK-NEXT: [[RHS:%.*]] = sub nuw i8 [[Y]], [[Z:%.*]]
111+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
112+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
113+
; CHECK-NEXT: [[R:%.*]] = add i8 [[LHS]], [[RHS]]
114+
; CHECK-NEXT: ret i8 [[R]]
115+
;
116+
%lhs = sub nuw i8 %x, %y
117+
%rhs = sub nuw i8 %y, %z
118+
call void @use.i8(i8 %lhs)
119+
call void @use.i8(i8 %rhs)
120+
%r = add i8 %lhs, %rhs
121+
ret i8 %r
122+
}
123+
124+
define i8 @test_sub_nuw_no_prop(i8 %x, i8 %y, i8 %z) {
125+
; CHECK-LABEL: @test_sub_nuw_no_prop(
126+
; CHECK-NEXT: [[LHS:%.*]] = sub nuw i8 [[X:%.*]], [[Y:%.*]]
127+
; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Y]], [[Z:%.*]]
128+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
129+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
130+
; CHECK-NEXT: [[R:%.*]] = add nuw i8 [[LHS]], [[RHS]]
131+
; CHECK-NEXT: ret i8 [[R]]
132+
;
133+
%lhs = sub nuw i8 %x, %y
134+
%rhs = sub i8 %y, %z
135+
call void @use.i8(i8 %lhs)
136+
call void @use.i8(i8 %rhs)
137+
%r = add nuw i8 %lhs, %rhs
138+
ret i8 %r
139+
}
140+
141+
define i8 @test_sub_nsw(i8 %x, i8 %y, i8 %z) {
142+
; CHECK-LABEL: @test_sub_nsw(
143+
; CHECK-NEXT: [[LHS:%.*]] = sub nsw i8 [[X:%.*]], [[Y:%.*]]
144+
; CHECK-NEXT: [[RHS:%.*]] = sub nsw i8 [[Y]], [[Z:%.*]]
145+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
146+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
147+
; CHECK-NEXT: [[R:%.*]] = or disjoint i8 [[LHS]], [[RHS]]
148+
; CHECK-NEXT: ret i8 [[R]]
149+
;
150+
%lhs = sub nsw i8 %x, %y
151+
%rhs = sub nsw i8 %y, %z
152+
call void @use.i8(i8 %lhs)
153+
call void @use.i8(i8 %rhs)
154+
%r = or disjoint i8 %lhs, %rhs
155+
ret i8 %r
156+
}
157+
158+
define i8 @test_sub_nsw_no_prop(i8 %x, i8 %y, i8 %z) {
159+
; CHECK-LABEL: @test_sub_nsw_no_prop(
160+
; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
161+
; CHECK-NEXT: [[RHS:%.*]] = sub nsw i8 [[Y]], [[Z:%.*]]
162+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
163+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
164+
; CHECK-NEXT: [[R:%.*]] = or disjoint i8 [[LHS]], [[RHS]]
165+
; CHECK-NEXT: ret i8 [[R]]
166+
;
167+
%lhs = sub i8 %x, %y
168+
%rhs = sub nsw i8 %y, %z
169+
call void @use.i8(i8 %lhs)
170+
call void @use.i8(i8 %rhs)
171+
%r = or disjoint i8 %lhs, %rhs
172+
ret i8 %r
173+
}
174+
175+
define i8 @test_sub_none(i8 %x, i8 %y, i8 %z) {
176+
; CHECK-LABEL: @test_sub_none(
177+
; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
178+
; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Y]], [[Z:%.*]]
179+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
180+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
181+
; CHECK-NEXT: [[R:%.*]] = add i8 [[LHS]], [[RHS]]
182+
; CHECK-NEXT: ret i8 [[R]]
183+
;
184+
%lhs = sub i8 %x, %y
185+
%rhs = sub i8 %y, %z
186+
call void @use.i8(i8 %lhs)
187+
call void @use.i8(i8 %rhs)
188+
%r = add i8 %lhs, %rhs
189+
ret i8 %r
190+
}
191+
192+
define i8 @test_sub_none_fail(i8 %x, i8 %y, i8 %z) {
193+
; CHECK-LABEL: @test_sub_none_fail(
194+
; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
195+
; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Z:%.*]], [[Y]]
196+
; CHECK-NEXT: call void @use.i8(i8 [[LHS]])
197+
; CHECK-NEXT: call void @use.i8(i8 [[RHS]])
198+
; CHECK-NEXT: [[R:%.*]] = add i8 [[LHS]], [[RHS]]
199+
; CHECK-NEXT: ret i8 [[R]]
200+
;
201+
%lhs = sub i8 %x, %y
202+
%rhs = sub i8 %z, %y
203+
call void @use.i8(i8 %lhs)
204+
call void @use.i8(i8 %rhs)
205+
%r = add i8 %lhs, %rhs
206+
ret i8 %r
207+
}

0 commit comments

Comments
 (0)