[llvm] r294527 - [ARM/AArch ISel] SwiftCC: First parameters that are marked swiftself are not 'this returns'
Arnold Schwaighofer via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 8 18:17:59 PST 2017
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
More information about the llvm-commits
mailing list