From ba1c1da36ab778fe3c5b9a8c9fb0d0f0b0e0089e Mon Sep 17 00:00:00 2001 From: Misha Brukman Date: Tue, 20 Jul 2004 00:59:38 +0000 Subject: [PATCH] Move handing of GlobalValues from getReg() to copyConstantToRegister(), this will avoid extra register-to-register copies. Thanks to Chris for the idea. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15019 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPC32ISelSimple.cpp | 30 +++++++++--------------- lib/Target/PowerPC/PowerPCISelSimple.cpp | 30 +++++++++--------------- 2 files changed, 22 insertions(+), 38 deletions(-) diff --git a/lib/Target/PowerPC/PPC32ISelSimple.cpp b/lib/Target/PowerPC/PPC32ISelSimple.cpp index a30facc0676..b6147e0d518 100644 --- a/lib/Target/PowerPC/PPC32ISelSimple.cpp +++ b/lib/Target/PowerPC/PPC32ISelSimple.cpp @@ -397,23 +397,7 @@ static AllocaInst *dyn_castFixedAlloca(Value *V) { /// unsigned ISel::getReg(Value *V, MachineBasicBlock *MBB, MachineBasicBlock::iterator IPt) { - // If this operand is a constant, emit the code to copy the constant into - // the register here... - // - if (GlobalValue *GV = dyn_cast(V)) { - // GV is located at PC + distance - unsigned CurPC = makeAnotherReg(Type::IntTy); - unsigned Reg1 = makeAnotherReg(V->getType()); - unsigned Reg2 = makeAnotherReg(V->getType()); - // Move PC to destination reg - BuildMI(*MBB, IPt, PPC32::MovePCtoLR, 0, CurPC); - // Move value at PC + distance into return reg - BuildMI(*MBB, IPt, PPC32::LOADHiAddr, 2, Reg1).addReg(CurPC) - .addGlobalAddress(GV); - BuildMI(*MBB, IPt, PPC32::LOADLoAddr, 2, Reg2).addReg(Reg1) - .addGlobalAddress(GV); - return Reg2; - } else if (Constant *C = dyn_cast(V)) { + if (Constant *C = dyn_cast(V)) { unsigned Reg = makeAnotherReg(V->getType()); copyConstantToRegister(MBB, IPt, C, Reg); return Reg; @@ -542,8 +526,16 @@ void ISel::copyConstantToRegister(MachineBasicBlock *MBB, // Copy zero (null pointer) to the register. BuildMI(*MBB, IP, PPC32::LI, 1, R).addImm(0); } else if (GlobalValue *GV = dyn_cast(C)) { - unsigned AddrReg = getReg(GV, MBB, IP); - BuildMI(*MBB, IP, PPC32::OR, 2, R).addReg(AddrReg).addReg(AddrReg); + // GV is located at PC + distance + unsigned CurPC = makeAnotherReg(Type::IntTy); + unsigned TmpReg = makeAnotherReg(GV->getType()); + // Move PC to destination reg + BuildMI(*MBB, IP, PPC32::MovePCtoLR, 0, CurPC); + // Move value at PC + distance into return reg + BuildMI(*MBB, IP, PPC32::LOADHiAddr, 2, TmpReg).addReg(CurPC) + .addGlobalAddress(GV); + BuildMI(*MBB, IP, PPC32::LOADLoAddr, 2, R).addReg(TmpReg) + .addGlobalAddress(GV); } else { std::cerr << "Offending constant: " << *C << "\n"; assert(0 && "Type not handled yet!"); diff --git a/lib/Target/PowerPC/PowerPCISelSimple.cpp b/lib/Target/PowerPC/PowerPCISelSimple.cpp index a30facc0676..b6147e0d518 100644 --- a/lib/Target/PowerPC/PowerPCISelSimple.cpp +++ b/lib/Target/PowerPC/PowerPCISelSimple.cpp @@ -397,23 +397,7 @@ static AllocaInst *dyn_castFixedAlloca(Value *V) { /// unsigned ISel::getReg(Value *V, MachineBasicBlock *MBB, MachineBasicBlock::iterator IPt) { - // If this operand is a constant, emit the code to copy the constant into - // the register here... - // - if (GlobalValue *GV = dyn_cast(V)) { - // GV is located at PC + distance - unsigned CurPC = makeAnotherReg(Type::IntTy); - unsigned Reg1 = makeAnotherReg(V->getType()); - unsigned Reg2 = makeAnotherReg(V->getType()); - // Move PC to destination reg - BuildMI(*MBB, IPt, PPC32::MovePCtoLR, 0, CurPC); - // Move value at PC + distance into return reg - BuildMI(*MBB, IPt, PPC32::LOADHiAddr, 2, Reg1).addReg(CurPC) - .addGlobalAddress(GV); - BuildMI(*MBB, IPt, PPC32::LOADLoAddr, 2, Reg2).addReg(Reg1) - .addGlobalAddress(GV); - return Reg2; - } else if (Constant *C = dyn_cast(V)) { + if (Constant *C = dyn_cast(V)) { unsigned Reg = makeAnotherReg(V->getType()); copyConstantToRegister(MBB, IPt, C, Reg); return Reg; @@ -542,8 +526,16 @@ void ISel::copyConstantToRegister(MachineBasicBlock *MBB, // Copy zero (null pointer) to the register. BuildMI(*MBB, IP, PPC32::LI, 1, R).addImm(0); } else if (GlobalValue *GV = dyn_cast(C)) { - unsigned AddrReg = getReg(GV, MBB, IP); - BuildMI(*MBB, IP, PPC32::OR, 2, R).addReg(AddrReg).addReg(AddrReg); + // GV is located at PC + distance + unsigned CurPC = makeAnotherReg(Type::IntTy); + unsigned TmpReg = makeAnotherReg(GV->getType()); + // Move PC to destination reg + BuildMI(*MBB, IP, PPC32::MovePCtoLR, 0, CurPC); + // Move value at PC + distance into return reg + BuildMI(*MBB, IP, PPC32::LOADHiAddr, 2, TmpReg).addReg(CurPC) + .addGlobalAddress(GV); + BuildMI(*MBB, IP, PPC32::LOADLoAddr, 2, R).addReg(TmpReg) + .addGlobalAddress(GV); } else { std::cerr << "Offending constant: " << *C << "\n"; assert(0 && "Type not handled yet!"); -- 2.34.1