diff options
author | Chris Lattner <sabre@nondot.org> | 2002-12-16 22:54:46 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-12-16 22:54:46 +0000 |
commit | 14aa7fe23820394ad2f0ddb14ef0b858b8712f39 (patch) | |
tree | 45ef361432dded363b489503c727e75a47044ea1 /lib/Target/X86/InstSelectSimple.cpp | |
parent | 3fc14c2602b37863c65c47b9e3eef1b93c4e6f40 (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.cpp | 44 |
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; |