X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FCodeGen%2FAntiDepBreaker.h;h=9f05200dcdf34acf9ae993a10882aa5bb99cd3d9;hp=b614f687a4629cdf344026c26cc393d82e9e0065;hb=dd65ba2dbe6a8cb0fb15818193d011ccd20263a0;hpb=6ac0e76ff4b8e46e45720e3422d43d33d73f4aae diff --git a/lib/CodeGen/AntiDepBreaker.h b/lib/CodeGen/AntiDepBreaker.h index b614f687a46..9f05200dcdf 100644 --- a/lib/CodeGen/AntiDepBreaker.h +++ b/lib/CodeGen/AntiDepBreaker.h @@ -12,8 +12,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CODEGEN_ANTIDEPBREAKER_H -#define LLVM_CODEGEN_ANTIDEPBREAKER_H +#ifndef LLVM_LIB_CODEGEN_ANTIDEPBREAKER_H +#define LLVM_LIB_CODEGEN_ANTIDEPBREAKER_H #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFrameInfo.h" @@ -21,52 +21,45 @@ #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/ScheduleDAG.h" #include "llvm/Target/TargetRegisterInfo.h" -#include "llvm/ADT/SmallSet.h" -#include "llvm/ADT/SmallVector.h" -#include +#include namespace llvm { -/// AntiDepBreaker - This class works into conjunction with the -/// post-RA scheduler to rename registers to break register -/// anti-dependencies. -class AntiDepBreaker { +/// This class works in conjunction with the post-RA scheduler to rename +/// registers to break register anti-dependencies (WAR hazards). +class LLVM_LIBRARY_VISIBILITY AntiDepBreaker { public: - typedef SmallSet AntiDepRegSet; - typedef SmallVector AntiDepRegVector; - typedef std::map CandidateMap; + typedef std::vector > + DbgValueVector; virtual ~AntiDepBreaker(); - /// GetMaxTrials - Return the maximum number of anti-dependence - /// breaking attempts that will be made for a block. - virtual unsigned GetMaxTrials() =0; - - /// NeedCandidates - Return true if the schedule must provide - /// candidates with BreakAntiDependencies(). - virtual bool NeedCandidates() =0; - - /// Start - Initialize anti-dep breaking for a new basic block. + /// Initialize anti-dep breaking for a new basic block. virtual void StartBlock(MachineBasicBlock *BB) =0; - /// BreakAntiDependencies - Identifiy anti-dependencies within a - /// basic-block region and break them by renaming registers. Return - /// the number of anti-dependencies broken. - /// - virtual unsigned BreakAntiDependencies(std::vector& SUnits, - CandidateMap& Candidates, - MachineBasicBlock::iterator& Begin, - MachineBasicBlock::iterator& End, - unsigned InsertPosIndex) =0; + /// Identifiy anti-dependencies within a basic-block region and break them by + /// renaming registers. Return the number of anti-dependencies broken. + virtual unsigned BreakAntiDependencies(const std::vector& SUnits, + MachineBasicBlock::iterator Begin, + MachineBasicBlock::iterator End, + unsigned InsertPosIndex, + DbgValueVector &DbgValues) = 0; - /// Observe - Update liveness information to account for the current + /// Update liveness information to account for the current /// instruction, which will not be scheduled. - /// virtual void Observe(MachineInstr *MI, unsigned Count, unsigned InsertPosIndex) =0; - /// Finish - Finish anti-dep breaking for a basic block. + /// Finish anti-dep breaking for a basic block. virtual void FinishBlock() =0; + + /// Update DBG_VALUE if dependency breaker is updating + /// other machine instruction to use NewReg. + void UpdateDbgValue(MachineInstr *MI, unsigned OldReg, unsigned NewReg) { + assert (MI->isDebugValue() && "MI is not DBG_VALUE!"); + if (MI && MI->getOperand(0).isReg() && MI->getOperand(0).getReg() == OldReg) + MI->getOperand(0).setReg(NewReg); + } }; }