HomePhabricator

[RISCV] Prevent re-ordering some adds after shifts

Authored by lenary on Jun 18 2019, 1:38 PM.

Description

[RISCV] Prevent re-ordering some adds after shifts

Summary:
DAGCombine will normally turn a (shl (add x, c1), c2) into (add (shl x, c2), c1 << c2), where c1 and c2 are constants. This can be prevented by a callback in TargetLowering.

On RISC-V, materialising the constant c1 << c2 can be more expensive than materialising c1, because materialising the former may take more instructions, and may use a register, where materialising the latter would not.

This patch implements the hook in RISCVTargetLowering to prevent this transform, in the cases where:

  • c1 fits into the immediate field in an addi instruction.
  • c1 takes fewer instructions to materialise than c1 << c2.

In future, DAGCombine could do the check to see whether c1 fits into an add immediate, which might simplify more targets hooks than just RISC-V.

Reviewers: asb, luismarques, efriedma

Reviewed By: asb

Subscribers: xbolva00, lebedev.ri, craig.topper, lewis-revill, Jim, hiraditya, rbar, johnrusso, simoncook, apazos, sabuasal, niosHD, kito-cheng, shiva0217, jrtc27, zzheng, edward-jones, rogfer01, MartinMosbeck, brucehoult, the_o, rkruppe, PkmX, jocewei, psnobl, benna, llvm-commits

Tags: #llvm

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

llvm-svn: 363736

Details

Committed
lenaryJun 18 2019, 1:38 PM
Reviewer
asb
Differential Revision
D62857: [RISCV] Prevent re-ordering some adds after shifts
Parents
rGa0eb49c26e53: [libFuzzer] Improve FuzzedDataProvider helper.
Branches
Unknown
Tags
Unknown