[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