cranelift: simplify icmp against UMAX/SMIN/SMAX (#6037)
* cranelift: simplify `icmp` against UMAX/SMIN/SMAX * Add tests for icmp against numeric limits
This commit is contained in:
@@ -418,45 +418,149 @@ block0(v1: i64, v2: i64):
|
||||
; check: v4 = uextend.i64 v3
|
||||
; check: return v4
|
||||
|
||||
function %ult_zero_always_false(i64) -> i8 {
|
||||
block0(v1: i64):
|
||||
v2 = iconst.i64 0
|
||||
v3 = icmp ult v1, v2
|
||||
return v3
|
||||
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
|
||||
}
|
||||
|
||||
; check: v4 = iconst.i8 0
|
||||
; check: return v4
|
||||
|
||||
function %ugt_zero_always_false(i64) -> i8 {
|
||||
block0(v1: i64):
|
||||
v2 = iconst.i64 0
|
||||
v3 = icmp ugt v2, v1
|
||||
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
|
||||
}
|
||||
|
||||
; check: v5 = iconst.i8 0
|
||||
; check: return v5
|
||||
|
||||
function %uge_zero_always_false(i64) -> i8 {
|
||||
block0(v1: i64):
|
||||
v2 = iconst.i64 0
|
||||
v3 = icmp uge v1, v2
|
||||
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
|
||||
}
|
||||
|
||||
; check: v4 = iconst.i8 1
|
||||
; check: return v4
|
||||
|
||||
function %ule_zero_always_false(i64) -> i8 {
|
||||
block0(v1: i64):
|
||||
v2 = iconst.i64 0
|
||||
v3 = icmp ule v2, v1
|
||||
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
|
||||
}
|
||||
|
||||
; check: v5 = iconst.i8 1
|
||||
; check: return v5
|
||||
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):
|
||||
|
||||
Reference in New Issue
Block a user