[llvm-commits] [llvm] r55881 - /llvm/trunk/lib/Target/X86/X86ISelLowering.cpp

Evan Cheng evan.cheng at apple.com
Thu Sep 11 08:43:34 PDT 2008


On Sep 11, 2008, at 2:02 AM, Arnold Schwaighofer wrote:

>
> But in  X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) it
> only adjusts the stack when really tail calling:
>>  // If the function takes variable number of arguments, make a  
>> frame index for
>> @@ -1485,7 +1483,7 @@
>>
>>  // Get a count of how many bytes are to be pushed on the stack.
>>  unsigned NumBytes = CCInfo.getNextStackOffset();
>> -  if (CC == CallingConv::Fast)
>> +  if (IsTailCall)
>>    NumBytes = GetAlignedArgumentStackSize(NumBytes, DAG);
>
> It should read
> if (PerformTailCallOpt && CC == CallingConv::Fast)
>    StackSize = GetAlignedArgumentStackSize(StackSize, DAG);
>
> Request for permission to change ;-)
>
> regards arnold

Sorry about the breakage. Please fix it as you see fit. Can you add a  
test case so dummies like me don't break it again?

Thanks,

Evan

>
>
> an example that goes wrong:
> ; RUN: llvm-as < %s | llc  -mtriple=i686-unknown-linux  - 
> tailcallopt  > %t1
> ; linux has 8byte alignment so the params cause stack size 20 when  
> tailcallopt
> ; is enabled
> define fastcc i32 @tailcallee(i32 %a1, i32 %a2, i32 %a3, i32 %a4) {
> entry:
> 	ret i32 %a3
> }
>
> define fastcc i32 @tailcaller(i32 %in1, i32 %in2, i32 %in3, i32  
> %in4) {
> entry:
> 	%tmp11 = tail call fastcc i32 @tailcallee( i32 %in1, i32 %in2, i32
> %in1, i32 %in2 )		; <i32> [#uses=1]
> 	ret i32 %tmp11
> }
>
> define i32 @main(i32 %argc, i8** %argv) {
>  %tmp1 = call fastcc i32 @tailcaller( i32 1, i32 2, i32 3, i32 4 )
>  ret i32 %tmp1
> }
>
> generated assembler:
> tailcallee:
> 	movl	12(%esp), %eax
> 	ret	$20
>
> tailcaller:
> 	subl	$20, %esp
> 	...
> 	addl	$20, %esp
> 	jmp	tailcallee  # TAILCALL
>
>
> main:
> 	subl	$20, %esp
> 	...
> 	call	tailcaller
> 	addl	$4, %esp <<<<<  callsite thinks tailcaller pops 16 instead of  
> 20bytes!
> 	ret
>
> On Sun, Sep 7, 2008 at 11:07 AM, Evan Cheng <evan.cheng at apple.com>  
> wrote:
>> Author: evancheng
>> Date: Sun Sep  7 04:07:23 2008
>> New Revision: 55881
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=55881&view=rev
>> Log:
>> Some code clean up.
>>
>> Modified:
>>   llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>>
>> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=55881&r1=55880&r2=55881&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
>> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Sun Sep  7  
>> 04:07:23 2008
>> @@ -1088,12 +1088,10 @@
>>  if (Subtarget->is64Bit()) {
>>    if (Subtarget->isTargetWin64())
>>      return CC_X86_Win64_C;
>> -    else {
>> -      if (CC == CallingConv::Fast && PerformTailCallOpt)
>> -        return CC_X86_64_TailCall;
>> -      else
>> -        return CC_X86_64_C;
>> -    }
>> +    else if (CC == CallingConv::Fast && PerformTailCallOpt)
>> +      return CC_X86_64_TailCall;
>> +    else
>> +      return CC_X86_64_C;
>>  }
>>
>>  if (CC == CallingConv::X86_FastCall)
>> @@ -1294,7 +1292,7 @@
>>
>>  unsigned StackSize = CCInfo.getNextStackOffset();
>>  // align stack specially for tail calls
>> -  if (CC == CallingConv::Fast)
>> +  if (PerformTailCallOpt && CC == CallingConv::Fast)
>>    StackSize = GetAlignedArgumentStackSize(StackSize, DAG);
>>
>>  // If the function takes variable number of arguments, make a  
>> frame index for
>> @@ -1485,7 +1483,7 @@
>>
>>  // Get a count of how many bytes are to be pushed on the stack.
>>  unsigned NumBytes = CCInfo.getNextStackOffset();
>> -  if (CC == CallingConv::Fast)
>> +  if (IsTailCall)
>>    NumBytes = GetAlignedArgumentStackSize(NumBytes, DAG);
>>
>>  int FPDiff = 0;
>> @@ -1829,25 +1827,22 @@
>> /// for a 16 byte align requirement.
>> unsigned X86TargetLowering::GetAlignedArgumentStackSize(unsigned  
>> StackSize,
>>                                                         
>> SelectionDAG& DAG) {
>> -  if (PerformTailCallOpt) {
>> -    MachineFunction &MF = DAG.getMachineFunction();
>> -    const TargetMachine &TM = MF.getTarget();
>> -    const TargetFrameInfo &TFI = *TM.getFrameInfo();
>> -    unsigned StackAlignment = TFI.getStackAlignment();
>> -    uint64_t AlignMask = StackAlignment - 1;
>> -    int64_t Offset = StackSize;
>> -    unsigned SlotSize = Subtarget->is64Bit() ? 8 : 4;
>> -    if ( (Offset & AlignMask) <= (StackAlignment - SlotSize) ) {
>> -      // Number smaller than 12 so just add the difference.
>> -      Offset += ((StackAlignment - SlotSize) - (Offset &  
>> AlignMask));
>> -    } else {
>> -      // Mask out lower bits, add stackalignment once plus the 12  
>> bytes.
>> -      Offset = ((~AlignMask) & Offset) + StackAlignment +
>> -        (StackAlignment-SlotSize);
>> -    }
>> -    StackSize = Offset;
>> +  MachineFunction &MF = DAG.getMachineFunction();
>> +  const TargetMachine &TM = MF.getTarget();
>> +  const TargetFrameInfo &TFI = *TM.getFrameInfo();
>> +  unsigned StackAlignment = TFI.getStackAlignment();
>> +  uint64_t AlignMask = StackAlignment - 1;
>> +  int64_t Offset = StackSize;
>> +  unsigned SlotSize = Subtarget->is64Bit() ? 8 : 4;
>> +  if ( (Offset & AlignMask) <= (StackAlignment - SlotSize) ) {
>> +    // Number smaller than 12 so just add the difference.
>> +    Offset += ((StackAlignment - SlotSize) - (Offset & AlignMask));
>> +  } else {
>> +    // Mask out lower bits, add stackalignment once plus the 12  
>> bytes.
>> +    Offset = ((~AlignMask) & Offset) + StackAlignment +
>> +      (StackAlignment-SlotSize);
>>  }
>> -  return StackSize;
>> +  return Offset;
>> }
>>
>> /// IsEligibleForTailCallElimination - Check to see whether the  
>> next instruction
> _______________________________________________
> 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