// compute spill weights
const LoopInfo& loopInfo = getAnalysis<LoopInfo>();
+ const TargetInstrInfo& tii = tm_->getInstrInfo();
for (MbbIndex2MbbMap::iterator
it = mbbi2mbbMap_.begin(), itEnd = mbbi2mbbMap_.end();
assert(r2iit != r2iMap_.end());
intervals_[r2iit->second].weight += pow(10.0F, loopDepth);
}
+
+ // add hints for coalescing
+ unsigned src, dst;
+ if (tii.isMoveInstr(*instr, src, dst)) {
+ if (src >= MRegisterInfo::FirstVirtualRegister) {
+ Reg2IntervalMap::iterator r2iit = r2iMap_.find(src);
+ assert(r2iit != r2iMap_.end());
+ intervals_[r2iit->second].hint = dst;
+ }
+ if (dst >= MRegisterInfo::FirstVirtualRegister) {
+ Reg2IntervalMap::iterator r2iit = r2iMap_.find(dst);
+ assert(r2iit != r2iMap_.end());
+ intervals_[r2iit->second].hint = src;
+ }
+ }
}
}
}
LiveIntervals::Interval::Interval(unsigned r)
- : reg(r),
+ : reg(r), hint(0),
weight((r < MRegisterInfo::FirstVirtualRegister ?
std::numeric_limits<float>::max() : 0.0F))
{