[RISCV] Implement Hooks to avoid chaining SELECT
authorSam Elliott <selliott@lowrisc.org>
Wed, 1 Jul 2020 10:55:07 +0000 (11:55 +0100)
committerSam Elliott <selliott@lowrisc.org>
Wed, 1 Jul 2020 10:56:31 +0000 (11:56 +0100)
commit7dc892661edde4eb90229dd5a14f45a1ceb08653
tree197feb0f94b17224ccb0cad4b38f4017f49c9b5d
parentc44266dc4816ec3df084232055ec02060eec0616
[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
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/test/CodeGen/RISCV/double-previous-failure.ll
llvm/test/CodeGen/RISCV/select-and.ll
llvm/test/CodeGen/RISCV/select-or.ll
llvm/test/CodeGen/RISCV/zext-with-load-is-free.ll