xref: /llvm-project/llvm/test/Transforms/InstCombine/fold-add-sub.ll (revision a6edcea211a3d415212adb69b544f853351a7627)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4declare void @use.i8(i8)
5define 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 [[Y]], [[Z]]
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
22define 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 i8 [[Y]], [[Z]]
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
39define 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 [[Y]], [[Z]]
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
56define 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
73define 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 [[Y]], [[Z]]
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
90define 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 [[Y]], [[Z]]
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
107define 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:%.*]] = sub nuw i8 [[X]], [[Z]]
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
124define 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:%.*]] = sub i8 [[X]], [[Z]]
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
141define 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:%.*]] = sub nsw i8 [[X]], [[Z]]
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
158define 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:%.*]] = sub i8 [[X]], [[Z]]
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
175define 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:%.*]] = sub i8 [[X]], [[Z]]
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
192define 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}
208