Changes in directory llvm/lib/CodeGen:
BranchFolding.cpp updated: 1.44 -> 1.45 RegisterScavenging.cpp updated: 1.12 -> 1.13 --- Log message: maintain LiveIn when splitting blocks (register scavenging needs it) --- Diffs of the changes: (+29 -1) BranchFolding.cpp | 23 ++++++++++++++++++++++- RegisterScavenging.cpp | 7 +++++++ 2 files changed, 29 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/BranchFolding.cpp diff -u llvm/lib/CodeGen/BranchFolding.cpp:1.44 llvm/lib/CodeGen/BranchFolding.cpp:1.45 --- llvm/lib/CodeGen/BranchFolding.cpp:1.44 Thu Feb 22 10:39:03 2007 +++ llvm/lib/CodeGen/BranchFolding.cpp Tue Mar 20 16:35:06 2007 @@ -21,8 +21,10 @@ #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineJumpTableInfo.h" +#include "llvm/CodeGen/RegisterScavenging.h" #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Target/MRegisterInfo.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/Statistic.h" @@ -49,7 +51,9 @@ MachineBasicBlock *NewDest); MachineBasicBlock *SplitMBBAt(MachineBasicBlock &CurMBB, MachineBasicBlock::iterator BBI1); - + + const MRegisterInfo *RegInfo; + RegScavenger *RS; // Branch optzn. bool OptimizeBranches(MachineFunction &MF); void OptimizeBlock(MachineBasicBlock *MBB); @@ -95,6 +99,9 @@ TII = MF.getTarget().getInstrInfo(); if (!TII) return false; + RegInfo = MF.getTarget().getRegisterInfo(); + RS = RegInfo->requiresRegisterScavenging(MF) ? new RegScavenger() : NULL; + MMI = getAnalysisToUpdate<MachineModuleInfo>(); bool EverMadeChange = false; @@ -153,6 +160,7 @@ } } + delete RS; return EverMadeChange; } @@ -280,6 +288,19 @@ // Splice the code over. NewMBB->splice(NewMBB->end(), &CurMBB, BBI1, CurMBB.end()); + + // For targets that use the register scavenger, we must maintain LiveIns. + if (RS) { + RS->enterBasicBlock(&CurMBB); + if (!CurMBB.empty()) + RS->forward(prior(CurMBB.end())); + BitVector RegsLiveAtExit(RegInfo->getNumRegs()); + RS->getRegsUsed(RegsLiveAtExit, false); + for (unsigned int i=0, e=RegInfo->getNumRegs(); i!=e; i++) + if (RegsLiveAtExit[i]) + NewMBB->addLiveIn(i); + } + return NewMBB; } Index: llvm/lib/CodeGen/RegisterScavenging.cpp diff -u llvm/lib/CodeGen/RegisterScavenging.cpp:1.12 llvm/lib/CodeGen/RegisterScavenging.cpp:1.13 --- llvm/lib/CodeGen/RegisterScavenging.cpp:1.12 Tue Mar 6 15:58:15 2007 +++ llvm/lib/CodeGen/RegisterScavenging.cpp Tue Mar 20 16:35:06 2007 @@ -180,6 +180,13 @@ setUsed(ChangedRegs); } +void RegScavenger::getRegsUsed(BitVector &used, bool includeReserved) { + if (includeReserved) + used = RegStates; + else + used = RegStates & ~ReservedRegs; +} + /// CreateRegClassMask - Set the bits that represent the registers in the /// TargetRegisterClass. static void CreateRegClassMask(const TargetRegisterClass *RC, BitVector &Mask) { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits