[PATCH] D63549: [GlobalISel] Accept multiple vregs in lowerFormalArgs

Diana Picus via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 19 06:54:48 PDT 2019


rovka created this revision.
rovka added reviewers: aemerson, t.p.northover, dsanders, aditya_nandakumar, arsenm, igorb, aivchenk.
Herald added subscribers: Petar.Avramovic, volkan, atanasyan, hiraditya, kristof.beyls, arichardson, tpr, javed.absar, nhaehnle, wdng, jvesely, sdardis.
Herald added a project: LLVM.

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 <https://reviews.llvm.org/D46018>.

CallLowering::lowerReturn was similarly refactored in D49660 <https://reviews.llvm.org/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.


https://reviews.llvm.org/D63549

Files:
  llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
  llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
  llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
  llvm/lib/Target/AArch64/AArch64CallLowering.cpp
  llvm/lib/Target/AArch64/AArch64CallLowering.h
  llvm/lib/Target/AMDGPU/AMDGPUCallLowering.cpp
  llvm/lib/Target/AMDGPU/AMDGPUCallLowering.h
  llvm/lib/Target/ARM/ARMCallLowering.cpp
  llvm/lib/Target/ARM/ARMCallLowering.h
  llvm/lib/Target/Mips/MipsCallLowering.cpp
  llvm/lib/Target/Mips/MipsCallLowering.h
  llvm/lib/Target/X86/X86CallLowering.cpp
  llvm/lib/Target/X86/X86CallLowering.h
  llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll
  llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll
  llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-amdgpu_kernel.ll
  llvm/test/CodeGen/ARM/GlobalISel/arm-param-lowering.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63549.205575.patch
Type: text/x-patch
Size: 38752 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190619/8fb1f7fd/attachment.bin>


More information about the llvm-commits mailing list