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