diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-07-05 14:21:36 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-07-05 14:21:36 +0000 | 
| commit | 1a82d4c088707c791c792f6822f611b47a12bdfe (patch) | |
| tree | 7c411f9b5d807f7f204fdd16965d8925a82b6d18 /lib/CodeGen/MachineCombiner.cpp | |
| parent | 3a0822f094b578157263e04114075ad7df81db41 (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/MachineCombiner.cpp')
| -rw-r--r-- | lib/CodeGen/MachineCombiner.cpp | 51 | 
1 files changed, 32 insertions, 19 deletions
| diff --git a/lib/CodeGen/MachineCombiner.cpp b/lib/CodeGen/MachineCombiner.cpp index 5019e8eef19b..f33d0e6a28e5 100644 --- a/lib/CodeGen/MachineCombiner.cpp +++ b/lib/CodeGen/MachineCombiner.cpp @@ -67,10 +67,11 @@ private:    unsigned getLatency(MachineInstr *Root, MachineInstr *NewRoot,                        MachineTraceMetrics::Trace BlockTrace);    bool -  preservesCriticalPathLen(MachineBasicBlock *MBB, MachineInstr *Root, +  improvesCriticalPathLen(MachineBasicBlock *MBB, MachineInstr *Root,                             MachineTraceMetrics::Trace BlockTrace,                             SmallVectorImpl<MachineInstr *> &InsInstrs, -                           DenseMap<unsigned, unsigned> &InstrIdxForVirtReg); +                           DenseMap<unsigned, unsigned> &InstrIdxForVirtReg, +                           bool NewCodeHasLessInsts);    bool preservesResourceLen(MachineBasicBlock *MBB,                              MachineTraceMetrics::Trace BlockTrace,                              SmallVectorImpl<MachineInstr *> &InsInstrs, @@ -78,7 +79,7 @@ private:    void instr2instrSC(SmallVectorImpl<MachineInstr *> &Instrs,                       SmallVectorImpl<const MCSchedClassDesc *> &InstrsSC);  }; -} // namespace +}  char MachineCombiner::ID = 0;  char &llvm::MachineCombinerID = MachineCombiner::ID; @@ -208,19 +209,24 @@ unsigned MachineCombiner::getLatency(MachineInstr *Root, MachineInstr *NewRoot,    return NewRootLatency;  } -/// True when the new instruction sequence does not -/// lengthen the critical path. The DAGCombine code sequence ends in MI -/// (Machine Instruction) Root. The new code sequence ends in MI NewRoot. A -/// necessary condition for the new sequence to replace the old sequence is that -/// it cannot lengthen the critical path. This is decided by the formula +/// True when the new instruction sequence does not lengthen the critical path +/// and the new sequence has less instructions or the new sequence improves the +/// critical path. +/// The DAGCombine code sequence ends in MI (Machine Instruction) Root. +/// The new code sequence ends in MI NewRoot. A necessary condition for the new +/// sequence to replace the old sequence is that it cannot lengthen the critical +/// path. This is decided by the formula:  /// (NewRootDepth + NewRootLatency) <= (RootDepth + RootLatency + RootSlack)). -/// The slack is the number of cycles Root can be delayed before the critical -/// patch becomes longer. -bool MachineCombiner::preservesCriticalPathLen( +/// If the new sequence has an equal length critical path but does not reduce +/// the number of instructions (NewCodeHasLessInsts is false), then it is not +/// considered an improvement. The slack is the number of cycles Root can be +/// delayed before the critical patch becomes longer. +bool MachineCombiner::improvesCriticalPathLen(      MachineBasicBlock *MBB, MachineInstr *Root,      MachineTraceMetrics::Trace BlockTrace,      SmallVectorImpl<MachineInstr *> &InsInstrs, -    DenseMap<unsigned, unsigned> &InstrIdxForVirtReg) { +    DenseMap<unsigned, unsigned> &InstrIdxForVirtReg, +    bool NewCodeHasLessInsts) {    assert(TSchedModel.hasInstrSchedModel() && "Missing machine model\n");    // NewRoot is the last instruction in the \p InsInstrs vector. @@ -245,9 +251,13 @@ bool MachineCombiner::preservesCriticalPathLen(          dbgs() << " RootDepth + RootLatency + RootSlack "                 << RootDepth + RootLatency + RootSlack << "\n";); -  /// True when the new sequence does not lengthen the critical path. -  return ((NewRootDepth + NewRootLatency) <= -          (RootDepth + RootLatency + RootSlack)); +  unsigned NewCycleCount = NewRootDepth + NewRootLatency; +  unsigned OldCycleCount = RootDepth + RootLatency + RootSlack; +   +  if (NewCodeHasLessInsts) +    return NewCycleCount <= OldCycleCount; +  else +    return NewCycleCount < OldCycleCount;  }  /// helper routine to convert instructions into SC @@ -359,18 +369,21 @@ bool MachineCombiner::combineInstructions(MachineBasicBlock *MBB) {          Traces->verifyAnalysis();          TII->genAlternativeCodeSequence(MI, P, InsInstrs, DelInstrs,                                          InstrIdxForVirtReg); +        unsigned NewInstCount = InsInstrs.size(); +        unsigned OldInstCount = DelInstrs.size();          // Found pattern, but did not generate alternative sequence.          // This can happen e.g. when an immediate could not be materialized          // in a single instruction. -        if (!InsInstrs.size()) +        if (!NewInstCount)            continue;          // Substitute when we optimize for codesize and the new sequence has          // fewer instructions OR          // the new sequence neither lengthens the critical path nor increases          // resource pressure. -        if (doSubstitute(InsInstrs.size(), DelInstrs.size()) || -            (preservesCriticalPathLen(MBB, &MI, BlockTrace, InsInstrs, -                                      InstrIdxForVirtReg) && +        if (doSubstitute(NewInstCount, OldInstCount) || +            (improvesCriticalPathLen(MBB, &MI, BlockTrace, InsInstrs, +                                      InstrIdxForVirtReg, +                                      NewInstCount < OldInstCount) &&               preservesResourceLen(MBB, BlockTrace, InsInstrs, DelInstrs))) {            for (auto *InstrPtr : InsInstrs)              MBB->insert((MachineBasicBlock::iterator) &MI, InstrPtr); | 
