Be smarter about reusing constant pool entries.
llvm-svn: 84173
This commit is contained in:
parent
b4f2a85fe4
commit
68ead6c7a8
|
@ -74,16 +74,28 @@ namespace {
|
||||||
|
|
||||||
/// CPUser - One user of a constant pool, keeping the machine instruction
|
/// CPUser - One user of a constant pool, keeping the machine instruction
|
||||||
/// pointer, the constant pool being referenced, and the max displacement
|
/// pointer, the constant pool being referenced, and the max displacement
|
||||||
/// allowed from the instruction to the CP.
|
/// allowed from the instruction to the CP. The HighWaterMark records the
|
||||||
|
/// highest basic block where a new CPEntry can be placed. To ensure this
|
||||||
|
/// pass terminates, the CP entries are initially placed at the end of the
|
||||||
|
/// function and then move monotonically to lower addresses. The
|
||||||
|
/// exception to this rule is when the current CP entry for a particular
|
||||||
|
/// CPUser is out of range, but there is another CP entry for the same
|
||||||
|
/// constant value in range. We want to use the existing in-range CP
|
||||||
|
/// entry, but if it later moves out of range, the search for new water
|
||||||
|
/// should resume where it left off. The HighWaterMark is used to record
|
||||||
|
/// that point.
|
||||||
struct CPUser {
|
struct CPUser {
|
||||||
MachineInstr *MI;
|
MachineInstr *MI;
|
||||||
MachineInstr *CPEMI;
|
MachineInstr *CPEMI;
|
||||||
|
MachineBasicBlock *HighWaterMark;
|
||||||
unsigned MaxDisp;
|
unsigned MaxDisp;
|
||||||
bool NegOk;
|
bool NegOk;
|
||||||
bool IsSoImm;
|
bool IsSoImm;
|
||||||
CPUser(MachineInstr *mi, MachineInstr *cpemi, unsigned maxdisp,
|
CPUser(MachineInstr *mi, MachineInstr *cpemi, unsigned maxdisp,
|
||||||
bool neg, bool soimm)
|
bool neg, bool soimm)
|
||||||
: MI(mi), CPEMI(cpemi), MaxDisp(maxdisp), NegOk(neg), IsSoImm(soimm) {}
|
: MI(mi), CPEMI(cpemi), MaxDisp(maxdisp), NegOk(neg), IsSoImm(soimm) {
|
||||||
|
HighWaterMark = CPEMI->getParent();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// CPUsers - Keep track of all of the machine instructions that use various
|
/// CPUsers - Keep track of all of the machine instructions that use various
|
||||||
|
@ -962,8 +974,8 @@ bool ARMConstantIslands::LookForWater(CPUser &U, unsigned UserOffset,
|
||||||
B = WaterList.begin();; --IP) {
|
B = WaterList.begin();; --IP) {
|
||||||
MachineBasicBlock* WaterBB = *IP;
|
MachineBasicBlock* WaterBB = *IP;
|
||||||
// Check if water is in range and at a lower address than the current one.
|
// Check if water is in range and at a lower address than the current one.
|
||||||
if (WaterIsInRange(UserOffset, WaterBB, U) &&
|
if (WaterBB->getNumber() < U.HighWaterMark->getNumber() &&
|
||||||
WaterBB->getNumber() < U.CPEMI->getParent()->getNumber()) {
|
WaterIsInRange(UserOffset, WaterBB, U)) {
|
||||||
unsigned WBBId = WaterBB->getNumber();
|
unsigned WBBId = WaterBB->getNumber();
|
||||||
if (isThumb &&
|
if (isThumb &&
|
||||||
(BBOffsets[WBBId] + BBSizes[WBBId])%4 != 0) {
|
(BBOffsets[WBBId] + BBSizes[WBBId])%4 != 0) {
|
||||||
|
@ -1129,6 +1141,7 @@ bool ARMConstantIslands::HandleConstantPoolUser(MachineFunction &MF,
|
||||||
|
|
||||||
// Now that we have an island to add the CPE to, clone the original CPE and
|
// Now that we have an island to add the CPE to, clone the original CPE and
|
||||||
// add it to the island.
|
// add it to the island.
|
||||||
|
U.HighWaterMark = NewIsland;
|
||||||
U.CPEMI = BuildMI(NewIsland, DebugLoc::getUnknownLoc(),
|
U.CPEMI = BuildMI(NewIsland, DebugLoc::getUnknownLoc(),
|
||||||
TII->get(ARM::CONSTPOOL_ENTRY))
|
TII->get(ARM::CONSTPOOL_ENTRY))
|
||||||
.addImm(ID).addConstantPoolIndex(CPI).addImm(Size);
|
.addImm(ID).addConstantPoolIndex(CPI).addImm(Size);
|
||||||
|
|
Loading…
Reference in New Issue