[RISCV] Branchless lowering for select (and (x , 0x1) == 0), y, (z ^ y) ) and select...
authorPhilip Reames <preames@rivosinc.com>
Fri, 30 Sep 2022 15:11:35 +0000 (08:11 -0700)
committerPhilip Reames <listmail@philipreames.com>
Fri, 30 Sep 2022 15:24:32 +0000 (08:24 -0700)
commit2b5960028ead83ec56c5623b2b8c8c12d91d6ed0
tree0f2edbc3ef16f89fcc4d15ee382388a4e0ea70a0
parent435debea69831ee1fd4ba15d023e50baf7533e75
[RISCV] Branchless lowering for select (and (x , 0x1) == 0), y, (z ^ y) ) and select (and (x , 0x1) == 0), y, (z | y) )

This code is directly ported from the X86 backend which applies the same rewrite (along with several others). Planning on looking more closely at the other branchless variants from x86 to see if any are worth porting in future changes.

Motivation here is the coremark crc8 routine from https://github.com/eembc/coremark/blob/main/core_util.c#L165. This patch significantly reduces the number of unpredictable branches in the workload.

Differential Revision: https://reviews.llvm.org/D134881
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/test/CodeGen/RISCV/select.ll