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:
@@ -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
|
||||
|
||||
3732
cranelift/filetests/filetests/egraph/icmp-parameterized.clif
Normal file
3732
cranelift/filetests/filetests/egraph/icmp-parameterized.clif
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
89
cranelift/filetests/filetests/egraph/make-icmp-parameterized-tests.sh
Executable file
89
cranelift/filetests/filetests/egraph/make-icmp-parameterized-tests.sh
Executable 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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user