binaryen icon indicating copy to clipboard operation
binaryen copied to clipboard

[OptimizeInstructions] Simplify rounding or conversions after int to float casts

Open MaxGraey opened this issue 3 years ago • 2 comments

i32 -> f64 -> i32 rountripping optimizations:

i32(f64(i32(x)))   ->   x // i32.trunc(_sat)_f64_s(f64.convert_i32_s(x)) -> x
u32(f64(u32(x)))   ->   x // i32.trunc(_sat)_f64_u(f64.convert_i32_u(x)) -> x

// note assymetric signed / unsigned or unsigned / signed cases can't be simplified in similar way

and rounding after integer to float casts:

ceil(float(int(x)))     ->  float(int(x))
floor(float(int(x)))    ->  float(int(x))
trunc(float(int(x)))    ->  float(int(x))
nearest(float(int(x)))  ->  float(int(x))

where float = f32 | f64, int = i32 | i64 | u32 | u64

MaxGraey avatar Jun 13 '22 14:06 MaxGraey

Fuzzed ITERATION: 23237

MaxGraey avatar Jun 13 '22 14:06 MaxGraey

@tlively could you take a look at this PR please?

MaxGraey avatar Jul 29 '22 04:07 MaxGraey