mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
Compile time decreasing in the case we're dealing with Machine Combiner.
Before this patch compile time was about 21s (see below). After this patch we have less than 2s (see bellow). Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz DAGCombiner - trunk time ./llc spill_fdiv.ll -o /dev/null -enable-unsafe-fp-math real 0m1.685s DAGCombiner + Speed patch time ./llc spill_fdiv.ll -o /dev/null -enable-unsafe-fp-math real 0m1.655s MachineCombiner w/o Speed patch time ./llc spill_fdiv.ll -o /dev/null -enable-unsafe-fp-math real 0m21.614s MachineCombiner + Speed patch time ./llc spill_fdiv.ll -o /dev/null -enable-unsafe-fp-math real 0m1.593s The test spill_fdiv.ll is attached to D29627 D29627 should be closed. llvm-svn: 294936
This commit is contained in:
parent
89acda24b8
commit
78f7599134
@ -354,6 +354,19 @@ bool MachineCombiner::doSubstitute(unsigned NewSize, unsigned OldSize) {
|
||||
return false;
|
||||
}
|
||||
|
||||
static void insertDeleteInstructions(MachineBasicBlock *MBB, MachineInstr &MI,
|
||||
SmallVector<MachineInstr *, 16> InsInstrs,
|
||||
SmallVector<MachineInstr *, 16> DelInstrs,
|
||||
MachineTraceMetrics *Traces) {
|
||||
for (auto *InstrPtr : InsInstrs)
|
||||
MBB->insert((MachineBasicBlock::iterator)&MI, InstrPtr);
|
||||
for (auto *InstrPtr : DelInstrs)
|
||||
InstrPtr->eraseFromParentAndMarkDBGValuesForRemoval();
|
||||
++NumInstCombined;
|
||||
Traces->invalidate(MBB);
|
||||
Traces->verifyAnalysis();
|
||||
}
|
||||
|
||||
/// Substitute a slow code sequence with a faster one by
|
||||
/// evaluating instruction combining pattern.
|
||||
/// The prototype of such a pattern is MUl + ADD -> MADD. Performs instruction
|
||||
@ -408,7 +421,6 @@ bool MachineCombiner::combineInstructions(MachineBasicBlock *MBB) {
|
||||
DenseMap<unsigned, unsigned> InstrIdxForVirtReg;
|
||||
if (!MinInstr)
|
||||
MinInstr = Traces->getEnsemble(MachineTraceMetrics::TS_MinInstrCount);
|
||||
MachineTraceMetrics::Trace BlockTrace = MinInstr->getTrace(MBB);
|
||||
Traces->verifyAnalysis();
|
||||
TII->genAlternativeCodeSequence(MI, P, InsInstrs, DelInstrs,
|
||||
InstrIdxForVirtReg);
|
||||
@ -428,23 +440,23 @@ bool MachineCombiner::combineInstructions(MachineBasicBlock *MBB) {
|
||||
// fewer instructions OR
|
||||
// the new sequence neither lengthens the critical path nor increases
|
||||
// resource pressure.
|
||||
if (SubstituteAlways || doSubstitute(NewInstCount, OldInstCount) ||
|
||||
(improvesCriticalPathLen(MBB, &MI, BlockTrace, InsInstrs,
|
||||
DelInstrs, InstrIdxForVirtReg, P) &&
|
||||
preservesResourceLen(MBB, BlockTrace, InsInstrs, DelInstrs))) {
|
||||
for (auto *InstrPtr : InsInstrs)
|
||||
MBB->insert((MachineBasicBlock::iterator) &MI, InstrPtr);
|
||||
for (auto *InstrPtr : DelInstrs)
|
||||
InstrPtr->eraseFromParentAndMarkDBGValuesForRemoval();
|
||||
|
||||
Changed = true;
|
||||
++NumInstCombined;
|
||||
|
||||
Traces->invalidate(MBB);
|
||||
Traces->verifyAnalysis();
|
||||
if (SubstituteAlways || doSubstitute(NewInstCount, OldInstCount)) {
|
||||
insertDeleteInstructions(MBB, MI, InsInstrs, DelInstrs, Traces);
|
||||
// Eagerly stop after the first pattern fires.
|
||||
Changed = true;
|
||||
break;
|
||||
} else {
|
||||
// Calculating the trace metrics may be expensive,
|
||||
// so only do this when necessary.
|
||||
MachineTraceMetrics::Trace BlockTrace = MinInstr->getTrace(MBB);
|
||||
if (improvesCriticalPathLen(MBB, &MI, BlockTrace, InsInstrs, DelInstrs,
|
||||
InstrIdxForVirtReg, P) &&
|
||||
preservesResourceLen(MBB, BlockTrace, InsInstrs, DelInstrs)) {
|
||||
insertDeleteInstructions(MBB, MI, InsInstrs, DelInstrs, Traces);
|
||||
// Eagerly stop after the first pattern fires.
|
||||
Changed = true;
|
||||
break;
|
||||
}
|
||||
// Cleanup instructions of the alternative code sequence. There is no
|
||||
// use for them.
|
||||
MachineFunction *MF = MBB->getParent();
|
||||
|
Loading…
Reference in New Issue
Block a user