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
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
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]]
50 call void @use.i8(i8 %lhs)
51 call void @use.i8(i8 %rhs)
52 %r = sub i8 %lhs, %rhs
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]]
67 call void @use.i8(i8 %lhs)
68 call void @use.i8(i8 %rhs)
69 %r = sub i8 %lhs, %rhs
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]]
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
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]]
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
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
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
135 call void @use.i8(i8 %lhs)
136 call void @use.i8(i8 %rhs)
137 %r = add nuw i8 %lhs, %rhs
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
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]]
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
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]]
186 call void @use.i8(i8 %lhs)
187 call void @use.i8(i8 %rhs)
188 %r = add i8 %lhs, %rhs
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]]
203 call void @use.i8(i8 %lhs)
204 call void @use.i8(i8 %rhs)
205 %r = add i8 %lhs, %rhs