[llvm] r214366 - [FastISel][AArch64 and X86] Don't emit stores for UNDEF arguments during function call lowering.

Eric Christopher echristo at gmail.com
Thu Jul 31 16:05:19 PDT 2014


Probably need this for the ARM and PPC fast selectors as well if
they're not there?

-eric

On Wed, Jul 30, 2014 at 5:11 PM, Juergen Ributzka <juergen at apple.com> wrote:
> Author: ributzka
> Date: Wed Jul 30 19:11:11 2014
> New Revision: 214366
>
> URL: http://llvm.org/viewvc/llvm-project?rev=214366&view=rev
> Log:
> [FastISel][AArch64 and X86] Don't emit stores for UNDEF arguments during function call lowering.
>
> UNDEF arguments are not ment to be touched - especially for the webkit_js
> calling convention. This fix reproduces the already existing behavior of
> SelectionDAG in FastISel.
>
> Added:
>     llvm/trunk/test/CodeGen/X86/patchpoint-webkit_jscc.ll
> Modified:
>     llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp
>     llvm/trunk/lib/Target/X86/X86FastISel.cpp
>     llvm/trunk/test/CodeGen/X86/patchpoint.ll
>
> Modified: llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp?rev=214366&r1=214365&r2=214366&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp Wed Jul 30 19:11:11 2014
> @@ -1280,6 +1280,10 @@ bool AArch64FastISel::ProcessCallArgs(Ca
>      } else {
>        assert(VA.isMemLoc() && "Assuming store on stack.");
>
> +      // Don't emit stores for undef values.
> +      if (isa<UndefValue>(ArgVal))
> +        continue;
> +
>        // Need to store on the stack.
>        unsigned ArgSize = (ArgVT.getSizeInBits() + 7) / 8;
>
>
> Modified: llvm/trunk/lib/Target/X86/X86FastISel.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FastISel.cpp?rev=214366&r1=214365&r2=214366&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86FastISel.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86FastISel.cpp Wed Jul 30 19:11:11 2014
> @@ -2831,6 +2831,11 @@ bool X86FastISel::FastLowerCall(CallLowe
>        OutRegs.push_back(VA.getLocReg());
>      } else {
>        assert(VA.isMemLoc());
> +
> +      // Don't emit stores for undef values.
> +      if (isa<UndefValue>(ArgVal))
> +        continue;
> +
>        unsigned LocMemOffset = VA.getLocMemOffset();
>        X86AddressMode AM;
>        AM.Base.Reg = RegInfo->getStackRegister();
>
> Added: llvm/trunk/test/CodeGen/X86/patchpoint-webkit_jscc.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/patchpoint-webkit_jscc.ll?rev=214366&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/patchpoint-webkit_jscc.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/patchpoint-webkit_jscc.ll Wed Jul 30 19:11:11 2014
> @@ -0,0 +1,88 @@
> +; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=corei7 -disable-fp-elim                             < %s | FileCheck %s
> +; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=corei7 -disable-fp-elim -fast-isel -fast-isel-abort < %s | FileCheck %s --check-prefix=FAST
> +
> +; Test the webkit_jscc calling convention.
> +; One argument will be passed in register, the other will be pushed on the stack.
> +; Return value in $rax.
> +define void @jscall_patchpoint_codegen(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
> +entry:
> +; CHECK-LABEL: jscall_patchpoint_codegen:
> +; CHECK:      Ltmp
> +; CHECK:      movq %r{{.+}}, (%rsp)
> +; CHECK:      movq %r{{.+}}, %rax
> +; CHECK:      Ltmp
> +; CHECK-NEXT: movabsq $-559038736, %r11
> +; CHECK-NEXT: callq *%r11
> +; CHECK:      movq %rax, (%rsp)
> +; CHECK:      callq
> +; FAST-LABEL: jscall_patchpoint_codegen:
> +; FAST:       Ltmp
> +; FAST:       movq %r{{.+}}, (%rsp)
> +; FAST:       movq %r{{.+}}, %rax
> +; FAST:       Ltmp
> +; FAST-NEXT:  movabsq $-559038736, %r11
> +; FAST-NEXT:  callq *%r11
> +; FAST:       movq %rax, (%rsp)
> +; FAST:       callq
> +  %resolveCall2 = inttoptr i64 -559038736 to i8*
> +  %result = tail call webkit_jscc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 5, i32 15, i8* %resolveCall2, i32 2, i64 %p4, i64 %p2)
> +  %resolveCall3 = inttoptr i64 -559038737 to i8*
> +  tail call webkit_jscc void (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.void(i64 6, i32 15, i8* %resolveCall3, i32 2, i64 %p4, i64 %result)
> +  ret void
> +}
> +
> +; Test if the arguments are properly aligned and that we don't store undef arguments.
> +define i64 @jscall_patchpoint_codegen2(i64 %callee) {
> +entry:
> +; CHECK-LABEL: jscall_patchpoint_codegen2:
> +; CHECK:      Ltmp
> +; CHECK:      movq $6, 24(%rsp)
> +; CHECK-NEXT: movl $4, 16(%rsp)
> +; CHECK-NEXT: movq $2, (%rsp)
> +; CHECK:      Ltmp
> +; CHECK-NEXT: movabsq $-559038736, %r11
> +; CHECK-NEXT: callq *%r11
> +; FAST-LABEL: jscall_patchpoint_codegen2:
> +; FAST:       Ltmp
> +; FAST:       movq $2, (%rsp)
> +; FAST-NEXT:  movl $4, 16(%rsp)
> +; FAST-NEXT:  movq $6, 24(%rsp)
> +; FAST:       Ltmp
> +; FAST-NEXT:  movabsq $-559038736, %r11
> +; FAST-NEXT:  callq *%r11
> +  %call = inttoptr i64 -559038736 to i8*
> +  %result = call webkit_jscc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 7, i32 15, i8* %call, i32 6, i64 %callee, i64 2, i64 undef, i32 4, i32 undef, i64 6)
> +  ret i64 %result
> +}
> +
> +; Test if the arguments are properly aligned and that we don't store undef arguments.
> +define i64 @jscall_patchpoint_codegen3(i64 %callee) {
> +entry:
> +; CHECK-LABEL: jscall_patchpoint_codegen3:
> +; CHECK:      Ltmp
> +; CHECK:      movq $10, 48(%rsp)
> +; CHECK-NEXT: movl  $8, 36(%rsp)
> +; CHECK-NEXT: movq  $6, 24(%rsp)
> +; CHECK-NEXT: movl  $4, 16(%rsp)
> +; CHECK-NEXT: movq  $2, (%rsp)
> +; CHECK:      Ltmp
> +; CHECK-NEXT: movabsq $-559038736, %r11
> +; CHECK-NEXT: callq *%r11
> +; FAST-LABEL: jscall_patchpoint_codegen3:
> +; FAST:       Ltmp
> +; FAST:       movq  $2, (%rsp)
> +; FAST-NEXT:  movl  $4, 16(%rsp)
> +; FAST-NEXT:  movq  $6, 24(%rsp)
> +; FAST-NEXT:  movl  $8, 36(%rsp)
> +; FAST-NEXT:  movq $10, 48(%rsp)
> +; FAST:       Ltmp
> +; FAST-NEXT:  movabsq $-559038736, %r11
> +; FAST-NEXT:  callq *%r11
> +  %call = inttoptr i64 -559038736 to i8*
> +  %result = call webkit_jscc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 7, i32 15, i8* %call, i32 10, i64 %callee, i64 2, i64 undef, i32 4, i32 undef, i64 6, i32 undef, i32 8, i32 undef, i64 10)
> +  ret i64 %result
> +}
> +
> +declare void @llvm.experimental.patchpoint.void(i64, i32, i8*, i32, ...)
> +declare i64 @llvm.experimental.patchpoint.i64(i64, i32, i8*, i32, ...)
> +
>
> Modified: llvm/trunk/test/CodeGen/X86/patchpoint.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/patchpoint.ll?rev=214366&r1=214365&r2=214366&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/patchpoint.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/patchpoint.ll Wed Jul 30 19:11:11 2014
> @@ -1,4 +1,5 @@
> -; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7 -disable-fp-elim | FileCheck %s
> +; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=corei7 -disable-fp-elim                             < %s | FileCheck %s
> +; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=corei7 -disable-fp-elim -fast-isel -fast-isel-abort < %s | FileCheck %s
>
>  ; Trivial patchpoint codegen
>  ;
> @@ -38,60 +39,6 @@ entry:
>    ret void
>  }
>
> -; Test the webkit_jscc calling convention.
> -; One argument will be passed in register, the other will be pushed on the stack.
> -; Return value in $rax.
> -define void @jscall_patchpoint_codegen(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
> -entry:
> -; CHECK-LABEL: jscall_patchpoint_codegen:
> -; CHECK:      Ltmp
> -; CHECK:      movq %r{{.+}}, (%rsp)
> -; CHECK:      movq %r{{.+}}, %rax
> -; CHECK:      Ltmp
> -; CHECK-NEXT: movabsq $-559038736, %r11
> -; CHECK-NEXT: callq *%r11
> -; CHECK:      movq %rax, (%rsp)
> -; CHECK:      callq
> -  %resolveCall2 = inttoptr i64 -559038736 to i8*
> -  %result = tail call webkit_jscc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 5, i32 15, i8* %resolveCall2, i32 2, i64 %p4, i64 %p2)
> -  %resolveCall3 = inttoptr i64 -559038737 to i8*
> -  tail call webkit_jscc void (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.void(i64 6, i32 15, i8* %resolveCall3, i32 2, i64 %p4, i64 %result)
> -  ret void
> -}
> -
> -; Test if the arguments are properly aligned and that we don't store undef arguments.
> -define i64 @jscall_patchpoint_codegen2(i64 %callee) {
> -entry:
> -; CHECK-LABEL: jscall_patchpoint_codegen2:
> -; CHECK:      Ltmp
> -; CHECK:      movq $6, 24(%rsp)
> -; CHECK-NEXT: movl $4, 16(%rsp)
> -; CHECK-NEXT: movq $2, (%rsp)
> -; CHECK:      Ltmp
> -; CHECK-NEXT: movabsq $-559038736, %r11
> -; CHECK-NEXT: callq *%r11
> -  %call = inttoptr i64 -559038736 to i8*
> -  %result = call webkit_jscc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 7, i32 15, i8* %call, i32 6, i64 %callee, i64 2, i64 undef, i32 4, i32 undef, i64 6)
> -  ret i64 %result
> -}
> -
> -; Test if the arguments are properly aligned and that we don't store undef arguments.
> -define i64 @jscall_patchpoint_codegen3(i64 %callee) {
> -entry:
> -; CHECK-LABEL: jscall_patchpoint_codegen3:
> -; CHECK:      Ltmp
> -; CHECK:      movq $10, 48(%rsp)
> -; CHECK-NEXT: movl  $8, 36(%rsp)
> -; CHECK-NEXT: movq  $6, 24(%rsp)
> -; CHECK-NEXT: movl  $4, 16(%rsp)
> -; CHECK-NEXT: movq  $2, (%rsp)
> -; CHECK:      Ltmp
> -; CHECK-NEXT: movabsq $-559038736, %r11
> -; CHECK-NEXT: callq *%r11
> -  %call = inttoptr i64 -559038736 to i8*
> -  %result = call webkit_jscc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 7, i32 15, i8* %call, i32 10, i64 %callee, i64 2, i64 undef, i32 4, i32 undef, i64 6, i32 undef, i32 8, i32 undef, i64 10)
> -  ret i64 %result
> -}
>
>  ; Test patchpoints reusing the same TargetConstant.
>  ; <rdar:15390785> Assertion failed: (CI.getNumArgOperands() >= NumArgs + 4)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list