[llvm] r294527 - [ARM/AArch ISel] SwiftCC: First parameters that are marked swiftself are not 'this returns'
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 9 08:57:00 PST 2017
Sounds good to me if Tim agrees.
Cheers,
Hans
On Wed, Feb 8, 2017 at 6:17 PM, Arnold Schwaighofer via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Hi Hans, Tim
>
> Can we merged this into the 4.0 branch?
>
> This only effects lowering if there is a swiftself attribute — i.e almost zero risk for code that does not use the swift calling convention.
>
>
>> On Feb 8, 2017, at 2:30 PM, Arnold Schwaighofer via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>>
>> Author: arnolds
>> Date: Wed Feb 8 16:30:47 2017
>> New Revision: 294527
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=294527&view=rev
>> Log:
>> [ARM/AArch ISel] SwiftCC: First parameters that are marked swiftself are not 'this returns'
>>
>> We mark X0 as preserved by a call that passes the returned parameter.
>>
>> x0 = ...
>> fun(x0) // no implicit def of x0
>>
>> This no longer is valid if we pass the parameter in a different register then
>> the returned value as is the case with a swiftself parameter (passed in x20).
>>
>> x20 = ...
>> fun(x20) // there should be an implict def of x8
>>
>> rdar://30425845
>>
>> Modified:
>> llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp
>> llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
>> llvm/trunk/test/CodeGen/AArch64/swiftself.ll
>> llvm/trunk/test/CodeGen/ARM/swiftself.ll
>>
>> Modified: llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp?rev=294527&r1=294526&r2=294527&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp (original)
>> +++ llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp Wed Feb 8 16:30:47 2017
>> @@ -3156,7 +3156,8 @@ AArch64TargetLowering::LowerCall(CallLow
>> }
>>
>> if (VA.isRegLoc()) {
>> - if (realArgIdx == 0 && Flags.isReturned() && Outs[0].VT == MVT::i64) {
>> + if (realArgIdx == 0 && Flags.isReturned() && !Flags.isSwiftSelf() &&
>> + Outs[0].VT == MVT::i64) {
>> assert(VA.getLocVT() == MVT::i64 &&
>> "unexpected calling convention register assignment");
>> assert(!Ins.empty() && Ins[0].VT == MVT::i64 &&
>>
>> Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=294527&r1=294526&r2=294527&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Wed Feb 8 16:30:47 2017
>> @@ -1826,7 +1826,8 @@ ARMTargetLowering::LowerCall(TargetLower
>> StackPtr, MemOpChains, Flags);
>> }
>> } else if (VA.isRegLoc()) {
>> - if (realArgIdx == 0 && Flags.isReturned() && Outs[0].VT == MVT::i32) {
>> + if (realArgIdx == 0 && Flags.isReturned() && !Flags.isSwiftSelf() &&
>> + Outs[0].VT == MVT::i32) {
>> assert(VA.getLocVT() == MVT::i32 &&
>> "unexpected calling convention register assignment");
>> assert(!Ins.empty() && Ins[0].VT == MVT::i32 &&
>>
>> Modified: llvm/trunk/test/CodeGen/AArch64/swiftself.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/swiftself.ll?rev=294527&r1=294526&r2=294527&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/CodeGen/AArch64/swiftself.ll (original)
>> +++ llvm/trunk/test/CodeGen/AArch64/swiftself.ll Wed Feb 8 16:30:47 2017
>> @@ -65,3 +65,21 @@ define i8* @swiftself_notail(i8* swiftse
>> %res = tail call i8* @swiftself_param(i8* swiftself %addr1)
>> ret i8* %res
>> }
>> +
>> +; We cannot pretend that 'x0' is alive across the thisreturn_attribute call as
>> +; we normally would. We marked the first parameter with swiftself which means it
>> +; will no longer be passed in x0.
>> +declare swiftcc i8* @thisreturn_attribute(i8* returned swiftself)
>> +; OPT-LABEL: swiftself_nothisreturn:
>> +; OPT-DAG: ldr x20, [x20]
>> +; OPT-DAG: mov [[CSREG:x[1-9].*]], x8
>> +; OPT: bl {{_?}}thisreturn_attribute
>> +; OPT: str x0, {{\[}}[[CSREG]]
>> +; OPT: ret
>> +define hidden swiftcc void @swiftself_nothisreturn(i8** noalias nocapture sret, i8** noalias nocapture readonly swiftself) {
>> +entry:
>> + %2 = load i8*, i8** %1, align 8
>> + %3 = tail call swiftcc i8* @thisreturn_attribute(i8* swiftself %2)
>> + store i8* %3, i8** %0, align 8
>> + ret void
>> +}
>>
>> Modified: llvm/trunk/test/CodeGen/ARM/swiftself.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/swiftself.ll?rev=294527&r1=294526&r2=294527&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/CodeGen/ARM/swiftself.ll (original)
>> +++ llvm/trunk/test/CodeGen/ARM/swiftself.ll Wed Feb 8 16:30:47 2017
>> @@ -63,3 +63,20 @@ define i8* @swiftself_notail(i8* swiftse
>> %res = tail call i8* @swiftself_param(i8* swiftself %addr1)
>> ret i8* %res
>> }
>> +
>> +; We cannot pretend that 'r0' is alive across the thisreturn_attribute call as
>> +; we normally would. We marked the first parameter with swiftself which means it
>> +; will no longer be passed in r0.
>> +declare swiftcc i8* @thisreturn_attribute(i8* returned swiftself)
>> +; OPT-LABEL: swiftself_nothisreturn:
>> +; OPT-DAG: mov [[CSREG:r[1-9].*]], r0
>> +; OPT-DAG: ldr r10, [r10]
>> +; OPT: bl {{_?}}thisreturn_attribute
>> +; OPT: str r0, {{\[}}[[CSREG]]
>> +define hidden swiftcc void @swiftself_nothisreturn(i8** noalias nocapture sret, i8** noalias nocapture readonly swiftself) {
>> +entry:
>> + %2 = load i8*, i8** %1, align 8
>> + %3 = tail call swiftcc i8* @thisreturn_attribute(i8* swiftself %2)
>> + store i8* %3, i8** %0, align 8
>> + ret void
>> +}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list