This is an archive of the discontinued LLVM Phabricator instance.

[AArch64][GlobalISel] Refactor G_BRCOND selection
ClosedPublic

Authored by paquette on Dec 3 2020, 9:34 AM.

Details

Summary

selectCompareBranch was hard to understand.

Also, it was being needlessly pessimistic with the ProduceNonFlagSettingCondBr case. It assumed that everything in selectCompareBranch would emit a TB(N)Z or C(B)NZ. That's not true; the G_FCMP + G_BRCOND case would never emit those instructions, and the G_ICMP + G_BRCOND case was capable of emitting an integer compare + Bcc.

  • Refactor selectCompareBranch into separate functions based off of what is feeding the G_BRCOND's condition.
  • Move G_BRCOND selection code from select to selectCompareBranch.
  • Remove duplicated constraint code from the code originally in select; emitTestBit already handles that, so no need to constrain twice.
  • Factor out the G_FCMP + G_BRCOND case into selectCompareBranchFedByFCmp.
  • Split the G_ICMP + G_BRCOND case into an optimization function, tryOptCompareBranchFedByICmp and a general selection function, selectCompareBranchFedByICmp.
  • Reduce the number of things passed to tryOptAndIntoCompareBranch.
  • Improve documentation.
  • Give some variables more descriptive names.

Other than improving the code generation for functions with speculative_load_hardening by getting the logic correct, this is NFC.

Diff Detail

Event Timeline

paquette created this revision.Dec 3 2020, 9:34 AM
paquette requested review of this revision.Dec 3 2020, 9:34 AM
aemerson accepted this revision.Dec 3 2020, 8:50 PM
aemerson added inline comments.
llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
1573–1580

This seems a bit overkill for just 2 cases, just use 2 if()s?

This revision is now accepted and ready to land.Dec 3 2020, 8:50 PM
This revision was automatically updated to reflect the committed changes.