mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
* Eliminate the LiveVarSet class, making applyTranferFuncForMInst a static
function in the one .cpp file that uses it. Use ValueSet's instead. * Prepare to delete LiveVarSet.h & LiveVarSet.cpp * Eliminate the ValueSet class, making all old member functions into global templates that will eventually be moved to Support. llvm-svn: 1711
This commit is contained in:
parent
a8170f0944
commit
dc3aec7a90
@ -68,19 +68,19 @@
|
||||
static const int DEBUG_LV = 0;
|
||||
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Analysis/LiveVar/ValueSet.h"
|
||||
class BBLiveVar;
|
||||
class MachineInstr;
|
||||
class LiveVarSet;
|
||||
|
||||
class MethodLiveVarInfo : public MethodPass {
|
||||
// A map between the BasicBlock and BBLiveVar
|
||||
std::map<const BasicBlock *, BBLiveVar *> BB2BBLVMap;
|
||||
|
||||
// Machine Instr to LiveVarSet Map for providing LVset BEFORE each inst
|
||||
std::map<const MachineInstr *, const LiveVarSet *> MInst2LVSetBI;
|
||||
std::map<const MachineInstr *, const ValueSet *> MInst2LVSetBI;
|
||||
|
||||
// Machine Instr to LiveVarSet Map for providing LVset AFTER each inst
|
||||
std::map<const MachineInstr *, const LiveVarSet *> MInst2LVSetAI;
|
||||
std::map<const MachineInstr *, const ValueSet *> MInst2LVSetAI;
|
||||
|
||||
|
||||
// --------- private methods -----------------------------------------
|
||||
@ -119,17 +119,17 @@ public:
|
||||
// --------- Functions to access analysis results -------------------
|
||||
|
||||
// gets OutSet of a BB
|
||||
const LiveVarSet *getOutSetOfBB(const BasicBlock *BB) const;
|
||||
const ValueSet *getOutSetOfBB(const BasicBlock *BB) const;
|
||||
|
||||
// gets InSet of a BB
|
||||
const LiveVarSet *getInSetOfBB(const BasicBlock *BB) const;
|
||||
const ValueSet *getInSetOfBB(const BasicBlock *BB) const;
|
||||
|
||||
// gets the Live var set BEFORE an instruction
|
||||
const LiveVarSet *getLiveVarSetBeforeMInst(const MachineInstr *MI,
|
||||
const ValueSet *getLiveVarSetBeforeMInst(const MachineInstr *MI,
|
||||
const BasicBlock *BB);
|
||||
|
||||
// gets the Live var set AFTER an instruction
|
||||
const LiveVarSet *getLiveVarSetAfterMInst(const MachineInstr *MI,
|
||||
const ValueSet *getLiveVarSetAfterMInst(const MachineInstr *MI,
|
||||
const BasicBlock *BB);
|
||||
};
|
||||
|
||||
|
@ -1,25 +0,0 @@
|
||||
/* Title: LiveVarSet.h -*- C++ -*-
|
||||
Author: Ruchira Sasanka
|
||||
Date: Jun 30, 01
|
||||
Purpose: Contains the class definition of LiveVarSet which is used for
|
||||
live variable analysis.
|
||||
*/
|
||||
|
||||
#ifndef LIVE_VAR_SET_H
|
||||
#define LIVE_VAR_SET_H
|
||||
|
||||
#include "llvm/Analysis/LiveVar/ValueSet.h"
|
||||
class MachineInstr;
|
||||
|
||||
struct LiveVarSet : public ValueSet {
|
||||
|
||||
// This function applies a machine instr to a live var set (accepts OutSet)
|
||||
// and makes necessary changes to it (produces InSet).
|
||||
//
|
||||
void applyTranferFuncForMInst(const MachineInstr *MInst);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1,10 +1,3 @@
|
||||
/* Title: ValueSet.h -*- C++ -*-
|
||||
Author: Ruchira Sasanka
|
||||
Date: Jun 30, 01
|
||||
Purpose: Contains a mathematical set of Values. LiveVarSet is derived from
|
||||
this. Contains both class and method definitions.
|
||||
*/
|
||||
|
||||
#ifndef VALUE_SET_H
|
||||
#define VALUE_SET_H
|
||||
|
||||
@ -20,15 +13,42 @@ struct RAV { // Register Allocator Value
|
||||
ostream &operator<<(ostream &out, RAV Val);
|
||||
|
||||
|
||||
//------------------- Class Definition for ValueSet --------------------------
|
||||
typedef std::set<const Value*> ValueSet;
|
||||
void printSet(const ValueSet &S);
|
||||
|
||||
struct ValueSet : public std::set<const Value*> {
|
||||
bool setUnion( const ValueSet *const set1); // for performing set union
|
||||
void setSubtract( const ValueSet *const set1); // for performing set diff
|
||||
|
||||
void setDifference( const ValueSet *const set1, const ValueSet *const set2);
|
||||
// set_union(A, B) - Compute A := A u B, return whether A changed.
|
||||
//
|
||||
template <class E>
|
||||
bool set_union(std::set<E> &S1, const std::set<E> &S2) {
|
||||
bool Changed = false;
|
||||
|
||||
void printSet() const; // for printing a live variable set
|
||||
};
|
||||
for (std::set<E>::const_iterator SI = S2.begin(), SE = S2.end();
|
||||
SI != SE; ++SI)
|
||||
if (S1.insert(*SI).second)
|
||||
Changed = true;
|
||||
|
||||
return Changed;
|
||||
}
|
||||
|
||||
// set_difference(A, B) - Return A - B
|
||||
//
|
||||
template <class E>
|
||||
std::set<E> set_difference(const std::set<E> &S1, const std::set<E> &S2) {
|
||||
std::set<E> Result;
|
||||
for (std::set<E>::const_iterator SI = S1.begin(), SE = S1.end();
|
||||
SI != SE; ++SI)
|
||||
if (S2.find(*SI) == S2.end()) // if the element is not in set2
|
||||
Result.insert(*SI);
|
||||
return Result;
|
||||
}
|
||||
|
||||
// set_subtract(A, B) - Compute A := A - B
|
||||
//
|
||||
template <class E>
|
||||
void set_subtract(std::set<E> &S1, const std::set<E> &S2) {
|
||||
for (std::set<E>::const_iterator SI = S2.begin() ; SI != S2.end(); ++SI)
|
||||
S1.erase(*SI);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -68,19 +68,19 @@
|
||||
static const int DEBUG_LV = 0;
|
||||
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Analysis/LiveVar/ValueSet.h"
|
||||
class BBLiveVar;
|
||||
class MachineInstr;
|
||||
class LiveVarSet;
|
||||
|
||||
class MethodLiveVarInfo : public MethodPass {
|
||||
// A map between the BasicBlock and BBLiveVar
|
||||
std::map<const BasicBlock *, BBLiveVar *> BB2BBLVMap;
|
||||
|
||||
// Machine Instr to LiveVarSet Map for providing LVset BEFORE each inst
|
||||
std::map<const MachineInstr *, const LiveVarSet *> MInst2LVSetBI;
|
||||
std::map<const MachineInstr *, const ValueSet *> MInst2LVSetBI;
|
||||
|
||||
// Machine Instr to LiveVarSet Map for providing LVset AFTER each inst
|
||||
std::map<const MachineInstr *, const LiveVarSet *> MInst2LVSetAI;
|
||||
std::map<const MachineInstr *, const ValueSet *> MInst2LVSetAI;
|
||||
|
||||
|
||||
// --------- private methods -----------------------------------------
|
||||
@ -119,17 +119,17 @@ public:
|
||||
// --------- Functions to access analysis results -------------------
|
||||
|
||||
// gets OutSet of a BB
|
||||
const LiveVarSet *getOutSetOfBB(const BasicBlock *BB) const;
|
||||
const ValueSet *getOutSetOfBB(const BasicBlock *BB) const;
|
||||
|
||||
// gets InSet of a BB
|
||||
const LiveVarSet *getInSetOfBB(const BasicBlock *BB) const;
|
||||
const ValueSet *getInSetOfBB(const BasicBlock *BB) const;
|
||||
|
||||
// gets the Live var set BEFORE an instruction
|
||||
const LiveVarSet *getLiveVarSetBeforeMInst(const MachineInstr *MI,
|
||||
const ValueSet *getLiveVarSetBeforeMInst(const MachineInstr *MI,
|
||||
const BasicBlock *BB);
|
||||
|
||||
// gets the Live var set AFTER an instruction
|
||||
const LiveVarSet *getLiveVarSetAfterMInst(const MachineInstr *MI,
|
||||
const ValueSet *getLiveVarSetAfterMInst(const MachineInstr *MI,
|
||||
const BasicBlock *BB);
|
||||
};
|
||||
|
||||
|
@ -1,10 +1,3 @@
|
||||
/* Title: ValueSet.h -*- C++ -*-
|
||||
Author: Ruchira Sasanka
|
||||
Date: Jun 30, 01
|
||||
Purpose: Contains a mathematical set of Values. LiveVarSet is derived from
|
||||
this. Contains both class and method definitions.
|
||||
*/
|
||||
|
||||
#ifndef VALUE_SET_H
|
||||
#define VALUE_SET_H
|
||||
|
||||
@ -20,15 +13,42 @@ struct RAV { // Register Allocator Value
|
||||
ostream &operator<<(ostream &out, RAV Val);
|
||||
|
||||
|
||||
//------------------- Class Definition for ValueSet --------------------------
|
||||
typedef std::set<const Value*> ValueSet;
|
||||
void printSet(const ValueSet &S);
|
||||
|
||||
struct ValueSet : public std::set<const Value*> {
|
||||
bool setUnion( const ValueSet *const set1); // for performing set union
|
||||
void setSubtract( const ValueSet *const set1); // for performing set diff
|
||||
|
||||
void setDifference( const ValueSet *const set1, const ValueSet *const set2);
|
||||
// set_union(A, B) - Compute A := A u B, return whether A changed.
|
||||
//
|
||||
template <class E>
|
||||
bool set_union(std::set<E> &S1, const std::set<E> &S2) {
|
||||
bool Changed = false;
|
||||
|
||||
void printSet() const; // for printing a live variable set
|
||||
};
|
||||
for (std::set<E>::const_iterator SI = S2.begin(), SE = S2.end();
|
||||
SI != SE; ++SI)
|
||||
if (S1.insert(*SI).second)
|
||||
Changed = true;
|
||||
|
||||
return Changed;
|
||||
}
|
||||
|
||||
// set_difference(A, B) - Return A - B
|
||||
//
|
||||
template <class E>
|
||||
std::set<E> set_difference(const std::set<E> &S1, const std::set<E> &S2) {
|
||||
std::set<E> Result;
|
||||
for (std::set<E>::const_iterator SI = S1.begin(), SE = S1.end();
|
||||
SI != SE; ++SI)
|
||||
if (S2.find(*SI) == S2.end()) // if the element is not in set2
|
||||
Result.insert(*SI);
|
||||
return Result;
|
||||
}
|
||||
|
||||
// set_subtract(A, B) - Compute A := A - B
|
||||
//
|
||||
template <class E>
|
||||
void set_subtract(std::set<E> &S1, const std::set<E> &S2) {
|
||||
for (std::set<E>::const_iterator SI = S2.begin() ; SI != S2.end(); ++SI)
|
||||
S1.erase(*SI);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -126,9 +126,8 @@ bool BBLiveVar::applyTransferFunc() {
|
||||
// IMPORTANT: caller should check whether the OutSet changed
|
||||
// (else no point in calling)
|
||||
|
||||
LiveVarSet OutMinusDef; // set to hold (Out[B] - Def[B])
|
||||
OutMinusDef.setDifference(&OutSet, &DefSet);
|
||||
InSetChanged = InSet.setUnion(&OutMinusDef);
|
||||
ValueSet OutMinusDef = set_difference(OutSet, DefSet);
|
||||
InSetChanged = set_union(InSet, OutMinusDef);
|
||||
|
||||
OutSetChanged = false; // no change to OutSet since transf func applied
|
||||
return InSetChanged;
|
||||
@ -139,12 +138,12 @@ bool BBLiveVar::applyTransferFunc() {
|
||||
// calculates Out set using In sets of the predecessors
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
bool BBLiveVar::setPropagate(LiveVarSet *OutSet, const LiveVarSet *InSet,
|
||||
bool BBLiveVar::setPropagate(ValueSet *OutSet, const ValueSet *InSet,
|
||||
const BasicBlock *PredBB) {
|
||||
bool Changed = false;
|
||||
|
||||
// for all all elements in InSet
|
||||
for (LiveVarSet::const_iterator InIt = InSet->begin(), InE = InSet->end();
|
||||
for (ValueSet::const_iterator InIt = InSet->begin(), InE = InSet->end();
|
||||
InIt != InE; ++InIt) {
|
||||
const BasicBlock *PredBBOfPhiArg = PhiArgMap[*InIt];
|
||||
|
||||
@ -194,14 +193,14 @@ bool BBLiveVar::applyFlowFunc(std::map<const BasicBlock *, BBLiveVar *> &LVMap){
|
||||
// ----------------- Methods For Debugging (Printing) -----------------
|
||||
|
||||
void BBLiveVar::printAllSets() const {
|
||||
cerr << " Defs: "; DefSet.printSet(); cerr << "\n";
|
||||
cerr << " In: "; InSet.printSet(); cerr << "\n";
|
||||
cerr << " Out: "; OutSet.printSet(); cerr << "\n";
|
||||
cerr << " Defs: "; printSet(DefSet); cerr << "\n";
|
||||
cerr << " In: "; printSet(InSet); cerr << "\n";
|
||||
cerr << " Out: "; printSet(OutSet); cerr << "\n";
|
||||
}
|
||||
|
||||
void BBLiveVar::printInOutSets() const {
|
||||
cerr << " In: "; InSet.printSet(); cerr << "\n";
|
||||
cerr << " Out: "; OutSet.printSet(); cerr << "\n";
|
||||
cerr << " In: "; printSet(InSet); cerr << "\n";
|
||||
cerr << " Out: "; printSet(OutSet); cerr << "\n";
|
||||
}
|
||||
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
#ifndef LIVE_VAR_BB_H
|
||||
#define LIVE_VAR_BB_H
|
||||
|
||||
#include "llvm/Analysis/LiveVar/LiveVarSet.h"
|
||||
#include "llvm/Analysis/LiveVar/ValueSet.h"
|
||||
#include <map>
|
||||
class Method;
|
||||
class BasicBlock;
|
||||
@ -17,8 +17,8 @@ class BBLiveVar {
|
||||
const BasicBlock *BB; // pointer to BasicBlock
|
||||
unsigned POID; // Post-Order ID
|
||||
|
||||
LiveVarSet DefSet; // Def set for LV analysis
|
||||
LiveVarSet InSet, OutSet; // In & Out for LV analysis
|
||||
ValueSet DefSet; // Def set for LV analysis
|
||||
ValueSet InSet, OutSet; // In & Out for LV analysis
|
||||
bool InSetChanged, OutSetChanged; // set if the InSet/OutSet is modified
|
||||
|
||||
// map that contains phi args->BB they came
|
||||
@ -26,8 +26,8 @@ class BBLiveVar {
|
||||
std::map<const Value *, const BasicBlock *> PhiArgMap;
|
||||
|
||||
// method to propogate an InSet to OutSet of a predecessor
|
||||
bool setPropagate(LiveVarSet *OutSetOfPred,
|
||||
const LiveVarSet *InSetOfThisBB,
|
||||
bool setPropagate(ValueSet *OutSetOfPred,
|
||||
const ValueSet *InSetOfThisBB,
|
||||
const BasicBlock *PredBB);
|
||||
|
||||
// To add an operand which is a def
|
||||
@ -50,8 +50,8 @@ class BBLiveVar {
|
||||
// calculates Out set using In sets of the predecessors
|
||||
bool applyFlowFunc(std::map<const BasicBlock *, BBLiveVar *> &LVMap);
|
||||
|
||||
inline const LiveVarSet *getOutSet() const { return &OutSet; }
|
||||
inline const LiveVarSet *getInSet() const { return &InSet; }
|
||||
inline const ValueSet *getOutSet() const { return &OutSet; }
|
||||
inline const ValueSet *getInSet() const { return &InSet; }
|
||||
|
||||
void printAllSets() const; // for printing Def/In/Out sets
|
||||
void printInOutSets() const; // for printing In/Out sets
|
||||
|
@ -1,13 +1,9 @@
|
||||
/* Title: MethodLiveVarInfo.cpp
|
||||
Author: Ruchira Sasanka
|
||||
Date: Jun 30, 01
|
||||
Purpose:
|
||||
|
||||
This is the interface for live variable info of a method that is required
|
||||
by any other part of the compiler.
|
||||
|
||||
*/
|
||||
|
||||
//===-- MethodLiveVarInfo.cpp - Live Variable Analysis for a Method -------===//
|
||||
//
|
||||
// This is the interface to method level live variable information that is
|
||||
// provided by live variable analysis.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
|
||||
#include "BBLiveVar.h"
|
||||
@ -23,12 +19,12 @@ AnalysisID MethodLiveVarInfo::ID(AnalysisID::create<MethodLiveVarInfo>());
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
// gets OutSet of a BB
|
||||
const LiveVarSet *MethodLiveVarInfo::getOutSetOfBB(const BasicBlock *BB) const {
|
||||
const ValueSet *MethodLiveVarInfo::getOutSetOfBB(const BasicBlock *BB) const {
|
||||
return BB2BBLVMap.find(BB)->second->getOutSet();
|
||||
}
|
||||
|
||||
// gets InSet of a BB
|
||||
const LiveVarSet *MethodLiveVarInfo::getInSetOfBB(const BasicBlock *BB) const {
|
||||
const ValueSet *MethodLiveVarInfo::getInSetOfBB(const BasicBlock *BB) const {
|
||||
return BB2BBLVMap.find(BB)->second->getInSet();
|
||||
}
|
||||
|
||||
@ -125,16 +121,16 @@ void MethodLiveVarInfo::releaseMemory() {
|
||||
|
||||
BB2BBLVMap.clear();
|
||||
|
||||
// Then delete all objects of type LiveVarSet created in calcLiveVarSetsForBB
|
||||
// Then delete all objects of type ValueSet created in calcLiveVarSetsForBB
|
||||
// and entered into MInst2LVSetBI and MInst2LVSetAI (these are caches
|
||||
// to return LiveVarSet's before/after a machine instruction quickly). It
|
||||
// is sufficient to free up all LiveVarSet using only one cache since
|
||||
// to return ValueSet's before/after a machine instruction quickly). It
|
||||
// is sufficient to free up all ValueSet using only one cache since
|
||||
// both caches refer to the same sets
|
||||
//
|
||||
for (std::map<const MachineInstr*, const LiveVarSet*>::iterator
|
||||
for (std::map<const MachineInstr*, const ValueSet*>::iterator
|
||||
MI = MInst2LVSetBI.begin(),
|
||||
ME = MInst2LVSetBI.end(); MI != ME; ++MI)
|
||||
delete MI->second; // delete all LiveVarSets in MInst2LVSetBI
|
||||
delete MI->second; // delete all ValueSets in MInst2LVSetBI
|
||||
|
||||
MInst2LVSetBI.clear();
|
||||
MInst2LVSetAI.clear();
|
||||
@ -158,10 +154,10 @@ void MethodLiveVarInfo::releaseMemory() {
|
||||
// Gives live variable information before a machine instruction
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
const LiveVarSet *
|
||||
const ValueSet *
|
||||
MethodLiveVarInfo::getLiveVarSetBeforeMInst(const MachineInstr *MInst,
|
||||
const BasicBlock *BB) {
|
||||
if (const LiveVarSet *LVSet = MInst2LVSetBI[MInst]) {
|
||||
if (const ValueSet *LVSet = MInst2LVSetBI[MInst]) {
|
||||
return LVSet; // if found, just return the set
|
||||
} else {
|
||||
calcLiveVarSetsForBB(BB); // else, calc for all instrs in BB
|
||||
@ -173,11 +169,11 @@ MethodLiveVarInfo::getLiveVarSetBeforeMInst(const MachineInstr *MInst,
|
||||
//-----------------------------------------------------------------------------
|
||||
// Gives live variable information after a machine instruction
|
||||
//-----------------------------------------------------------------------------
|
||||
const LiveVarSet *
|
||||
const ValueSet *
|
||||
MethodLiveVarInfo::getLiveVarSetAfterMInst(const MachineInstr *MI,
|
||||
const BasicBlock *BB) {
|
||||
|
||||
if (const LiveVarSet *LVSet = MInst2LVSetAI[MI]) {
|
||||
if (const ValueSet *LVSet = MInst2LVSetAI[MI]) {
|
||||
return LVSet; // if found, just return the set
|
||||
} else {
|
||||
calcLiveVarSetsForBB(BB); // else, calc for all instrs in BB
|
||||
@ -185,7 +181,37 @@ MethodLiveVarInfo::getLiveVarSetAfterMInst(const MachineInstr *MI,
|
||||
}
|
||||
}
|
||||
|
||||
// This function applies a machine instr to a live var set (accepts OutSet) and
|
||||
// makes necessary changes to it (produces InSet). Note that two for loops are
|
||||
// used to first kill all defs and then to add all uses. This is because there
|
||||
// can be instructions like Val = Val + 1 since we allow multipe defs to a
|
||||
// machine instruction operand.
|
||||
//
|
||||
static void applyTranferFuncForMInst(ValueSet &LVS, const MachineInstr *MInst) {
|
||||
for (MachineInstr::val_const_op_iterator OpI(MInst); !OpI.done(); ++OpI) {
|
||||
if (OpI.isDef()) // kill only if this operand is a def
|
||||
LVS.insert(*OpI); // this definition kills any uses
|
||||
}
|
||||
|
||||
// do for implicit operands as well
|
||||
for (unsigned i=0; i < MInst->getNumImplicitRefs(); ++i) {
|
||||
if (MInst->implicitRefIsDefined(i))
|
||||
LVS.erase(MInst->getImplicitRef(i));
|
||||
}
|
||||
|
||||
for (MachineInstr::val_const_op_iterator OpI(MInst); !OpI.done(); ++OpI) {
|
||||
if (isa<BasicBlock>(*OpI)) continue; // don't process labels
|
||||
|
||||
if (!OpI.isDef()) // add only if this operand is a use
|
||||
LVS.insert(*OpI); // An operand is a use - so add to use set
|
||||
}
|
||||
|
||||
// do for implicit operands as well
|
||||
for (unsigned i=0; i < MInst->getNumImplicitRefs(); ++i) {
|
||||
if (!MInst->implicitRefIsDefined(i))
|
||||
LVS.insert(MInst->getImplicitRef(i));
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// This method calculates the live variable information for all the
|
||||
@ -196,9 +222,9 @@ MethodLiveVarInfo::getLiveVarSetAfterMInst(const MachineInstr *MI,
|
||||
void MethodLiveVarInfo::calcLiveVarSetsForBB(const BasicBlock *BB) {
|
||||
const MachineCodeForBasicBlock &MIVec = BB->getMachineInstrVec();
|
||||
|
||||
LiveVarSet *CurSet = new LiveVarSet();
|
||||
const LiveVarSet *SetAI = getOutSetOfBB(BB); // init SetAI with OutSet
|
||||
CurSet->setUnion(SetAI); // CurSet now contains OutSet
|
||||
ValueSet *CurSet = new ValueSet();
|
||||
const ValueSet *SetAI = getOutSetOfBB(BB); // init SetAI with OutSet
|
||||
set_union(*CurSet, *SetAI); // CurSet now contains OutSet
|
||||
|
||||
// iterate over all the machine instructions in BB
|
||||
for (MachineCodeForBasicBlock::const_reverse_iterator MII = MIVec.rbegin(),
|
||||
@ -208,9 +234,9 @@ void MethodLiveVarInfo::calcLiveVarSetsForBB(const BasicBlock *BB) {
|
||||
|
||||
MInst2LVSetAI[MI] = SetAI; // record in After Inst map
|
||||
|
||||
CurSet->applyTranferFuncForMInst(MI); // apply the transfer Func
|
||||
LiveVarSet *NewSet = new LiveVarSet(); // create a new set and
|
||||
NewSet->setUnion(CurSet); // copy the set after T/F to it
|
||||
applyTranferFuncForMInst(*CurSet, MI); // apply the transfer Func
|
||||
ValueSet *NewSet = new ValueSet(); // create a new set and
|
||||
set_union(*NewSet, *CurSet); // copy the set after T/F to it
|
||||
|
||||
MInst2LVSetBI[MI] = NewSet; // record in Before Inst map
|
||||
|
||||
|
@ -1,37 +0,0 @@
|
||||
#include "llvm/Analysis/LiveVar/LiveVarSet.h"
|
||||
#include "llvm/CodeGen/MachineInstr.h"
|
||||
#include "llvm/Type.h"
|
||||
|
||||
// This function applies a machine instr to a live var set (accepts OutSet) and
|
||||
// makes necessary changes to it (produces InSet). Note that two for loops are
|
||||
// used to first kill all defs and then to add all uses. This is because there
|
||||
// can be instructions like Val = Val + 1 since we allow multipe defs to a
|
||||
// machine instruction operand.
|
||||
|
||||
|
||||
void LiveVarSet::applyTranferFuncForMInst(const MachineInstr *MInst) {
|
||||
for (MachineInstr::val_const_op_iterator OpI(MInst); !OpI.done(); ++OpI) {
|
||||
if (OpI.isDef()) // kill only if this operand is a def
|
||||
insert(*OpI); // this definition kills any uses
|
||||
}
|
||||
|
||||
// do for implicit operands as well
|
||||
for ( unsigned i=0; i < MInst->getNumImplicitRefs(); ++i) {
|
||||
if (MInst->implicitRefIsDefined(i))
|
||||
erase(MInst->getImplicitRef(i));
|
||||
}
|
||||
|
||||
|
||||
for (MachineInstr::val_const_op_iterator OpI(MInst); !OpI.done(); ++OpI) {
|
||||
if ((*OpI)->getType()->isLabelType()) continue; // don't process labels
|
||||
|
||||
if (!OpI.isDef()) // add only if this operand is a use
|
||||
insert(*OpI); // An operand is a use - so add to use set
|
||||
}
|
||||
|
||||
// do for implicit operands as well
|
||||
for (unsigned i=0; i < MInst->getNumImplicitRefs(); ++i) {
|
||||
if (!MInst->implicitRefIsDefined(i))
|
||||
insert(MInst->getImplicitRef(i));
|
||||
}
|
||||
}
|
@ -15,28 +15,8 @@ ostream &operator<<(ostream &O, RAV V) { // func to print a Value
|
||||
return O << v << " ";
|
||||
}
|
||||
|
||||
bool ValueSet::setUnion( const ValueSet *S) {
|
||||
bool Changed = false;
|
||||
|
||||
for (const_iterator SI = S->begin(), SE = S->end(); SI != SE; ++SI)
|
||||
if (insert(*SI).second)
|
||||
Changed = true;
|
||||
|
||||
return Changed;
|
||||
}
|
||||
|
||||
void ValueSet::setDifference(const ValueSet *S1, const ValueSet *S2) {
|
||||
for (const_iterator SI = S1->begin(), SE = S1->end() ; SI != SE; ++SI)
|
||||
if (S2->find(*SI) == S2->end()) // if the element is not in set2
|
||||
insert(*SI);
|
||||
}
|
||||
|
||||
void ValueSet::setSubtract(const ValueSet *S) {
|
||||
for (const_iterator SI = S->begin() ; SI != S->end(); ++SI)
|
||||
erase(*SI);
|
||||
}
|
||||
|
||||
void ValueSet::printSet() const {
|
||||
for (const_iterator I = begin(), E = end(); I != E; ++I)
|
||||
void printSet(const ValueSet &S) {
|
||||
for (ValueSet::const_iterator I = S.begin(), E = S.end(); I != E; ++I)
|
||||
std::cerr << RAV(*I);
|
||||
}
|
||||
|
||||
|
@ -39,7 +39,6 @@ cl::Enum<enum SchedDebugLevel_t> SchedDebugLevel("dsched", cl::NoFlags,
|
||||
|
||||
class InstrSchedule;
|
||||
class SchedulingManager;
|
||||
class DelaySlotInfo;
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
#include "SchedPriorities.h"
|
||||
#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
|
||||
#include "llvm/Analysis/LiveVar/LiveVarSet.h"
|
||||
#include "llvm/Analysis/LiveVar/ValueSet.h"
|
||||
#include "Support/PostOrderIterator.h"
|
||||
#include <iostream>
|
||||
using std::cerr;
|
||||
@ -265,8 +265,7 @@ SchedPriorities::findSetWithMaxDelay(std::vector<candIndex>& mcands,
|
||||
|
||||
bool
|
||||
SchedPriorities::instructionHasLastUse(MethodLiveVarInfo& methodLiveVarInfo,
|
||||
const SchedGraphNode* graphNode)
|
||||
{
|
||||
const SchedGraphNode* graphNode) {
|
||||
const MachineInstr* minstr = graphNode->getMachineInstr();
|
||||
|
||||
std::hash_map<const MachineInstr*, bool>::const_iterator
|
||||
@ -277,12 +276,11 @@ SchedPriorities::instructionHasLastUse(MethodLiveVarInfo& methodLiveVarInfo,
|
||||
// else check if instruction is a last use and save it in the hash_map
|
||||
bool hasLastUse = false;
|
||||
const BasicBlock* bb = graphNode->getBB();
|
||||
const LiveVarSet* liveVars =
|
||||
const ValueSet *liveVars =
|
||||
methodLiveVarInfo.getLiveVarSetBeforeMInst(minstr, bb);
|
||||
|
||||
for (MachineInstr::val_const_op_iterator vo(minstr); ! vo.done(); ++vo)
|
||||
if (liveVars->find(*vo) == liveVars->end())
|
||||
{
|
||||
if (liveVars->find(*vo) == liveVars->end()) {
|
||||
hasLastUse = true;
|
||||
break;
|
||||
}
|
||||
|
@ -20,10 +20,10 @@
|
||||
#define LIVE_RANGE_INFO_H
|
||||
|
||||
#include "Support/HashExtras.h"
|
||||
#include "llvm/Analysis/LiveVar/ValueSet.h"
|
||||
|
||||
class LiveRange;
|
||||
class MachineInstr;
|
||||
class LiveVarSet;
|
||||
class RegClass;
|
||||
class MachineRegInfo;
|
||||
class TargetMachine;
|
||||
@ -60,17 +60,15 @@ class LiveRangeInfo {
|
||||
|
||||
void unionAndUpdateLRs(LiveRange *L1, LiveRange *L2);
|
||||
|
||||
void addInterference(const Instruction *const Inst,
|
||||
const LiveVarSet *const LVSet);
|
||||
void addInterference(const Instruction *Inst, const ValueSet *LVSet);
|
||||
|
||||
void suggestRegs4CallRets();
|
||||
|
||||
const Method* getMethod() { return Meth; }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
LiveRangeInfo(const Method *const M,
|
||||
LiveRangeInfo(const Method *M,
|
||||
const TargetMachine& tm,
|
||||
std::vector<RegClass *> & RCList);
|
||||
|
||||
|
@ -98,15 +98,15 @@ private:
|
||||
|
||||
//------- ------------------ private methods---------------------------------
|
||||
|
||||
void addInterference(const Value *const Def, const LiveVarSet *const LVSet,
|
||||
const bool isCallInst);
|
||||
void addInterference(const Value *Def, const ValueSet *LVSet,
|
||||
bool isCallInst);
|
||||
|
||||
void addInterferencesForArgs();
|
||||
void createIGNodeListsAndIGs();
|
||||
void buildInterferenceGraphs();
|
||||
|
||||
void setCallInterferences(const MachineInstr *MInst,
|
||||
const LiveVarSet *const LVSetAft );
|
||||
const ValueSet *LVSetAft );
|
||||
|
||||
void move2DelayedInstr(const MachineInstr *OrigMI,
|
||||
const MachineInstr *DelayedMI );
|
||||
@ -131,13 +131,13 @@ private:
|
||||
friend class UltraSparcRegInfo;
|
||||
|
||||
|
||||
int getUsableUniRegAtMI(RegClass *RC, const int RegType,
|
||||
int getUsableUniRegAtMI(RegClass *RC, int RegType,
|
||||
const MachineInstr *MInst,
|
||||
const LiveVarSet *LVSetBef, MachineInstr *MIBef,
|
||||
const ValueSet *LVSetBef, MachineInstr *MIBef,
|
||||
MachineInstr *MIAft );
|
||||
|
||||
int getUnusedUniRegAtMI(RegClass *RC, const MachineInstr *MInst,
|
||||
const LiveVarSet *LVSetBef);
|
||||
const ValueSet *LVSetBef);
|
||||
|
||||
void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
|
||||
int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
|
||||
|
Loading…
x
Reference in New Issue
Block a user