xref: /llvm-project/llvm/test/Transforms/InstCombine/fold-add-sub.ll (revision a6edcea211a3d415212adb69b544f853351a7627)
1155e3aa0SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2155e3aa0SNoah Goldstein; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3155e3aa0SNoah Goldstein
4155e3aa0SNoah Goldsteindeclare void @use.i8(i8)
5155e3aa0SNoah Goldsteindefine i8 @test_add_nsw(i8 %x, i8 %y, i8 %z) {
6155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add_nsw(
7155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = add nsw i8 [[X:%.*]], [[Y:%.*]]
8155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = add nsw i8 [[X]], [[Z:%.*]]
9155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
10155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
11*a6edcea2SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub nsw i8 [[Y]], [[Z]]
12155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
13155e3aa0SNoah Goldstein;
14155e3aa0SNoah Goldstein  %lhs = add nsw i8 %x, %y
15155e3aa0SNoah Goldstein  %rhs = add nsw i8 %x, %z
16155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
17155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
18155e3aa0SNoah Goldstein  %r = sub nsw i8 %lhs, %rhs
19155e3aa0SNoah Goldstein  ret i8 %r
20155e3aa0SNoah Goldstein}
21155e3aa0SNoah Goldstein
22155e3aa0SNoah Goldsteindefine i8 @test_add_nsw_no_prop(i8 %x, i8 %y, i8 %z) {
23155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add_nsw_no_prop(
24155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = add nsw i8 [[X:%.*]], [[Y:%.*]]
25155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = add nuw i8 [[X]], [[Z:%.*]]
26155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
27155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
28*a6edcea2SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub i8 [[Y]], [[Z]]
29155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
30155e3aa0SNoah Goldstein;
31155e3aa0SNoah Goldstein  %lhs = add nsw i8 %x, %y
32155e3aa0SNoah Goldstein  %rhs = add nuw i8 %x, %z
33155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
34155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
35155e3aa0SNoah Goldstein  %r = sub nsw i8 %lhs, %rhs
36155e3aa0SNoah Goldstein  ret i8 %r
37155e3aa0SNoah Goldstein}
38155e3aa0SNoah Goldstein
39155e3aa0SNoah Goldsteindefine i8 @test_add(i8 %x, i8 %y, i8 %z) {
40155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add(
41155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]
42155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = add i8 [[X]], [[Z:%.*]]
43155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
44155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
45*a6edcea2SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub i8 [[Y]], [[Z]]
46155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
47155e3aa0SNoah Goldstein;
48155e3aa0SNoah Goldstein  %lhs = add i8 %x, %y
49155e3aa0SNoah Goldstein  %rhs = add i8 %x, %z
50155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
51155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
52155e3aa0SNoah Goldstein  %r = sub i8 %lhs, %rhs
53155e3aa0SNoah Goldstein  ret i8 %r
54155e3aa0SNoah Goldstein}
55155e3aa0SNoah Goldstein
56155e3aa0SNoah Goldsteindefine i8 @test_add_fail(i8 %w, i8 %x, i8 %y, i8 %z) {
57155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add_fail(
58155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = add i8 [[W:%.*]], [[Y:%.*]]
59155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = add i8 [[X:%.*]], [[Z:%.*]]
60155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
61155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
62155e3aa0SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub i8 [[LHS]], [[RHS]]
63155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
64155e3aa0SNoah Goldstein;
65155e3aa0SNoah Goldstein  %lhs = add i8 %w, %y
66155e3aa0SNoah Goldstein  %rhs = add i8 %x, %z
67155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
68155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
69155e3aa0SNoah Goldstein  %r = sub i8 %lhs, %rhs
70155e3aa0SNoah Goldstein  ret i8 %r
71155e3aa0SNoah Goldstein}
72155e3aa0SNoah Goldstein
73155e3aa0SNoah Goldsteindefine i8 @test_add_nuw(i8 %x, i8 %y, i8 %z) {
74155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add_nuw(
75155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]
76155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = or disjoint i8 [[X]], [[Z:%.*]]
77155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
78155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
79*a6edcea2SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub nuw i8 [[Y]], [[Z]]
80155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
81155e3aa0SNoah Goldstein;
82155e3aa0SNoah Goldstein  %lhs = add i8 %x, %y
83155e3aa0SNoah Goldstein  %rhs = or disjoint i8 %x, %z
84155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
85155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
86155e3aa0SNoah Goldstein  %r = sub nuw i8 %lhs, %rhs
87155e3aa0SNoah Goldstein  ret i8 %r
88155e3aa0SNoah Goldstein}
89155e3aa0SNoah Goldstein
90155e3aa0SNoah Goldsteindefine i8 @test_add_nuw_no_prop(i8 %x, i8 %y, i8 %z) {
91155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add_nuw_no_prop(
92155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]
93155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = or disjoint i8 [[X]], [[Z:%.*]]
94155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
95155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
96*a6edcea2SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub i8 [[Y]], [[Z]]
97155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
98155e3aa0SNoah Goldstein;
99155e3aa0SNoah Goldstein  %lhs = add i8 %x, %y
100155e3aa0SNoah Goldstein  %rhs = or disjoint i8 %x, %z
101155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
102155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
103155e3aa0SNoah Goldstein  %r = sub i8 %lhs, %rhs
104155e3aa0SNoah Goldstein  ret i8 %r
105155e3aa0SNoah Goldstein}
106155e3aa0SNoah Goldstein
107155e3aa0SNoah Goldsteindefine i8 @test_sub_nuw(i8 %x, i8 %y, i8 %z) {
108155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_nuw(
109155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = sub nuw i8 [[X:%.*]], [[Y:%.*]]
110155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = sub nuw i8 [[Y]], [[Z:%.*]]
111155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
112155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
113*a6edcea2SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub nuw i8 [[X]], [[Z]]
114155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
115155e3aa0SNoah Goldstein;
116155e3aa0SNoah Goldstein  %lhs = sub nuw i8 %x, %y
117155e3aa0SNoah Goldstein  %rhs = sub nuw i8 %y, %z
118155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
119155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
120155e3aa0SNoah Goldstein  %r = add i8 %lhs, %rhs
121155e3aa0SNoah Goldstein  ret i8 %r
122155e3aa0SNoah Goldstein}
123155e3aa0SNoah Goldstein
124155e3aa0SNoah Goldsteindefine i8 @test_sub_nuw_no_prop(i8 %x, i8 %y, i8 %z) {
125155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_nuw_no_prop(
126155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = sub nuw i8 [[X:%.*]], [[Y:%.*]]
127155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = sub i8 [[Y]], [[Z:%.*]]
128155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
129155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
130*a6edcea2SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub i8 [[X]], [[Z]]
131155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
132155e3aa0SNoah Goldstein;
133155e3aa0SNoah Goldstein  %lhs = sub nuw i8 %x, %y
134155e3aa0SNoah Goldstein  %rhs = sub i8 %y, %z
135155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
136155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
137155e3aa0SNoah Goldstein  %r = add nuw i8 %lhs, %rhs
138155e3aa0SNoah Goldstein  ret i8 %r
139155e3aa0SNoah Goldstein}
140155e3aa0SNoah Goldstein
141155e3aa0SNoah Goldsteindefine i8 @test_sub_nsw(i8 %x, i8 %y, i8 %z) {
142155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_nsw(
143155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = sub nsw i8 [[X:%.*]], [[Y:%.*]]
144155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = sub nsw i8 [[Y]], [[Z:%.*]]
145155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
146155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
147*a6edcea2SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub nsw i8 [[X]], [[Z]]
148155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
149155e3aa0SNoah Goldstein;
150155e3aa0SNoah Goldstein  %lhs = sub nsw i8 %x, %y
151155e3aa0SNoah Goldstein  %rhs = sub nsw i8 %y, %z
152155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
153155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
154155e3aa0SNoah Goldstein  %r = or disjoint i8 %lhs, %rhs
155155e3aa0SNoah Goldstein  ret i8 %r
156155e3aa0SNoah Goldstein}
157155e3aa0SNoah Goldstein
158155e3aa0SNoah Goldsteindefine i8 @test_sub_nsw_no_prop(i8 %x, i8 %y, i8 %z) {
159155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_nsw_no_prop(
160155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
161155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = sub nsw i8 [[Y]], [[Z:%.*]]
162155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
163155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
164*a6edcea2SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub i8 [[X]], [[Z]]
165155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
166155e3aa0SNoah Goldstein;
167155e3aa0SNoah Goldstein  %lhs = sub i8 %x, %y
168155e3aa0SNoah Goldstein  %rhs = sub nsw i8 %y, %z
169155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
170155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
171155e3aa0SNoah Goldstein  %r = or disjoint i8 %lhs, %rhs
172155e3aa0SNoah Goldstein  ret i8 %r
173155e3aa0SNoah Goldstein}
174155e3aa0SNoah Goldstein
175155e3aa0SNoah Goldsteindefine i8 @test_sub_none(i8 %x, i8 %y, i8 %z) {
176155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_none(
177155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
178155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = sub i8 [[Y]], [[Z:%.*]]
179155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
180155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
181*a6edcea2SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub i8 [[X]], [[Z]]
182155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
183155e3aa0SNoah Goldstein;
184155e3aa0SNoah Goldstein  %lhs = sub i8 %x, %y
185155e3aa0SNoah Goldstein  %rhs = sub i8 %y, %z
186155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
187155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
188155e3aa0SNoah Goldstein  %r = add i8 %lhs, %rhs
189155e3aa0SNoah Goldstein  ret i8 %r
190155e3aa0SNoah Goldstein}
191155e3aa0SNoah Goldstein
192155e3aa0SNoah Goldsteindefine i8 @test_sub_none_fail(i8 %x, i8 %y, i8 %z) {
193155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_none_fail(
194155e3aa0SNoah Goldstein; CHECK-NEXT:    [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
195155e3aa0SNoah Goldstein; CHECK-NEXT:    [[RHS:%.*]] = sub i8 [[Z:%.*]], [[Y]]
196155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[LHS]])
197155e3aa0SNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[RHS]])
198155e3aa0SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = add i8 [[LHS]], [[RHS]]
199155e3aa0SNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
200155e3aa0SNoah Goldstein;
201155e3aa0SNoah Goldstein  %lhs = sub i8 %x, %y
202155e3aa0SNoah Goldstein  %rhs = sub i8 %z, %y
203155e3aa0SNoah Goldstein  call void @use.i8(i8 %lhs)
204155e3aa0SNoah Goldstein  call void @use.i8(i8 %rhs)
205155e3aa0SNoah Goldstein  %r = add i8 %lhs, %rhs
206155e3aa0SNoah Goldstein  ret i8 %r
207155e3aa0SNoah Goldstein}
208