#
071287c5 |
| 05-Sep-2019 |
Simon Pilgrim <llvm-dev@redking.me.uk> |
Revert rL370996 from llvm/trunk: [AArch64][GlobalISel] Teach AArch64CallLowering to handle basic sibling calls
This adds support for basic sibling call lowering in AArch64. The intent here is to onl
Revert rL370996 from llvm/trunk: [AArch64][GlobalISel] Teach AArch64CallLowering to handle basic sibling calls
This adds support for basic sibling call lowering in AArch64. The intent here is to only handle tail calls which do not change the ABI (hence, sibling calls.)
At this point, it is very restricted. It does not handle
- Vararg calls. - Calls with outgoing arguments. - Calls whose calling conventions differ from the caller's calling convention. - Tail/sibling calls with BTI enabled.
This patch adds
- `AArch64CallLowering::isEligibleForTailCallOptimization`, which is equivalent to the same function in AArch64ISelLowering.cpp (albeit with the restrictions above.) - `mayTailCallThisCC` and `canGuaranteeTCO`, which are identical to those in AArch64ISelLowering.cpp. - `getCallOpcode`, which is exactly what it sounds like.
Tail/sibling calls are lowered by checking if they pass target-independent tail call positioning checks, and checking if they satisfy `isEligibleForTailCallOptimization`. If they do, then a tail call instruction is emitted instead of a normal call. If we have a sibling call (which is always the case in this patch), then we do not emit any stack adjustment operations. When we go to lower a return, we check if we've already emitted a tail call. If so, then we skip the return lowering.
For testing, this patch
- Adds call-translator-tail-call.ll to test which tail calls we currently lower, which ones we don't, and which ones we shouldn't. - Updates branch-target-enforcement-indirect-calls.ll to show that we fall back as expected.
Differential Revision: https://reviews.llvm.org/D67189 ........ This fails on EXPENSIVE_CHECKS builds due to a -verify-machineinstrs test failure in CodeGen/AArch64/dllimport.ll
llvm-svn: 371051
show more ...
|
#
b78324fc |
| 04-Sep-2019 |
Jessica Paquette <jpaquette@apple.com> |
[AArch64][GlobalISel] Teach AArch64CallLowering to handle basic sibling calls
This adds support for basic sibling call lowering in AArch64. The intent here is to only handle tail calls which do not
[AArch64][GlobalISel] Teach AArch64CallLowering to handle basic sibling calls
This adds support for basic sibling call lowering in AArch64. The intent here is to only handle tail calls which do not change the ABI (hence, sibling calls.)
At this point, it is very restricted. It does not handle
- Vararg calls. - Calls with outgoing arguments. - Calls whose calling conventions differ from the caller's calling convention. - Tail/sibling calls with BTI enabled.
This patch adds
- `AArch64CallLowering::isEligibleForTailCallOptimization`, which is equivalent to the same function in AArch64ISelLowering.cpp (albeit with the restrictions above.) - `mayTailCallThisCC` and `canGuaranteeTCO`, which are identical to those in AArch64ISelLowering.cpp. - `getCallOpcode`, which is exactly what it sounds like.
Tail/sibling calls are lowered by checking if they pass target-independent tail call positioning checks, and checking if they satisfy `isEligibleForTailCallOptimization`. If they do, then a tail call instruction is emitted instead of a normal call. If we have a sibling call (which is always the case in this patch), then we do not emit any stack adjustment operations. When we go to lower a return, we check if we've already emitted a tail call. If so, then we skip the return lowering.
For testing, this patch
- Adds call-translator-tail-call.ll to test which tail calls we currently lower, which ones we don't, and which ones we shouldn't. - Updates branch-target-enforcement-indirect-calls.ll to show that we fall back as expected.
Differential Revision: https://reviews.llvm.org/D67189
llvm-svn: 370996
show more ...
|
#
fbaf425b |
| 03-Sep-2019 |
Amara Emerson <aemerson@apple.com> |
[GlobalISel][CallLowering] Add support for splitting types according to calling conventions.
On AArch64, s128 types have to be split into s64 GPRs when passed as arguments. This change adds the gene
[GlobalISel][CallLowering] Add support for splitting types according to calling conventions.
On AArch64, s128 types have to be split into s64 GPRs when passed as arguments. This change adds the generic support in call lowering for dealing with multiple registers, for incoming and outgoing args.
Support for splitting for return types not yet implemented.
Differential Revision: https://reviews.llvm.org/D66180
llvm-svn: 370822
show more ...
|
Revision tags: llvmorg-9.0.0-rc3 |
|
#
af0bd41e |
| 28-Aug-2019 |
Jessica Paquette <jpaquette@apple.com> |
[AArch64][GlobalISel] Fall back when translating musttail calls
These are currently translated as normal functions calls in AArch64.
Until we have proper tail call lowering, we shouldn't translate
[AArch64][GlobalISel] Fall back when translating musttail calls
These are currently translated as normal functions calls in AArch64.
Until we have proper tail call lowering, we shouldn't translate these.
Differential Revision: https://reviews.llvm.org/D66842
llvm-svn: 370225
show more ...
|
Revision tags: llvmorg-9.0.0-rc2 |
|
#
e1a5f668 |
| 09-Aug-2019 |
Tim Northover <tnorthover@apple.com> |
GlobalISel: pack various parameters for lowerCall into a struct.
I've now needed to add an extra parameter to this call twice recently. Not only is the signature getting extremely unwieldy, but just
GlobalISel: pack various parameters for lowerCall into a struct.
I've now needed to add an extra parameter to this call twice recently. Not only is the signature getting extremely unwieldy, but just updating all of the callsites and implementations is a pain. Putting the parameters in a struct sidesteps both issues.
llvm-svn: 368408
show more ...
|
#
bc1172df |
| 05-Aug-2019 |
Amara Emerson <aemerson@apple.com> |
[GlobalISel][CallLowering] Rename isArgumentHandler() -> isIncomingArgumentHandler()
Previous name and comment incorrectly implied it was just for formal arg handlers, which is not true.
llvm-svn:
[GlobalISel][CallLowering] Rename isArgumentHandler() -> isIncomingArgumentHandler()
Previous name and comment incorrectly implied it was just for formal arg handlers, which is not true.
llvm-svn: 367945
show more ...
|
#
522fb7ee |
| 02-Aug-2019 |
Tim Northover <tnorthover@apple.com> |
GlobalISel: support swiftself attribute
llvm-svn: 367683
|
#
7b8d3eb9 |
| 31-Jul-2019 |
Mark Lacey <mark.lacey@apple.com> |
[GISel] Pass MD_callees metadata down in call lowering.
Summary: This will make it possible to improve IPRA by taking into account register usage in indirect calls.
NFC yet; this is just laying the
[GISel] Pass MD_callees metadata down in call lowering.
Summary: This will make it possible to improve IPRA by taking into account register usage in indirect calls.
NFC yet; this is just laying the groundwork to start building up patches to take advantage of the information for improved register allocation.
Reviewers: aditya_nandakumar, volkan, qcolombet, arsenm, rovka, aemerson, paquette
Subscribers: sdardis, wdng, javed.absar, hiraditya, jrtc27, atanasyan, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D65488
llvm-svn: 367476
show more ...
|
Revision tags: llvmorg-9.0.0-rc1, llvmorg-10-init |
|
#
1c3f4ec7 |
| 16-Jul-2019 |
Matt Arsenault <Matthew.Arsenault@amd.com> |
GlobalISel: Add overload of handleAssignments with CCState
AMDGPU needs to allocate special argument registers separately from the user function argument list, so needs direct control over the CCSta
GlobalISel: Add overload of handleAssignments with CCState
AMDGPU needs to allocate special argument registers separately from the user function argument list, so needs direct control over the CCState.
The ArgLocs argument is only really necessary because CCState doesn't allow access to it.
llvm-svn: 366279
show more ...
|
#
7e71902b |
| 11-Jul-2019 |
Matt Arsenault <Matthew.Arsenault@amd.com> |
GlobalISel: Use Register
llvm-svn: 365780
|
Revision tags: llvmorg-8.0.1, llvmorg-8.0.1-rc4 |
|
#
43fb5ae5 |
| 27-Jun-2019 |
Diana Picus <diana.picus@linaro.org> |
[GlobalISel] Accept multiple vregs for lowerCall's args
Change the interface of CallLowering::lowerCall to accept several virtual registers for each argument, instead of just one. This is a follow-
[GlobalISel] Accept multiple vregs for lowerCall's args
Change the interface of CallLowering::lowerCall to accept several virtual registers for each argument, instead of just one. This is a follow-up to D46018.
CallLowering::lowerReturn was similarly refactored in D49660 and lowerFormalArguments in D63549.
With this change, we no longer pack the virtual registers generated for aggregates into one big lump before delegating to the target. Therefore, the target can decide itself whether it wants to handle them as separate pieces or use one big register.
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.
NFCI for AMDGPU, Mips and X86.
Differential Revision: https://reviews.llvm.org/D63551
llvm-svn: 364512
show more ...
|
#
81389961 |
| 27-Jun-2019 |
Diana Picus <diana.picus@linaro.org> |
[GlobalISel] Accept multiple vregs for lowerCall's result
Change the interface of CallLowering::lowerCall to accept several virtual registers for the call result, instead of just one. This is a fol
[GlobalISel] Accept multiple vregs for lowerCall's result
Change the interface of CallLowering::lowerCall to accept several virtual registers for the call result, instead of just one. This is a follow-up to D46018.
CallLowering::lowerReturn was similarly refactored in D49660 and lowerFormalArguments in D63549.
With this change, we no longer pack the virtual registers generated for aggregates into one big lump before delegating to the target. Therefore, the target can decide itself whether it wants to handle them as separate pieces or use one big register.
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.
NFCI for AMDGPU, Mips and X86.
Differential Revision: https://reviews.llvm.org/D63550
llvm-svn: 364511
show more ...
|
#
c3dbe239 |
| 27-Jun-2019 |
Diana Picus <diana.picus@linaro.org> |
[GlobalISel] Accept multiple vregs in lowerFormalArgs
Change the interface of CallLowering::lowerFormalArguments to accept several virtual registers for each formal argument, instead of just one. Th
[GlobalISel] Accept multiple vregs in lowerFormalArgs
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.
Differential Revision: https://reviews.llvm.org/D63549
llvm-svn: 364510
show more ...
|
#
69ce1c13 |
| 27-Jun-2019 |
Diana Picus <diana.picus@linaro.org> |
[GlobalISel] Allow multiple VRegs in ArgInfo. NFC
Allow CallLowering::ArgInfo to contain more than one virtual register. This is useful when passes split aggregates into several virtual registers, b
[GlobalISel] Allow multiple VRegs in ArgInfo. NFC
Allow CallLowering::ArgInfo to contain more than one virtual register. This is useful when passes split aggregates into several virtual registers, but need to also provide information about the original type to the call lowering. Used in follow-up patches.
Differential Revision: https://reviews.llvm.org/D63548
llvm-svn: 364509
show more ...
|
Revision tags: llvmorg-8.0.1-rc3 |
|
#
faeaedf8 |
| 24-Jun-2019 |
Matt Arsenault <Matthew.Arsenault@amd.com> |
GlobalISel: Remove unsigned variant of SrcOp
Force using Register.
One downside is the generated register enums require explicit conversion.
llvm-svn: 364194
|
#
e3a676e9 |
| 24-Jun-2019 |
Matt Arsenault <Matthew.Arsenault@amd.com> |
CodeGen: Introduce a class for registers
Avoids using a plain unsigned for registers throughoug codegen. Doesn't attempt to change every register use, just something a little more than the set neede
CodeGen: Introduce a class for registers
Avoids using a plain unsigned for registers throughoug codegen. Doesn't attempt to change every register use, just something a little more than the set needed to build after changing the return type of MachineOperand::getReg().
llvm-svn: 364191
show more ...
|
Revision tags: llvmorg-8.0.1-rc2 |
|
#
b7141207 |
| 30-May-2019 |
Tim Northover <tnorthover@apple.com> |
Reapply: IR: add optional type to 'byval' function parameters
When we switch to opaque pointer types we will need some way to describe how many bytes a 'byval' parameter should occupy on the stack.
Reapply: IR: add optional type to 'byval' function parameters
When we switch to opaque pointer types we will need some way to describe how many bytes a 'byval' parameter should occupy on the stack. This adds a (for now) optional extra type parameter.
If present, the type must match the pointee type of the argument.
The original commit did not remap byval types when linking modules, which broke LTO. This version fixes that.
Note to front-end maintainers: if this causes test failures, it's probably because the "byval" attribute is printed after attributes without any parameter after this change.
llvm-svn: 362128
show more ...
|
#
71ee3d02 |
| 29-May-2019 |
Tim Northover <tnorthover@apple.com> |
Revert "IR: add optional type to 'byval' function parameters"
The IRLinker doesn't delve into the new byval attribute when mapping types, and this breaks LTO.
llvm-svn: 362029
|
#
6e07f16f |
| 29-May-2019 |
Tim Northover <tnorthover@apple.com> |
IR: add optional type to 'byval' function parameters
When we switch to opaque pointer types we will need some way to describe how many bytes a 'byval' parameter should occupy on the stack. This adds
IR: add optional type to 'byval' function parameters
When we switch to opaque pointer types we will need some way to describe how many bytes a 'byval' parameter should occupy on the stack. This adds a (for now) optional extra type parameter.
If present, the type must match the pointee type of the argument.
Note to front-end maintainers: if this causes test failures, it's probably because the "byval" attribute is printed after attributes without any parameter after this change.
llvm-svn: 362012
show more ...
|
#
3b2157ae |
| 24-May-2019 |
Tim Northover <tnorthover@apple.com> |
GlobalISel: support swifterror attribute on AArch64.
swifterror marks an argument as a register pretending to be a pointer, so we need a guaranteed mem2reg-like analysis of its uses. Fortunately mos
GlobalISel: support swifterror attribute on AArch64.
swifterror marks an argument as a register pretending to be a pointer, so we need a guaranteed mem2reg-like analysis of its uses. Fortunately most of the infrastructure can be reused from the DAG world.
llvm-svn: 361608
show more ...
|
Revision tags: llvmorg-8.0.1-rc1 |
|
#
bdb5e4e4 |
| 12-Apr-2019 |
Amara Emerson <aemerson@apple.com> |
[GlobalISel] Fix a crash when handling an invalid MVT during call lowering.
This crash was introduced in r358032 as we try to construct an EVT from an MVT in order to find the register type for the
[GlobalISel] Fix a crash when handling an invalid MVT during call lowering.
This crash was introduced in r358032 as we try to construct an EVT from an MVT in order to find the register type for the calling conv. Fall back instead of trying to do this with an invalid MVT coming from i256.
llvm-svn: 358314
show more ...
|
#
2b523f81 |
| 09-Apr-2019 |
Amara Emerson <aemerson@apple.com> |
[GlobalISel][AArch64] Allow CallLowering to handle types which are normally required to be passed as different register types. E.g. <2 x i16> may need to be passed as a larger <2 x i32> type, so form
[GlobalISel][AArch64] Allow CallLowering to handle types which are normally required to be passed as different register types. E.g. <2 x i16> may need to be passed as a larger <2 x i32> type, so formal arg lowering needs to be able truncate it back. Likewise, when dealing with returns of these types, they need to be widened in the appropriate way back.
Differential Revision: https://reviews.llvm.org/D60425
llvm-svn: 358032
show more ...
|
Revision tags: llvmorg-8.0.0, llvmorg-8.0.0-rc5, llvmorg-8.0.0-rc4, llvmorg-8.0.0-rc3, llvmorg-7.1.0, llvmorg-7.1.0-rc1, llvmorg-8.0.0-rc2, llvmorg-8.0.0-rc1 |
|
#
2946cd70 |
| 19-Jan-2019 |
Chandler Carruth <chandlerc@gmail.com> |
Update the file headers across all of the LLVM projects in the monorepo to reflect the new license.
We understand that people may be surprised that we're moving the header entirely to discuss the ne
Update the file headers across all of the LLVM projects in the monorepo to reflect the new license.
We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach.
Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository.
llvm-svn: 351636
show more ...
|
#
a87b70d1 |
| 29-Dec-2018 |
Richard Trieu <rtrieu@google.com> |
Add vtable anchor to classes.
llvm-svn: 350142
|
Revision tags: llvmorg-7.0.1, llvmorg-7.0.1-rc3, llvmorg-7.0.1-rc2, llvmorg-7.0.1-rc1 |
|
#
1cbb0571 |
| 28-Sep-2018 |
Aditya Nandakumar <aditya_nandakumar@apple.com> |
[GISel]: Remove an incorrect assert in CallLowering
https://reviews.llvm.org/D51147
Asserting if any extend of vectors should be up to the target's legalizer/target specific code not in CallLowerin
[GISel]: Remove an incorrect assert in CallLowering
https://reviews.llvm.org/D51147
Asserting if any extend of vectors should be up to the target's legalizer/target specific code not in CallLowering.
reviewed by : dsanders.
llvm-svn: 343325
show more ...
|