1198892Srdivacky//=- llvm/CodeGen/AntiDepBreaker.h - Anti-Dependence Breaking -*- C++ -*-=//
2198892Srdivacky//
3198892Srdivacky//                     The LLVM Compiler Infrastructure
4198892Srdivacky//
5198892Srdivacky// This file is distributed under the University of Illinois Open Source
6198892Srdivacky// License. See LICENSE.TXT for details.
7198892Srdivacky//
8198892Srdivacky//===----------------------------------------------------------------------===//
9198892Srdivacky//
10198892Srdivacky// This file implements the AntiDepBreaker class, which implements
11198892Srdivacky// anti-dependence breaking heuristics for post-register-allocation scheduling.
12198892Srdivacky//
13198892Srdivacky//===----------------------------------------------------------------------===//
14198892Srdivacky
15198892Srdivacky#ifndef LLVM_CODEGEN_ANTIDEPBREAKER_H
16198892Srdivacky#define LLVM_CODEGEN_ANTIDEPBREAKER_H
17198892Srdivacky
18198892Srdivacky#include "llvm/CodeGen/MachineBasicBlock.h"
19198892Srdivacky#include "llvm/CodeGen/MachineFrameInfo.h"
20198892Srdivacky#include "llvm/CodeGen/MachineFunction.h"
21198892Srdivacky#include "llvm/CodeGen/MachineRegisterInfo.h"
22198892Srdivacky#include "llvm/CodeGen/ScheduleDAG.h"
23198892Srdivacky#include "llvm/Target/TargetRegisterInfo.h"
24199989Srdivacky#include <vector>
25198892Srdivacky
26198892Srdivackynamespace llvm {
27198892Srdivacky
28198892Srdivacky/// AntiDepBreaker - This class works into conjunction with the
29198892Srdivacky/// post-RA scheduler to rename registers to break register
30198892Srdivacky/// anti-dependencies.
31198892Srdivackyclass AntiDepBreaker {
32198892Srdivackypublic:
33223017Sdim  typedef std::vector<std::pair<MachineInstr *, MachineInstr *> >
34223017Sdim    DbgValueVector;
35223017Sdim
36198892Srdivacky  virtual ~AntiDepBreaker();
37198892Srdivacky
38198892Srdivacky  /// Start - Initialize anti-dep breaking for a new basic block.
39198892Srdivacky  virtual void StartBlock(MachineBasicBlock *BB) =0;
40198892Srdivacky
41198892Srdivacky  /// BreakAntiDependencies - Identifiy anti-dependencies within a
42198892Srdivacky  /// basic-block region and break them by renaming registers. Return
43198892Srdivacky  /// the number of anti-dependencies broken.
44198892Srdivacky  ///
45207618Srdivacky  virtual unsigned BreakAntiDependencies(const std::vector<SUnit>& SUnits,
46223017Sdim                                         MachineBasicBlock::iterator Begin,
47223017Sdim                                         MachineBasicBlock::iterator End,
48223017Sdim                                         unsigned InsertPosIndex,
49223017Sdim                                         DbgValueVector &DbgValues) = 0;
50198892Srdivacky
51198892Srdivacky  /// Observe - Update liveness information to account for the current
52198892Srdivacky  /// instruction, which will not be scheduled.
53198892Srdivacky  ///
54198892Srdivacky  virtual void Observe(MachineInstr *MI, unsigned Count,
55198892Srdivacky                       unsigned InsertPosIndex) =0;
56198892Srdivacky
57198892Srdivacky  /// Finish - Finish anti-dep breaking for a basic block.
58198892Srdivacky  virtual void FinishBlock() =0;
59223017Sdim
60223017Sdim  /// UpdateDbgValue - Update DBG_VALUE if dependency breaker is updating
61223017Sdim  /// other machine instruction to use NewReg.
62223017Sdim  void UpdateDbgValue(MachineInstr *MI, unsigned OldReg, unsigned NewReg) {
63223017Sdim    assert (MI->isDebugValue() && "MI is not DBG_VALUE!");
64223017Sdim    if (MI && MI->getOperand(0).isReg() && MI->getOperand(0).getReg() == OldReg)
65223017Sdim      MI->getOperand(0).setReg(NewReg);
66223017Sdim  }
67198892Srdivacky};
68198892Srdivacky
69198892Srdivacky}
70198892Srdivacky
71198892Srdivacky#endif
72