diff options
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/MachinePipeliner.cpp | 9 | 
1 files changed, 7 insertions, 2 deletions
| diff --git a/llvm/lib/CodeGen/MachinePipeliner.cpp b/llvm/lib/CodeGen/MachinePipeliner.cpp index e968f3a6e2c..78a34f01bab 100644 --- a/llvm/lib/CodeGen/MachinePipeliner.cpp +++ b/llvm/lib/CodeGen/MachinePipeliner.cpp @@ -3454,10 +3454,15 @@ bool SwingSchedulerDAG::canUseLastOffsetValue(MachineInstr *MI,    if (!TII->getBaseAndOffsetPosition(*PrevDef, BasePos1, OffsetPos1))      return false; -  // Make sure offset values are both positive or both negative. +  // Make sure that the instructions do not access the same memory location in +  // the next iteration.    int64_t LoadOffset = MI->getOperand(OffsetPosLd).getImm();    int64_t StoreOffset = PrevDef->getOperand(OffsetPos1).getImm(); -  if ((LoadOffset >= 0) != (StoreOffset >= 0)) +  MachineInstr *NewMI = MF.CloneMachineInstr(MI); +  NewMI->getOperand(OffsetPosLd).setImm(LoadOffset + StoreOffset); +  bool Disjoint = TII->areMemAccessesTriviallyDisjoint(*NewMI, *PrevDef); +  MF.DeleteMachineInstr(NewMI); +  if (!Disjoint)      return false;    // Set the return value once we determine that we return true. | 

