ISLE: move icmp rewrites to separate file. (#6120)

* ISLE: move `icmp` rewrites to separate file.

Move `icmp`-related rewrite rules from `algebraic.isle` to `icmp.isle`.
Also move `icmp`-related tests from `algebraic.clif` to `icmp.clif`.

* Put parameterized and unparameterized `icmp` tests in separate files

* Undo refactoring of (ir)reflexivity rewrites

* Fix `icmp-parameterised.clif`

* Undo formatting/comment changes
This commit is contained in:
Karl Meakin
2023-03-31 18:40:31 +01:00
committed by GitHub
parent 83d00fea4a
commit c8c224ead6
8 changed files with 4026 additions and 3413 deletions

View File

@@ -394,24 +394,6 @@ block0(v0: i64):
; check: return v4
}
function %f2(i8) -> i8 {
block0(v1: i8):
v2 = icmp eq v1, v1
return v2
}
; check: v3 = iconst.i8 1
; check: return v3
function %f3(i8) -> i8 {
block0(v1: i8):
v2 = icmp ne v1, v1
return v2
}
; check: v3 = iconst.i8 0
; check: return v3
function %bnot1(i8) -> i8 {
block0(v1: i8):
v2 = iconst.i8 -1
@@ -442,174 +424,6 @@ block0(v1: i64):
; check: v5 = bnot v1
; check: return v5
function %mask_icmp_result(i64, i64) -> i8 {
block0(v1: i64, v2: i64):
v3 = icmp ult v1, v2
v4 = iconst.i8 1
v5 = band v3, v4
return v5
}
; check: v3 = icmp ult v1, v2
; check: return v3
function %mask_icmp_extend_result(i64, i64) -> i64 {
block0(v1: i64, v2: i64):
v3 = icmp ult v1, v2
v4 = uextend.i64 v3
v5 = iconst.i64 1
v6 = band v4, v5
return v6
}
; check: v3 = icmp ult v1, v2
; check: v4 = uextend.i64 v3
; check: return v4
function %icmp_ult_0(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0
v2 = icmp ult v0, v1
return v2
; check: v3 = iconst.i8 0
; check: return v3
}
function %icmp_ule_0(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0
v2 = icmp ule v0, v1
return v2
; check: v3 = icmp eq v0, v1
; check: return v3
}
function %icmp_ugt_0(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0
v2 = icmp ugt v0, v1
return v2
; check: v3 = icmp ne v0, v1
; check: return v3
}
function %icmp_uge_0(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0
v2 = icmp uge v0, v1
return v2
; check: v3 = iconst.i8 1
; check: return v3
}
function %icmp_ult_umax(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0xffff_ffff
v2 = icmp ult v0, v1
return v2
; check: v3 = icmp ne v0, v1
; check: return v3
}
function %icmp_ule_umax(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0xffff_ffff
v2 = icmp ule v0, v1
return v2
; check: v3 = iconst.i8 1
; check: return v3
}
function %icmp_ugt_umax(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0xffff_ffff
v2 = icmp ugt v0, v1
return v2
; check: v3 = iconst.i8 0
; check: return v3
}
function %icmp_uge_umax(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0xffff_ffff
v2 = icmp uge v0, v1
return v2
; check: v3 = icmp eq v0, v1
; check: return v3
}
function %icmp_slt_smin(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0x8000_0000
v2 = icmp slt v0, v1
return v2
; check: v3 = iconst.i8 0
; check: return v3
}
function %icmp_sle_smin(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0x8000_0000
v2 = icmp sle v0, v1
return v2
; check: v3 = icmp eq v0, v1
; check: return v3
}
function %icmp_sgt_smin(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0x8000_0000
v2 = icmp sgt v0, v1
return v2
; check: v3 = icmp ne v0, v1
; check: return v3
}
function %icmp_sge_smin(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0x8000_0000
v2 = icmp sge v0, v1
return v2
; check: v3 = iconst.i8 1
; check: return v3
}
function %icmp_slt_smax(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0x7FFF_FFFF
v2 = icmp slt v0, v1
return v2
; check: v3 = icmp ne v0, v1
; check: return v3
}
function %icmp_sle_smax(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0x7FFF_FFFF
v2 = icmp sle v0, v1
return v2
; check: v3 = iconst.i8 1
; check: return v3
}
function %icmp_sgt_smax(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0x7FFF_FFFF
v2 = icmp sgt v0, v1
return v2
; check: v3 = iconst.i8 0
; check: return v3
}
function %icmp_sge_smax(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0x7FFF_FFFF
v2 = icmp sge v0, v1
return v2
; check: v3 = icmp eq v0, v1
; check: return v3
}
function %extend_always_above_zero(i32) -> i8 {
block0(v1: i32):
v2 = uextend.i64 v1

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,89 @@
#!/usr/bin/env bash
set -e
cd $(dirname "$0")
out=parameterized-icmp.clif
CCS="eq ne ult ule ugt uge slt sle sgt sge"
function main {
cat << EOF > $out
test optimize precise-output
set opt_level=speed
set use_egraphs=true
target x86_64
;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;; !!! GENERATED BY 'make-icmp-parameterized-tests.sh' DO NOT EDIT !!!
;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;; run with the 'CRANELIFT_TEST_BLESS=1' env var set to update this file
EOF
# Reflexivity/irreflexivity of `icmp`` cond codes:
# for reflexive cond codes, (icmp cc x x) == true.
# for irreflexive cond codes, (icmp cc x x) == false.
for cc in $CCS; do
cat << EOF >> $out
function %icmp_${cc}_self(i32) -> i8 {
block0(v0: i32):
v1 = icmp ${cc} v0, v0
return v1
}
EOF
done
# Comparisons against largest/smallest signed/unsigned values:
for cc in $CCS; do
cat << EOF >> $out
function %icmp_${cc}_umin(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0
v2 = icmp ${cc} v0, v1
return v2
}
function %icmp_${cc}_umax(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0xFFFF_FFFF
v2 = icmp ${cc} v0, v1
return v2
}
function %icmp_${cc}_smin(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0x8000_0000
v2 = icmp ${cc} v0, v1
return v2
}
function %icmp_${cc}_smax(i32) -> i8 {
block0(v0: i32):
v1 = iconst.i32 0x7FFF_FFFF
v2 = icmp ${cc} v0, v1
return v2
}
EOF
done
# `band`/`bor` of 2 comparisons:
for op in "and" "or"; do
for cc1 in $CCS; do
for cc2 in $CCS; do
cat << EOF >> $out
function %icmp_${op}_${cc1}_${cc2}(i32, i32) -> i8 {
block0(v0: i32, v1: i32):
v2 = icmp ${cc1} v0, v1
v3 = icmp ${cc2} v0, v1
v4 = b${op} v2, v3
return v4
}
EOF
done
done
done
}
main

View File

@@ -1,38 +0,0 @@
#!/usr/bin/env bash
set -e
cd $(dirname "$0")
out=icmp.clif
CCS="eq ne ult ule ugt uge slt sle sgt sge"
function main {
cat << EOF > $out
test optimize precise-output
set opt_level=speed
set use_egraphs=true
target x86_64
;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;; !!! GENERATED BY 'make-icmp-tests.sh' DO NOT EDIT !!!
;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;; run with the 'CRANELIFT_TEST_BLESS=1' env var set to update this file
EOF
for op in "and" "or"; do
for cc1 in $CCS; do
for cc2 in $CCS; do
cat << EOF >> $out
function %icmp_${op}_${cc1}_${cc2}(i32, i32) -> i8 {
block0(v0: i32, v1: i32):
v2 = icmp ${cc1} v0, v1
v3 = icmp ${cc2} v0, v1
v4 = b${op} v2, v3
return v4
}
EOF
done
done
done
}
main