aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/X86/InstSelectSimple.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-12-16 22:54:46 +0000
committerChris Lattner <sabre@nondot.org>2002-12-16 22:54:46 +0000
commit14aa7fe23820394ad2f0ddb14ef0b858b8712f39 (patch)
tree45ef361432dded363b489503c727e75a47044ea1 /lib/Target/X86/InstSelectSimple.cpp
parent3fc14c2602b37863c65c47b9e3eef1b93c4e6f40 (diff)
Two fixes:
* Only load incoming arguments into virtual registers once at the beginning of the function * Assign different virtual registers to each reference to constants/globals git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5088 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/InstSelectSimple.cpp')
-rw-r--r--lib/Target/X86/InstSelectSimple.cpp44
1 files changed, 23 insertions, 21 deletions
diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp
index e35867df00..82dd6467f9 100644
--- a/lib/Target/X86/InstSelectSimple.cpp
+++ b/lib/Target/X86/InstSelectSimple.cpp
@@ -78,6 +78,27 @@ namespace {
for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
F->getBasicBlockList().push_back(MBBMap[I] = new MachineBasicBlock(I));
+ // Emit instructions to load the arguments... The function's arguments
+ // look like this:
+ //
+ // [EBP] -- copy of old EBP
+ // [EBP + 4] -- return address
+ // [EBP + 8] -- first argument (leftmost lexically)
+ //
+ // So we want to start with counter = 2.
+ //
+ BB = &F->front();
+ unsigned ArgOffset = 8;
+ for (Function::aiterator I = Fn.abegin(), E = Fn.aend(); I != E;
+ ++I, ArgOffset += 4) {
+ unsigned Reg = getReg(*I);
+
+ // Load it out of the stack frame at EBP + 4*argPos.
+
+ // FIXME: This should load the argument of the appropriate size!!
+ addRegOffset(BuildMI(BB, X86::MOVmr32, 4, Reg), X86::EBP, ArgOffset);
+ }
+
// Instruction select everything except PHI nodes
visit(Fn);
@@ -213,30 +234,11 @@ namespace {
//
if (Constant *C = dyn_cast<Constant>(V)) {
copyConstantToRegister(MBB, IPt, C, Reg);
+ RegMap.erase(V); // Assign a new name to this constant if ref'd again
} else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
// Move the address of the global into the register
BMI(MBB, IPt, X86::MOVir32, 1, Reg).addReg(GV);
- } else if (Argument *A = dyn_cast<Argument>(V)) {
- // Find the position of the argument in the argument list.
- const Function *f = F->getFunction ();
- // The function's arguments look like this:
- // [EBP] -- copy of old EBP
- // [EBP + 4] -- return address
- // [EBP + 8] -- first argument (leftmost lexically)
- // So we want to start with counter = 2.
- int counter = 2, argPos = -1;
- for (Function::const_aiterator ai = f->abegin (), ae = f->aend ();
- ai != ae; ++ai) {
- if (&(*ai) == A) {
- argPos = counter;
- break; // Only need to find it once. ;-)
- }
- ++counter;
- }
- assert (argPos != -1
- && "Argument not found in current function's argument list");
- // Load it out of the stack frame at EBP + 4*argPos.
- addRegOffset(BMI(MBB, IPt, X86::MOVmr32, 4, Reg), X86::EBP, 4*argPos);
+ RegMap.erase(V); // Assign a new name to this address if ref'd again
}
return Reg;