This is an archive of the discontinued LLVM Phabricator instance.

[AArch64][GlobalISel] Support sibling calls with outgoing arguments
ClosedPublic

Authored by paquette on Sep 11 2019, 3:06 PM.

Details

Summary

This adds support for lowering sibling calls with outgoing arguments.

e.g

define void @foo(i32 %a)

Support is ported from AArch64ISelLowering's isEligibleForTailCallOptimization. The only thing that is missing is a full port of TargetLowering::parametersInCSRMatch. So, if we're using swiftself, we'll never tail call.

  • Rename analyzeCallResult to analyzeArgInfo, since the function is now used for both outgoing and incoming arguments
  • Teach OutgoingArgHandler about tail calls. Tail calls use frame indices for stack arguments.
  • Teach lowerFormalArguments to set the bytes in the caller's stack argument area. This is used later to check if the tail call's parameters will fit on the caller's stack.
  • Add areCalleeOutgoingArgsTailCallable to perform the eligibility check on the callee's outgoing arguments.

For testing:

  • Update call-translator-tail-call to verify that we can now tail call with outgoing arguments, use G_FRAME_INDEX for stack arguments, and respect the size of the caller's stack
  • Remove GISel-specific check lines from speculation-hardening.ll, since GISel now tail calls like the other selectors
  • Add a GISel test line to tailcall-string-rvo.ll since we can tail call in that test now
  • Add a GISel test line to tailcall_misched_graph.ll since we tail call there now. Add specific check lines for GISel, since the debug output from the machine-scheduler differs with GlobalISel. The dependency still holds, but the output comes out in a different order.

Diff Detail

Event Timeline

paquette created this revision.Sep 11 2019, 3:06 PM
aemerson added inline comments.Sep 11 2019, 10:24 PM
llvm/lib/Target/AArch64/AArch64CallLowering.cpp
413

Not really sure what this comment means.

paquette marked an inline comment as done.Sep 12 2019, 9:09 AM
paquette added inline comments.
llvm/lib/Target/AArch64/AArch64CallLowering.cpp
413

Copied/pasted it from the SDAG code, but I can reword it.

paquette updated this revision to Diff 219935.Sep 12 2019, 9:13 AM

Improve comment

aemerson accepted this revision.Sep 12 2019, 2:39 PM

LGTM.

This revision is now accepted and ready to land.Sep 12 2019, 2:39 PM
This revision was automatically updated to reflect the committed changes.