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

Eric Christopher echristo at gmail.com
Fri Aug 1 11:18:49 PDT 2014


Cool deal, thanks.

-eric

On Fri, Aug 1, 2014 at 11:14 AM, Juergen Ributzka <juergen at apple.com> wrote:
> I also added it for ARM in 214531. MIPS doesn’t have FastISel support for calls yet and I didn’t see any stores in the PPC backend.
>
> -Juergen
>
> On Jul 31, 2014, at 4:05 PM, Eric Christopher <echristo at gmail.com> wrote:
>
>> 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