[PATCH] D26151: RegCall - Handling long double arguments

Akira Hatanaka via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 8 23:41:38 PST 2016


ahatanak added inline comments.


================
Comment at: lib/Target/X86/X86FloatingPoint.cpp:973
   assert(STReturns == 0 || (isMask_32(STReturns) && N <= 2));
+  StackTop = 0;
 
----------------
oren_ben_simhon wrote:
> 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.
Wouldn't this push an extra register when a function taking a long double argument and returning complex long double were called (in which case N==2 because it's returned in st0 and st1)?


================
Comment at: lib/Target/X86/X86FloatingPoint.cpp:348
+    Bundle.FixCount = 1;
+    Bundle.FixStack[0] = Stack[0];
+  }
----------------
If this is just assigning 0 (FP0), maybe you can just explicitly do so rather than assigning Stack[0] (which is OK because it's initialized to 0 using memset) to make your intent clear?


Repository:
  rL LLVM

https://reviews.llvm.org/D26151





More information about the llvm-commits mailing list