This is an archive of the discontinued LLVM Phabricator instance.

[GlobalISel] Accept multiple vregs in lowerFormalArgs
ClosedPublic

Authored by rovka on Jun 19 2019, 6:54 AM.

Details

Summary

Change the interface of CallLowering::lowerFormalArguments to accept
several virtual registers for each formal argument, instead of just one.
This is a follow-up to D46018.

CallLowering::lowerReturn was similarly refactored in D49660. lowerCall
will be refactored in the same way in follow-up patches.

With this change, we forward the virtual registers generated for
aggregates to CallLowering. Therefore, the target can decide itself
whether it wants to handle them as separate pieces or use one big
register. We also copy the pack/unpackRegs helpers to CallLowering to
facilitate this.

ARM and AArch64 have been updated to use the passed in virtual registers
directly, which means we no longer need to generate so many
merge/extract instructions.

AArch64 seems to have had a bug when lowering e.g. [1 x i8*], which was
put into a s64 instead of a p0. Added a test-case which illustrates the
problem more clearly (it crashes without this patch) and fixed the
existing test-case to expect p0.

AMDGPU has been updated to unpack into the virtual registers for
kernels. I think the other code paths fall back for aggregates, so this
should be NFC.

Mips doesn't support aggregates yet, so it's also NFC.

x86 seems to have code for dealing with aggregates, but I couldn't find
the tests for it, so I just added a fallback to DAGISel if we get more
than one virtual register for an argument.

Diff Detail

Repository
rL LLVM

Event Timeline

rovka created this revision.Jun 19 2019, 6:54 AM

More context here too and subsequent patches please.

rovka updated this revision to Diff 205758.Jun 20 2019, 2:33 AM

More context.

This revision is now accepted and ready to land.Jun 20 2019, 11:36 AM
This revision was automatically updated to reflect the committed changes.