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

Juergen Ributzka juergen at apple.com
Fri Aug 1 11:14:44 PDT 2014


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