Index: src/IceInst.h |
diff --git a/src/IceInst.h b/src/IceInst.h |
index fd0eeea9d76b6908bf8791c9f019ab25424b81ce..514af97b4ad309c501a0039672e0976482cfb169 100644 |
--- a/src/IceInst.h |
+++ b/src/IceInst.h |
@@ -57,9 +57,11 @@ public: |
InstKind getKind() const { return Kind; } |
int32_t getNumber() const { return Number; } |
+ void renumber(Cfg *Func); |
bool isDeleted() const { return Deleted; } |
void setDeleted() { Deleted = true; } |
+ void deleteIfDead(); |
bool hasSideEffects() const { return HasSideEffects; } |
@@ -71,6 +73,8 @@ public: |
return Srcs[I]; |
} |
+ bool isLastUse(const Operand *Src) const; |
+ |
// Returns a list of out-edges corresponding to a terminator |
// instruction, which is the last instruction of the block. |
virtual NodeList getTerminatorEdges() const { |
@@ -88,8 +92,12 @@ public: |
// basic blocks, i.e. used in a different block from their definition. |
void updateVars(CfgNode *Node); |
+ void livenessLightweight(llvm::BitVector &Live); |
+ void liveness(int32_t InstNumber, llvm::BitVector &Live, Liveness *Liveness, |
+ const CfgNode *Node); |
virtual void emit(const Cfg *Func) const; |
virtual void dump(const Cfg *Func) const; |
+ virtual void dumpExtras(const Cfg *Func) const; |
void dumpDecorated(const Cfg *Func) const; |
void emitSources(const Cfg *Func) const; |
void dumpSources(const Cfg *Func) const; |
@@ -105,6 +113,11 @@ protected: |
assert(NumSrcs < MaxSrcs); |
Srcs[NumSrcs++] = Src; |
} |
+ void setLastUse(SizeT VarIndex) { |
+ if (VarIndex < CHAR_BIT * sizeof(LiveRangesEnded)) |
+ LiveRangesEnded |= (((LREndedBits)1u) << VarIndex); |
+ } |
+ void resetLastUses() { LiveRangesEnded = 0; } |
// The destroy() method lets the instruction cleanly release any |
// memory that was allocated via the Cfg's allocator. |
virtual void destroy(Cfg *Func) { Func->deallocateArrayOf<Operand *>(Srcs); } |
@@ -114,6 +127,8 @@ protected: |
int32_t Number; |
// Deleted means irrevocably deleted. |
bool Deleted; |
+ // Dead means pending deletion after liveness analysis converges. |
+ bool Dead; |
// HasSideEffects means the instruction is something like a function |
// call or a volatile load that can't be removed even if its Dest |
// variable is not live. |
@@ -124,6 +139,18 @@ protected: |
SizeT NumSrcs; |
Operand **Srcs; |
+ // LiveRangesEnded marks which Variables' live ranges end in this |
+ // instruction. An instruction can have an arbitrary number of |
+ // source operands (e.g. a call instruction), and each source |
+ // operand can contain 0 or 1 Variable (and target-specific operands |
+ // could contain more than 1 Variable). All the variables in an |
+ // instruction are conceptually flattened and each variable is |
+ // mapped to one bit position of the LiveRangesEnded bit vector. |
+ // Only the first CHAR_BIT * sizeof(LREndedBits) variables are |
+ // tracked this way. |
+ typedef uint32_t LREndedBits; // only first 32 src operands tracked, sorry |
+ LREndedBits LiveRangesEnded; |
+ |
private: |
Inst(const Inst &) LLVM_DELETED_FUNCTION; |
Inst &operator=(const Inst &) LLVM_DELETED_FUNCTION; |
@@ -393,6 +420,8 @@ public: |
} |
void addArgument(Operand *Source, CfgNode *Label); |
Operand *getOperandForTarget(CfgNode *Target) const; |
+ void livenessPhiOperand(llvm::BitVector &Live, CfgNode *Target, |
+ Liveness *Liveness); |
Inst *lower(Cfg *Func, CfgNode *Node); |
virtual void dump(const Cfg *Func) const; |
static bool classof(const Inst *Inst) { return Inst->getKind() == Phi; } |
@@ -626,6 +655,7 @@ class InstTarget : public Inst { |
public: |
virtual void emit(const Cfg *Func) const = 0; |
virtual void dump(const Cfg *Func) const; |
+ virtual void dumpExtras(const Cfg *Func) const; |
static bool classof(const Inst *Inst) { return Inst->getKind() >= Target; } |
protected: |