Fix errors in computing downgrowing offsets, and in
computing size of extra outgoing args.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1256 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index 46a8029..b6e8805 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -191,8 +191,9 @@
{
CallInst* callInst = cast<CallInst>(*I);
unsigned int numOperands = callInst->getNumOperands() - 1;
- unsigned int numExtra = numOperands
- - frameInfo.getNumFixedOutgoingArgs();
+ int numExtra = (int) numOperands - frameInfo.getNumFixedOutgoingArgs();
+ if (numExtra <= 0)
+ continue;
unsigned int sizeForThisCall;
if (frameInfo.argsOnStackHaveFixedSize())
@@ -243,11 +244,12 @@
bool growUp;
int firstOffset =target.getFrameInfo().getFirstAutomaticVarOffset(*this,
growUp);
+ unsigned int size = target.findOptimalStorageSize(val->getType());
+
offset = growUp? firstOffset + getAutomaticVarsSize()
- : firstOffset - getAutomaticVarsSize();
+ : firstOffset - getAutomaticVarsSize() - size;
offsets[val] = offset;
- unsigned int size = target.findOptimalStorageSize(val->getType());
incrementAutomaticVarsSize(size);
}
return offset;
@@ -259,10 +261,11 @@
{
bool growUp;
int firstOffset = target.getFrameInfo().getRegSpillAreaOffset(*this, growUp);
- int offset = growUp? firstOffset + getRegSpillsSize()
- : firstOffset - getRegSpillsSize();
-
unsigned int size = target.findOptimalStorageSize(type);
+
+ int offset = growUp? firstOffset + getRegSpillsSize()
+ : firstOffset - getRegSpillsSize() - size;
+
incrementRegSpillsSize(size);
return offset;
@@ -275,18 +278,18 @@
const MachineFrameInfo& frameInfo = target.getFrameInfo();
bool growUp;
int firstOffset = frameInfo.getFirstOptionalOutgoingArgOffset(*this, growUp);
- int offset = growUp? firstOffset + getCurrentOptionalArgsSize()
- : firstOffset - getCurrentOptionalArgsSize();
-
+
int size = MAXINT;
if (frameInfo.argsOnStackHaveFixedSize())
size = frameInfo.getSizeOfEachArgOnStack();
else
{
- assert(0 && "UNTESTED CODE: Size per stack argument is not fixed on this architecture: use actual argument sizes for computing optional arg offsets");
size = target.findOptimalStorageSize(type);
+ assert(0 && "UNTESTED CODE: Size per stack argument is not fixed on this architecture: use actual argument sizes for computing optional arg offsets");
}
+ int offset = growUp? firstOffset + getCurrentOptionalArgsSize()
+ : firstOffset - getCurrentOptionalArgsSize() - size;
incrementCurrentOptionalArgsSize(size);
return offset;
@@ -305,7 +308,7 @@
bool growUp;
int firstTmpOffset = target.getFrameInfo().getTmpAreaOffset(*this, growUp);
int offset = growUp? firstTmpOffset + currentTmpValuesSize
- : firstTmpOffset - currentTmpValuesSize;
+ : firstTmpOffset - currentTmpValuesSize - size;
currentTmpValuesSize += size;
return offset;
}