HomePhabricator

[RISCV] Implement Hooks to avoid chaining SELECT

Authored by lenary on Jul 1 2020, 3:55 AM.

Description

[RISCV] Implement Hooks to avoid chaining SELECT

Summary:
This implements two hooks that attempt to avoid control flow for RISC-V. RISC-V
will lower SELECTs into control flow, which is not a great idea.

The hook hasMultipleConditionRegisters() turns off the following
DAGCombiner folds:

select(C0|C1, x, y) <=> select(C0, x, select(C1, x, y))
select(C0&C1, x, y) <=> select(C0, select(C1, x, y), y)

The second hook setJumpIsExpensive controls a flag that has a similar purpose
and is used in CodeGenPrepare and the SelectionDAGBuilder.

Both of these have the effect of ensuring more logic is done before fewer jumps.

Note: with the B extension, we may be able to lower select into a conditional
move instruction, so at some point these hooks will need to be guarded based on
enabled extensions.

Reviewed By: luismarques

Differential Revision: https://reviews.llvm.org/D79268

Details

Committed
lenaryJul 1 2020, 3:56 AM
Reviewer
luismarques
Differential Revision
D79268: [RISCV] Implement Hooks to avoid chaining SELECT
Parents
rGc44266dc4816: [RISCV][NFC] Add Test for (select (or B1, B2), X, Y)
Branches
Unknown
Tags
Unknown