[RISCV] Add DAG combine to fold (fp_to_int_sat (ffloor X)) -> (select X == nan, 0...
authorCraig Topper <craig.topper@sifive.com>
Thu, 20 Jan 2022 19:32:26 +0000 (11:32 -0800)
committerCraig Topper <craig.topper@sifive.com>
Thu, 20 Jan 2022 19:35:37 +0000 (11:35 -0800)
commit94e69fbb4f3a9719d4d8cc7268dd5db5d0be7e8f
tree866105a53b059d35d17b67a82318e0da94dfdca9
parent6b92bb47901f3a2d4a9aa683b0365088113a729e
[RISCV] Add DAG combine to fold (fp_to_int_sat (ffloor X)) -> (select X == nan, 0, (fcvt X, rdn))

Similar for ceil, trunc, round, and roundeven. This allows us to use
static rounding modes to avoid a libcall.

This is similar to D116771, but for the saturating conversions.

This optimization is done for AArch64 as isel patterns.
RISCV doesn't have instructions for ceil/floor/trunc/round/roundeven
so the operations don't stick around until isel to enable a pattern
match. Thus I've implemented a DAG combine.

I'm only handling saturating to i64 or i32. This could be extended
to other sizes in the future.

Reviewed By: asb

Differential Revision: https://reviews.llvm.org/D116864
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/test/CodeGen/RISCV/double-round-conv-sat.ll [new file with mode: 0644]
llvm/test/CodeGen/RISCV/float-round-conv-sat.ll [new file with mode: 0644]
llvm/test/CodeGen/RISCV/half-round-conv-sat.ll [new file with mode: 0644]