diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 | 
| commit | eb11fae6d08f479c0799db45860a98af528fa6e7 (patch) | |
| tree | 44d492a50c8c1a7eb8e2d17ea3360ec4d066f042 /lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp | |
| parent | b8a2042aa938069e862750553db0e4d82d25822c (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp')
| -rw-r--r-- | lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp | 36 | 
1 files changed, 35 insertions, 1 deletions
diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp index c09b47af26a6..430d8fb34476 100644 --- a/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp +++ b/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp @@ -27,6 +27,7 @@  #include "llvm/CodeGen/TargetLowering.h"  #include "llvm/CodeGen/TargetRegisterInfo.h"  #include "llvm/CodeGen/TargetSubtargetInfo.h" +#include "llvm/Config/llvm-config.h"  #include "llvm/MC/MCInstrItineraries.h"  #include "llvm/Support/CommandLine.h"  #include "llvm/Support/Debug.h" @@ -243,7 +244,7 @@ void ScheduleDAGSDNodes::ClusterNeighboringLoads(SDNode *Node) {      return;    // Sort them in increasing order. -  std::sort(Offsets.begin(), Offsets.end()); +  llvm::sort(Offsets.begin(), Offsets.end());    // Check if the loads are close enough.    SmallVector<SDNode*, 4> Loads; @@ -910,6 +911,39 @@ EmitSchedule(MachineBasicBlock::iterator &InsertPos) {      MachineBasicBlock *InsertBB = Emitter.getBlock();      MachineBasicBlock::iterator Pos = InsertBB->getFirstTerminator();      InsertBB->insert(Pos, DbgMIs.begin(), DbgMIs.end()); + +    SDDbgInfo::DbgLabelIterator DLI = DAG->DbgLabelBegin(); +    SDDbgInfo::DbgLabelIterator DLE = DAG->DbgLabelEnd(); +    // Now emit the rest according to source order. +    LastOrder = 0; +    for (const auto &InstrOrder : Orders) { +      unsigned Order = InstrOrder.first; +      MachineInstr *MI = InstrOrder.second; +      if (!MI) +        continue; + +      // Insert all SDDbgLabel's whose order(s) are before "Order". +      for (; DLI != DLE && +             (*DLI)->getOrder() >= LastOrder && (*DLI)->getOrder() < Order; +             ++DLI) { +        MachineInstr *DbgMI = Emitter.EmitDbgLabel(*DLI); +        if (DbgMI) { +          if (!LastOrder) +            // Insert to start of the BB (after PHIs). +            BB->insert(BBBegin, DbgMI); +          else { +            // Insert at the instruction, which may be in a different +            // block, if the block was split by a custom inserter. +            MachineBasicBlock::iterator Pos = MI; +            MI->getParent()->insert(Pos, DbgMI); +          } +        } +      } +      if (DLI == DLE) +        break; + +      LastOrder = Order; +    }    }    InsertPos = Emitter.getInsertPos();  | 
