@@ -83,4 +83,168 @@ block0(v0: i128):
8383; v3 = iconst.i64 -1
8484; v4 = sextend.i128 v3 ; v3 = -1
8585; return v4
86+ ; }
87+
88+ ;; ((x + y) - (x + z)) --> (y - z)
89+ function %test_isub_iadd_iadd_cancel(i32, i32, i32) -> i32 fast {
90+ block0(v0: i32, v1: i32, v2: i32):
91+ v3 = iadd v0, v1
92+ v4 = iadd v0, v2
93+ v5 = isub v3, v4
94+ return v5
95+ }
96+
97+ ; function %test_isub_iadd_iadd_cancel(i32, i32, i32) -> i32 fast {
98+ ; block0(v0: i32, v1: i32, v2: i32):
99+ ; v6 = isub v1, v2
100+ ; return v6
101+ ; }
102+
103+ ;; ((x - z) - (y - z)) --> (x - y)
104+ function %test_isub_isub_isub_cancel(i32, i32, i32) -> i32 fast {
105+ block0(v0: i32, v1: i32, v2: i32):
106+ v3 = isub v0, v2
107+ v4 = isub v1, v2
108+ v5 = isub v3, v4
109+ return v5
110+ }
111+
112+ ; function %test_isub_isub_isub_cancel(i32, i32, i32) -> i32 fast {
113+ ; block0(v0: i32, v1: i32, v2: i32):
114+ ; v6 = isub v0, v1
115+ ; return v6
116+ ; }
117+
118+ ;; ((x - y) - (x - z)) --> (z - y)
119+ function %test_isub_isub_isub_swap_cancel(i32, i32, i32) -> i32 fast {
120+ block0(v0: i32, v1: i32, v2: i32):
121+ v3 = isub v0, v1
122+ v4 = isub v0, v2
123+ v5 = isub v3, v4
124+ return v5
125+ }
126+
127+ ; function %test_isub_isub_isub_swap_cancel(i32, i32, i32) -> i32 fast {
128+ ; block0(v0: i32, v1: i32, v2: i32):
129+ ; v6 = isub v2, v1
130+ ; return v6
131+ ; }
132+
133+ ;; umin(x, y) + umax(x, y) --> x + y
134+ function %test_iadd_umin_umax(i32, i32) -> i32 fast {
135+ block0(v0: i32, v1: i32):
136+ v2 = umin v0, v1
137+ v3 = umax v0, v1
138+ v4 = iadd v2, v3
139+ return v4
140+ }
141+
142+ ; function %test_iadd_umin_umax(i32, i32) -> i32 fast {
143+ ; block0(v0: i32, v1: i32):
144+ ; v6 = iadd v1, v0
145+ ; return v6
146+ ; }
147+
148+ ;; smin(x, y) + smax(x, y) --> x + y
149+ function %test_iadd_smin_smax(i32, i32) -> i32 fast {
150+ block0(v0: i32, v1: i32):
151+ v2 = smin v0, v1
152+ v3 = smax v0, v1
153+ v4 = iadd v2, v3
154+ return v4
155+ }
156+
157+ ; function %test_iadd_smin_smax(i32, i32) -> i32 fast {
158+ ; block0(v0: i32, v1: i32):
159+ ; v6 = iadd v1, v0
160+ ; return v6
161+ ; }
162+
163+ ;; ((x + z) - (y + z)) --> (x - y)
164+ function %test_isub_iadd_iadd_common_rhs(i32, i32, i32) -> i32 fast {
165+ block0(v0: i32, v1: i32, v2: i32):
166+ v3 = iadd v0, v2
167+ v4 = iadd v1, v2
168+ v5 = isub v3, v4
169+ return v5
170+ }
171+
172+ ; function %test_isub_iadd_iadd_common_rhs(i32, i32, i32) -> i32 fast {
173+ ; block0(v0: i32, v1: i32, v2: i32):
174+ ; v6 = isub v0, v1
175+ ; return v6
176+ ; }
177+
178+ ;; ((x - y) + (y + z)) --> (x + z)
179+ function %test_iadd_isub_iadd_cancel(i32, i32, i32) -> i32 fast {
180+ block0(v0: i32, v1: i32, v2: i32):
181+ v3 = isub v0, v1
182+ v4 = iadd v1, v2
183+ v5 = iadd v3, v4
184+ return v5
185+ }
186+
187+ ; function %test_iadd_isub_iadd_cancel(i32, i32, i32) -> i32 fast {
188+ ; block0(v0: i32, v1: i32, v2: i32):
189+ ; v6 = iadd v0, v2
190+ ; return v6
191+ ; }
192+
193+ ;; (x - (x + y)) --> -y
194+ function %test_isub_iadd_to_ineg(i32, i32) -> i32 fast {
195+ block0(v0: i32, v1: i32):
196+ v2 = iadd v0, v1
197+ v3 = isub v0, v2
198+ return v3
199+ }
200+
201+ ; function %test_isub_iadd_to_ineg(i32, i32) -> i32 fast {
202+ ; block0(v0: i32, v1: i32):
203+ ; v4 = ineg v1
204+ ; return v4
205+ ; }
206+
207+ ;; (x + (y + (z - x))) --> (y + z)
208+ function %test_iadd_iadd_isub_cancel(i32, i32, i32) -> i32 fast {
209+ block0(v0: i32, v1: i32, v2: i32):
210+ v3 = isub v2, v0
211+ v4 = iadd v1, v3
212+ v5 = iadd v0, v4
213+ return v5
214+ }
215+
216+ ; function %test_iadd_iadd_isub_cancel(i32, i32, i32) -> i32 fast {
217+ ; block0(v0: i32, v1: i32, v2: i32):
218+ ; v6 = iadd v1, v2
219+ ; return v6
220+ ; }
221+
222+ ;; (eq ty (iadd cty x y) (iadd cty y x)) -> 1
223+ function %simplify_icmp_eq_iadd_commute(i32, i32) -> i8 fast {
224+ block0(v0: i32, v1: i32):
225+ v2 = iadd v0, v1
226+ v3 = iadd v1, v0
227+ v4 = icmp eq v2, v3
228+ return v4
229+ }
230+
231+ ; function %simplify_icmp_eq_iadd_commute(i32, i32) -> i8 fast {
232+ ; block0(v0: i32, v1: i32):
233+ ; v5 = iconst.i8 1
234+ ; return v5 ; v5 = 1
235+ ; }
236+
237+ ;; (x - y) != x --> y != 0
238+ function %simplify_icmp_ne_isub_x(i32, i32) -> i8 fast {
239+ block0(v0: i32, v1: i32):
240+ v2 = isub v0, v1
241+ v3 = icmp ne v2, v0
242+ return v3
243+ }
244+
245+ ; function %simplify_icmp_ne_isub_x(i32, i32) -> i8 fast {
246+ ; block0(v0: i32, v1: i32):
247+ ; v4 = iconst.i32 0
248+ ; v5 = icmp ne v1, v4 ; v4 = 0
249+ ; return v5
86250; }
0 commit comments