[AArch64][NFC] NFC for const vector as Instruction operand (#116790)
[llvm-project.git] / llvm / test / Transforms / InstCombine / fold-add-sub.ll
blobbbb7bb67369e7f70cccd609434e1dcfd2d356dff
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
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 [[Y]], [[Z]]
12 ; CHECK-NEXT:    ret i8 [[R]]
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
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 i8 [[Y]], [[Z]]
29 ; CHECK-NEXT:    ret i8 [[R]]
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
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 [[Y]], [[Z]]
46 ; CHECK-NEXT:    ret i8 [[R]]
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
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]]
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
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 [[Y]], [[Z]]
80 ; CHECK-NEXT:    ret i8 [[R]]
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
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 [[Y]], [[Z]]
97 ; CHECK-NEXT:    ret i8 [[R]]
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
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:%.*]] = sub nuw i8 [[X]], [[Z]]
114 ; CHECK-NEXT:    ret i8 [[R]]
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
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:%.*]] = sub i8 [[X]], [[Z]]
131 ; CHECK-NEXT:    ret i8 [[R]]
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
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:%.*]] = sub nsw i8 [[X]], [[Z]]
148 ; CHECK-NEXT:    ret i8 [[R]]
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
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:%.*]] = sub i8 [[X]], [[Z]]
165 ; CHECK-NEXT:    ret i8 [[R]]
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
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:%.*]] = sub i8 [[X]], [[Z]]
182 ; CHECK-NEXT:    ret i8 [[R]]
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
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]]
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