aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/MachineInstr.cpp
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2001-11-11 21:23:33 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2001-11-11 21:23:33 +0000
commitf1a0a1081347ff6177b8b57dc16d841cde89e7fc (patch)
tree77f8a0df6b2d130d1994a53be88261b61b6c5fc0 /lib/CodeGen/MachineInstr.cpp
parent5a81692f47fd2179ceafb40e47e2efafe936d879 (diff)
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
Diffstat (limited to 'lib/CodeGen/MachineInstr.cpp')
-rw-r--r--lib/CodeGen/MachineInstr.cpp25
1 files changed, 14 insertions, 11 deletions
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index 46a8029840..b6e8805955 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -191,8 +191,9 @@ ComputeMaxOptionalArgsSize(const TargetMachine& target, const Method* method)
{
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 @@ MachineCodeForMethod::allocateLocalVar(const TargetMachine& target,
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 @@ MachineCodeForMethod::allocateSpilledValue(const TargetMachine& target,
{
bool growUp;
int firstOffset = target.getFrameInfo().getRegSpillAreaOffset(*this, growUp);
+ unsigned int size = target.findOptimalStorageSize(type);
+
int offset = growUp? firstOffset + getRegSpillsSize()
- : firstOffset - getRegSpillsSize();
+ : firstOffset - getRegSpillsSize() - size;
- unsigned int size = target.findOptimalStorageSize(type);
incrementRegSpillsSize(size);
return offset;
@@ -275,18 +278,18 @@ MachineCodeForMethod::allocateOptionalArg(const TargetMachine& target,
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 @@ MachineCodeForMethod::pushTempValue(const TargetMachine& target,
bool growUp;
int firstTmpOffset = target.getFrameInfo().getTmpAreaOffset(*this, growUp);
int offset = growUp? firstTmpOffset + currentTmpValuesSize
- : firstTmpOffset - currentTmpValuesSize;
+ : firstTmpOffset - currentTmpValuesSize - size;
currentTmpValuesSize += size;
return offset;
}