[PATCH] D89422: [AArch64][GlobalISel] Swap compare operands when it may be profitable

Jessica Paquette via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 14 13:27:32 PDT 2020


paquette created this revision.
paquette added a reviewer: aemerson.
Herald added subscribers: danielkiss, hiraditya, kristof.beyls, rovka.
Herald added a project: LLVM.
paquette requested review of this revision.

This adds support for swapping comparison operands when it may introduce new folding opportunities.

This is roughly the same as the code added to AArch64ISelLowering in 162435e7b5e026b9f988c730bb6527683f6aa853.

For an example of a testcase which exercises this, see llvm/test/CodeGen/AArch64/swap-compare-operands.ll

(Godbolt for that testcase: https://godbolt.org/z/43WEMb)

The idea behind this is that sometimes, we may be able to fold away, say, a shift or extend in a compare by swapping its operands.

e.g. in the case of this compare:

  lsl x8, x0, #1
  cmp x8, x1
  cset w0, lt

The following is equivalent:

  cmp x1, x0, lsl #1
  cset w0, gt

Most of the code here is just a reimplementation of what already exists in AArch64ISelLowering.

(See `getCmpOperandFoldingProfit` and `getAArch64Cmp` for the equivalent code.)

Note that most of the AND code in the testcase doesn't actually fold. It seems like we're missing selection support for that sort of fold right now, since SDAG happily folds these away (e.g testSwapCmpWithShiftedZeroExtend8_32 in the original .ll testcase)


https://reviews.llvm.org/D89422

Files:
  llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
  llvm/test/CodeGen/AArch64/GlobalISel/select-swap-compare-operands.mir

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D89422.298229.patch
Type: text/x-patch
Size: 29451 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201014/1daba4b2/attachment.bin>


More information about the llvm-commits mailing list