namespace {
class CodePlacementOpt : public MachineFunctionPass {
+ const MachineLoopInfo *MLI;
+
public:
static char ID;
CodePlacementOpt() : MachineFunctionPass(&ID) {}
AU.addPreservedID(MachineDominatorsID);
MachineFunctionPass::getAnalysisUsage(AU);
}
+
+ private:
+ bool AlignLoops(MachineFunction &MF);
};
char CodePlacementOpt::ID = 0;
return new CodePlacementOpt();
}
-bool CodePlacementOpt::runOnMachineFunction(MachineFunction &MF) {
- const MachineLoopInfo *MLI = &getAnalysis<MachineLoopInfo>();
-
- if (MLI->empty())
- return false; // No loops.
-
+/// AlignLoops - Align loop headers to target preferred alignments.
+///
+bool CodePlacementOpt::AlignLoops(MachineFunction &MF) {
const TargetLowering *TLI = MF.getTarget().getTargetLowering();
if (!TLI)
return false;
if (F->hasFnAttr(Attribute::OptimizeForSize))
return false;
+ bool Changed = false;
for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
MachineBasicBlock *MBB = I;
if (MLI->isLoopHeader(MBB)) {
// to prevent adding noop's inside a loop.
continue;
MBB->setAlignment(Align);
+ Changed = true;
}
}
- return true;
+ return Changed;
+}
+
+bool CodePlacementOpt::runOnMachineFunction(MachineFunction &MF) {
+ MLI = &getAnalysis<MachineLoopInfo>();
+ if (MLI->empty())
+ return false; // No loops.
+
+ bool Changed = false;
+ Changed |= AlignLoops(MF);
+
+ return Changed;
}