[PATCH] D26151: RegCall - Handling long double arguments

Oren Ben Simhon via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 8 06:27:03 PST 2016


oren_ben_simhon marked 2 inline comments as done.
oren_ben_simhon added inline comments.


================
Comment at: lib/Target/X86/X86FloatingPoint.cpp:973
   assert(STReturns == 0 || (isMask_32(STReturns) && N <= 2));
+  StackTop = 0;
 
----------------
ahatanak wrote:
> I'm not sure what this comment means.
> 
> It seems like you are clearing StackTop because the first FP register can be used to pass an argument when the calling convention is regcall. Is that correct?
The problem occurs when FP0 was passed as argument and we try to return a parameter in FP0 as well.
In that case the StackTop points to 1 and we get to the following loop and we call pushreg(0) when FP0 is already assigned and StackTop is 1. 

So what actually happened before pushreg:    
           Stack[] = { 0, ...}
           RegMap[] = { 0, ...}
While after pushreg[0] (No stacktop reset):      
           Stack[] = { 0, 1..}
           RegMap[] = { 1...}

The issue causes debug assertion in line 169 to fail because then regmap[stack[0]] != 0.

I changed the way I handle the issue.
Instead of reseting the StackTop to zero, I do not push registers if they were already pushed into the stack.


Repository:
  rL LLVM

https://reviews.llvm.org/D26151





More information about the llvm-commits mailing list