|
1770 | 1770 | )
|
1771 | 1771 | ;; CHECK: (func $canonicalize-consts-vars (param $x i32) (param $y i32)
|
1772 | 1772 | ;; CHECK-NEXT: (drop
|
| 1773 | + ;; CHECK-NEXT: (i32.const 0) |
| 1774 | + ;; CHECK-NEXT: ) |
| 1775 | + ;; CHECK-NEXT: (drop |
1773 | 1776 | ;; CHECK-NEXT: (i32.and
|
1774 |
| - ;; CHECK-NEXT: (i32.const 1) |
1775 | 1777 | ;; CHECK-NEXT: (i32.const 2)
|
| 1778 | + ;; CHECK-NEXT: (i32.const 1) |
1776 | 1779 | ;; CHECK-NEXT: )
|
1777 | 1780 | ;; CHECK-NEXT: )
|
1778 | 1781 | ;; CHECK-NEXT: (drop
|
|
1810 | 1813 | ;; CHECK-NEXT: )
|
1811 | 1814 | (func $canonicalize-consts-vars (param $x i32) (param $y i32)
|
1812 | 1815 | (drop (i32.and (i32.const 1) (i32.const 2)))
|
| 1816 | + (drop (i32.and (i32.const 2) (i32.const 1))) |
1813 | 1817 | (drop (i32.and (local.get $x) (i32.const 3)))
|
1814 | 1818 | (drop (i32.and (i32.const 4) (local.get $x)))
|
1815 | 1819 | (drop (i32.and (local.get $x) (local.get $y)))
|
|
3193 | 3197 | (i32.const 24)
|
3194 | 3198 | )
|
3195 | 3199 | )
|
3196 |
| - ;; CHECK: (func $sext-24-and-127-128 (result i32) |
| 3200 | + ;; CHECK: (func $sext-24-and-127-unknown (param $x i32) (result i32) |
3197 | 3201 | ;; CHECK-NEXT: (i32.and
|
| 3202 | + ;; CHECK-NEXT: (local.get $x) |
3198 | 3203 | ;; CHECK-NEXT: (i32.const 127)
|
3199 |
| - ;; CHECK-NEXT: (i32.const 128) |
3200 | 3204 | ;; CHECK-NEXT: )
|
3201 | 3205 | ;; CHECK-NEXT: )
|
3202 |
| - (func $sext-24-and-127-128 (result i32) |
| 3206 | + (func $sext-24-and-127-unknown (param $x i32) (result i32) |
3203 | 3207 | (i32.shr_s
|
3204 | 3208 | (i32.shl
|
3205 | 3209 | (i32.and ;; takes the min, here it is ok
|
3206 | 3210 | (i32.const 127)
|
3207 |
| - (i32.const 128) |
| 3211 | + (local.get $x) |
3208 | 3212 | )
|
3209 | 3213 | (i32.const 24)
|
3210 | 3214 | )
|
|
7300 | 7304 | )
|
7301 | 7305 | )
|
7302 | 7306 | )
|
7303 |
| - ;; CHECK: (func $de-morgan-2 (param $x i32) (param $y i32) |
| 7307 | + ;; CHECK: (func $de-morgan-2 (param $x i32) (param $y i32) (param $z i64) |
7304 | 7308 | ;; CHECK-NEXT: (drop
|
7305 | 7309 | ;; CHECK-NEXT: (i32.eqz
|
7306 | 7310 | ;; CHECK-NEXT: (i32.or
|
|
7350 | 7354 | ;; CHECK-NEXT: (i32.eqz
|
7351 | 7355 | ;; CHECK-NEXT: (local.get $x)
|
7352 | 7356 | ;; CHECK-NEXT: )
|
7353 |
| - ;; CHECK-NEXT: (i32.const 2) |
| 7357 | + ;; CHECK-NEXT: (i32.wrap_i64 |
| 7358 | + ;; CHECK-NEXT: (local.get $z) |
| 7359 | + ;; CHECK-NEXT: ) |
7354 | 7360 | ;; CHECK-NEXT: )
|
7355 | 7361 | ;; CHECK-NEXT: )
|
7356 | 7362 | ;; CHECK-NEXT: (drop
|
|
7359 | 7365 | ;; CHECK-NEXT: )
|
7360 | 7366 | ;; CHECK-NEXT: )
|
7361 | 7367 | ;; CHECK-NEXT: )
|
7362 |
| - (func $de-morgan-2 (param $x i32) (param $y i32) |
| 7368 | + (func $de-morgan-2 (param $x i32) (param $y i32) (param $z i64) |
7363 | 7369 | (drop
|
7364 | 7370 | (i32.and (i32.eqz (local.get $x)) (i32.eqz (local.get $y)))
|
7365 | 7371 | )
|
|
7376 | 7382 | (i32.and (local.get $x) (i32.eqz (local.get $y)))
|
7377 | 7383 | )
|
7378 | 7384 | (drop
|
7379 |
| - (i32.and (i32.eqz (local.get $x)) (i32.wrap_i64 (i64.const 2))) |
| 7385 | + (i32.and (i32.eqz (local.get $x)) (i32.wrap_i64 (local.get $z))) |
7380 | 7386 | )
|
7381 | 7387 | (drop
|
7382 | 7388 | (i32.and (i32.wrap_i64 (i64.const 1)) (i32.eqz (local.get $y)))
|
@@ -18218,4 +18224,190 @@
|
18218 | 18224 | (i32.const 1)
|
18219 | 18225 | )
|
18220 | 18226 | )
|
| 18227 | + ;; CHECK: (func $add-op-no-overlapping-bits-corner-case (param $0 i32) (param $1 i64) |
| 18228 | + ;; CHECK-NEXT: (drop |
| 18229 | + ;; CHECK-NEXT: (i32.const 0) |
| 18230 | + ;; CHECK-NEXT: ) |
| 18231 | + ;; CHECK-NEXT: (drop |
| 18232 | + ;; CHECK-NEXT: (i64.const 0) |
| 18233 | + ;; CHECK-NEXT: ) |
| 18234 | + ;; CHECK-NEXT: (drop |
| 18235 | + ;; CHECK-NEXT: (i64.const 0) |
| 18236 | + ;; CHECK-NEXT: ) |
| 18237 | + ;; CHECK-NEXT: (drop |
| 18238 | + ;; CHECK-NEXT: (i32.const 0) |
| 18239 | + ;; CHECK-NEXT: ) |
| 18240 | + ;; CHECK-NEXT: (drop |
| 18241 | + ;; CHECK-NEXT: (i64.const 0) |
| 18242 | + ;; CHECK-NEXT: ) |
| 18243 | + ;; CHECK-NEXT: ) |
| 18244 | + (func $add-op-no-overlapping-bits-corner-case (param $0 i32) (param $1 i64) |
| 18245 | + ;; optimizeAndNoOverlappingBits simplifies AND operations where |
| 18246 | + ;; - the left value covers bits in [0, n) |
| 18247 | + ;; - the right operand is a constant with no bits in [0, n) |
| 18248 | + ;; Result is simplified to zero. |
| 18249 | + ;; No bit overlaps, so we optimize. |
| 18250 | + (drop |
| 18251 | + (i32.and |
| 18252 | + (i32.const 1) |
| 18253 | + (i32.const 2) |
| 18254 | + ) |
| 18255 | + ) |
| 18256 | + (drop |
| 18257 | + (i64.and |
| 18258 | + (i64.const 1) |
| 18259 | + (i64.const 2) |
| 18260 | + ) |
| 18261 | + ) |
| 18262 | + (drop |
| 18263 | + (i64.and |
| 18264 | + (i64.const 0x7fffffff) |
| 18265 | + (i64.const 0x80000000) |
| 18266 | + ) |
| 18267 | + ) |
| 18268 | + ;; We know something (but not constant) about the bits |
| 18269 | + ;; on the left, so we can optimize. |
| 18270 | + (drop |
| 18271 | + (i32.and |
| 18272 | + (i32.and |
| 18273 | + (local.get $0) |
| 18274 | + (i32.const 0xff) |
| 18275 | + ) |
| 18276 | + (i32.const 0xff00) |
| 18277 | + ) |
| 18278 | + ) |
| 18279 | + (drop |
| 18280 | + (i64.and |
| 18281 | + (i64.and |
| 18282 | + (local.get $1) |
| 18283 | + (i64.const 0xff) |
| 18284 | + ) |
| 18285 | + (i64.const 0xff00) |
| 18286 | + ) |
| 18287 | + ) |
| 18288 | + ) |
| 18289 | + ;; CHECK: (func $add-op-overlapping-bits-corner-case |
| 18290 | + ;; CHECK-NEXT: (drop |
| 18291 | + ;; CHECK-NEXT: (i32.and |
| 18292 | + ;; CHECK-NEXT: (i32.const 2147483647) |
| 18293 | + ;; CHECK-NEXT: (i32.const -2147483647) |
| 18294 | + ;; CHECK-NEXT: ) |
| 18295 | + ;; CHECK-NEXT: ) |
| 18296 | + ;; CHECK-NEXT: (drop |
| 18297 | + ;; CHECK-NEXT: (i64.and |
| 18298 | + ;; CHECK-NEXT: (i64.const 2147483647) |
| 18299 | + ;; CHECK-NEXT: (i64.const 2147483649) |
| 18300 | + ;; CHECK-NEXT: ) |
| 18301 | + ;; CHECK-NEXT: ) |
| 18302 | + ;; CHECK-NEXT: ) |
| 18303 | + (func $add-op-overlapping-bits-corner-case |
| 18304 | + ;; One bit overlaps, so we cannot optimize. |
| 18305 | + (drop |
| 18306 | + (i32.and |
| 18307 | + (i32.const 0x7fffffff) |
| 18308 | + (i32.const 0x80000001) |
| 18309 | + ) |
| 18310 | + ) |
| 18311 | + (drop |
| 18312 | + (i64.and |
| 18313 | + (i64.const 0x7fffffff) |
| 18314 | + (i64.const 0x80000001) |
| 18315 | + ) |
| 18316 | + ) |
| 18317 | + ) |
| 18318 | + ;; CHECK: (func $add-op-no-overlapping-skipped |
| 18319 | + ;; CHECK-NEXT: (drop |
| 18320 | + ;; CHECK-NEXT: (i32.and |
| 18321 | + ;; CHECK-NEXT: (i32.const 2) |
| 18322 | + ;; CHECK-NEXT: (i32.const 1) |
| 18323 | + ;; CHECK-NEXT: ) |
| 18324 | + ;; CHECK-NEXT: ) |
| 18325 | + ;; CHECK-NEXT: (drop |
| 18326 | + ;; CHECK-NEXT: (i64.and |
| 18327 | + ;; CHECK-NEXT: (i64.const 2) |
| 18328 | + ;; CHECK-NEXT: (i64.const 1) |
| 18329 | + ;; CHECK-NEXT: ) |
| 18330 | + ;; CHECK-NEXT: ) |
| 18331 | + ;; CHECK-NEXT: (drop |
| 18332 | + ;; CHECK-NEXT: (i64.and |
| 18333 | + ;; CHECK-NEXT: (i64.const 2147483648) |
| 18334 | + ;; CHECK-NEXT: (i64.const 2147483647) |
| 18335 | + ;; CHECK-NEXT: ) |
| 18336 | + ;; CHECK-NEXT: ) |
| 18337 | + ;; CHECK-NEXT: ) |
| 18338 | + (func $add-op-no-overlapping-skipped |
| 18339 | + ;; Both-constant cases which do not meet the condition (mask of left has no |
| 18340 | + ;; overlap with right) is left for Precompute. |
| 18341 | + (drop |
| 18342 | + (i32.and |
| 18343 | + (i32.const 2) |
| 18344 | + (i32.const 1) |
| 18345 | + ) |
| 18346 | + ) |
| 18347 | + (drop |
| 18348 | + (i64.and |
| 18349 | + (i64.const 2) |
| 18350 | + (i64.const 1) |
| 18351 | + ) |
| 18352 | + ) |
| 18353 | + (drop |
| 18354 | + (i64.and |
| 18355 | + (i64.const 0x80000000) |
| 18356 | + (i64.const 0x7fffffff) |
| 18357 | + ) |
| 18358 | + ) |
| 18359 | + ) |
| 18360 | + ;; CHECK: (func $add-op-unknown-useful (param $0 i32) (param $1 i64) |
| 18361 | + ;; CHECK-NEXT: (drop |
| 18362 | + ;; CHECK-NEXT: (i32.and |
| 18363 | + ;; CHECK-NEXT: (i32.const -2147483648) |
| 18364 | + ;; CHECK-NEXT: (i32.const 2147483647) |
| 18365 | + ;; CHECK-NEXT: ) |
| 18366 | + ;; CHECK-NEXT: ) |
| 18367 | + ;; CHECK-NEXT: (drop |
| 18368 | + ;; CHECK-NEXT: (i64.and |
| 18369 | + ;; CHECK-NEXT: (i64.const -9223372036854775808) |
| 18370 | + ;; CHECK-NEXT: (i64.const 9223372036854775807) |
| 18371 | + ;; CHECK-NEXT: ) |
| 18372 | + ;; CHECK-NEXT: ) |
| 18373 | + ;; CHECK-NEXT: (drop |
| 18374 | + ;; CHECK-NEXT: (i32.and |
| 18375 | + ;; CHECK-NEXT: (local.get $0) |
| 18376 | + ;; CHECK-NEXT: (i32.const 1) |
| 18377 | + ;; CHECK-NEXT: ) |
| 18378 | + ;; CHECK-NEXT: ) |
| 18379 | + ;; CHECK-NEXT: (drop |
| 18380 | + ;; CHECK-NEXT: (i64.and |
| 18381 | + ;; CHECK-NEXT: (local.get $1) |
| 18382 | + ;; CHECK-NEXT: (i64.const 1) |
| 18383 | + ;; CHECK-NEXT: ) |
| 18384 | + ;; CHECK-NEXT: ) |
| 18385 | + ;; CHECK-NEXT: ) |
| 18386 | + (func $add-op-unknown-useful (param $0 i32) (param $1 i64) |
| 18387 | + ;; We know nothing useful about the bits on the left, so we cannot optimize. |
| 18388 | + (drop |
| 18389 | + (i32.and |
| 18390 | + (i32.const 0x80000000) |
| 18391 | + (i32.const 0x7fffffff) |
| 18392 | + ) |
| 18393 | + ) |
| 18394 | + (drop |
| 18395 | + (i64.and |
| 18396 | + (i64.const 0x8000000000000000) |
| 18397 | + (i64.const 0x7fffffffffffffff) |
| 18398 | + ) |
| 18399 | + ) |
| 18400 | + (drop |
| 18401 | + (i32.and |
| 18402 | + (local.get $0) |
| 18403 | + (i32.const 1) |
| 18404 | + ) |
| 18405 | + ) |
| 18406 | + (drop |
| 18407 | + (i64.and |
| 18408 | + (local.get $1) |
| 18409 | + (i64.const 1) |
| 18410 | + ) |
| 18411 | + ) |
| 18412 | + ) |
18221 | 18413 | )
|
0 commit comments