Index: lib/Target/JSBackend/AllocaManager.h |
diff --git a/lib/Target/JSBackend/AllocaManager.h b/lib/Target/JSBackend/AllocaManager.h |
deleted file mode 100644 |
index f04ccfc66cb64a02fb9f33dd0598b093c2e575bb..0000000000000000000000000000000000000000 |
--- a/lib/Target/JSBackend/AllocaManager.h |
+++ /dev/null |
@@ -1,180 +0,0 @@ |
-//===-- AllocaManager.h ---------------------------------------------------===// |
-// |
-// The LLVM Compiler Infrastructure |
-// |
-// This file is distributed under the University of Illinois Open Source |
-// License. See LICENSE.TXT for details. |
-// |
-//===----------------------------------------------------------------------===// |
-// |
-// This pass declares the AllocaManager class. |
-// |
-//===----------------------------------------------------------------------===// |
- |
-#ifndef JSBACKEND_ALLOCAMANAGER_H |
-#define JSBACKEND_ALLOCAMANAGER_H |
- |
-#include "llvm/ADT/BitVector.h" |
-#include "llvm/ADT/DenseMap.h" |
-#include "llvm/ADT/SmallVector.h" |
-#include "llvm/ADT/SetVector.h" |
- |
-namespace llvm { |
- |
-class AllocaInst; |
-class BasicBlock; |
-class CallInst; |
-class DataLayout; |
-class Function; |
-class Value; |
- |
-/// Compute frame layout for allocas. |
-class AllocaManager { |
- const DataLayout *DL; |
- const Function *LifetimeStart; |
- const Function *LifetimeEnd; |
- const Function *F; |
- |
- // Per-block lifetime information. |
- struct BlockLifetimeInfo { |
- BitVector Start; |
- BitVector End; |
- BitVector LiveIn; |
- BitVector LiveOut; |
- }; |
- typedef DenseMap<const BasicBlock *, BlockLifetimeInfo> LivenessMap; |
- LivenessMap BlockLiveness; |
- |
- // Worklist for inter-block liveness analysis. |
- typedef SmallSetVector<const BasicBlock *, 8> InterBlockWorklistVec; |
- InterBlockWorklistVec InterBlockTopDownWorklist; |
- InterBlockWorklistVec InterBlockBottomUpWorklist; |
- |
- // Map allocas to their index in AllocasByIndex. |
- typedef DenseMap<const AllocaInst *, size_t> AllocaMap; |
- AllocaMap Allocas; |
- |
- // Information about an alloca. Note that the size and alignment may vary |
- // from what's in the actual AllocaInst when an alloca is also representing |
- // another with perhaps greater size and/or alignment needs. |
- // |
- // When an alloca is represented by another, its AllocaInfo is marked as |
- // "forwarded", at which point it no longer holds a size and alignment, but |
- // the index of the representative AllocaInfo. |
- class AllocaInfo { |
- const AllocaInst *Inst; |
- uint64_t Size; |
- unsigned Alignment; |
- |
- public: |
- AllocaInfo(const AllocaInst *I, uint64_t S, unsigned A) |
- : Inst(I), Size(S), Alignment(A) { |
- assert(I != NULL); |
- assert(A != 0); |
- assert(!isForwarded()); |
- } |
- |
- bool isForwarded() const { return Alignment == 0; } |
- |
- size_t getForwardedID() const { |
- assert(isForwarded()); |
- return static_cast<size_t>(Size); |
- } |
- |
- void forward(size_t i) { |
- assert(!isForwarded()); |
- Alignment = 0; |
- Size = i; |
- assert(isForwarded()); |
- assert(getForwardedID() == i); |
- } |
- |
- const AllocaInst *getInst() const { return Inst; } |
- |
- uint64_t getSize() const { assert(!isForwarded()); return Size; } |
- unsigned getAlignment() const { assert(!isForwarded()); return Alignment; } |
- |
- void mergeSize(uint64_t S) { |
- assert(!isForwarded()); |
- Size = std::max(Size, S); |
- assert(!isForwarded()); |
- } |
- void mergeAlignment(unsigned A) { |
- assert(A != 0); |
- assert(!isForwarded()); |
- Alignment = std::max(Alignment, A); |
- assert(!isForwarded()); |
- } |
- }; |
- typedef SmallVector<AllocaInfo, 32> AllocaVec; |
- AllocaVec AllocasByIndex; |
- |
- // For each alloca, which allocas can it safely represent? Allocas are |
- // identified by AllocasByIndex index. |
- // TODO: Vector-of-vectors isn't the fastest data structure possible here. |
- typedef SmallVector<BitVector, 32> AllocaCompatibilityVec; |
- AllocaCompatibilityVec AllocaCompatibility; |
- |
- // This is for allocas that will eventually be sorted. |
- SmallVector<AllocaInfo, 32> SortedAllocas; |
- |
- // Static allocation results. |
- struct StaticAllocation { |
- const AllocaInst *Representative; |
- uint64_t Offset; |
- StaticAllocation() {} |
- StaticAllocation(const AllocaInst *A, uint64_t O) |
- : Representative(A), Offset(O) {} |
- }; |
- typedef DenseMap<const AllocaInst *, StaticAllocation> StaticAllocaMap; |
- StaticAllocaMap StaticAllocas; |
- uint64_t FrameSize; |
- |
- uint64_t getSize(const AllocaInst *AI); |
- unsigned getAlignment(const AllocaInst *AI); |
- AllocaInfo getInfo(const AllocaInst *AI); |
- const Value *getPointerFromIntrinsic(const CallInst *CI); |
- const AllocaInst *isFavorableAlloca(const Value *V); |
- static int AllocaSort(const AllocaInfo *l, const AllocaInfo *r); |
- |
- void collectMarkedAllocas(); |
- void collectBlocks(); |
- void computeInterBlockLiveness(); |
- void computeIntraBlockLiveness(); |
- void computeRepresentatives(); |
- void computeFrameOffsets(); |
- |
- unsigned MaxAlignment; |
- |
-public: |
- AllocaManager(); |
- |
- /// Analyze the given function and prepare for getRepresentative queries. |
- void analyze(const Function &Func, const DataLayout &Layout, |
- bool PerformColoring); |
- |
- /// Reset all stored state. |
- void clear(); |
- |
- /// Return the representative alloca for the given alloca. When allocas are |
- /// merged, one is chosen as the representative to stand for the rest. |
- /// References to the alloca should take the form of references to the |
- /// representative. |
- const AllocaInst *getRepresentative(const AllocaInst *AI) const; |
- |
- /// Set *offset to the frame offset for the given alloca. Return true if the |
- /// given alloca is representative, meaning that it needs an explicit |
- /// definition in the function entry. Return false if some other alloca |
- /// represents this one. |
- bool getFrameOffset(const AllocaInst *AI, uint64_t *offset) const; |
- |
- /// Return the total frame size for all static allocas and associated padding. |
- uint64_t getFrameSize() const { return FrameSize; } |
- |
- /// Return the largest alignment seen. |
- unsigned getMaxAlignment() const { return MaxAlignment; } |
-}; |
- |
-} // namespace llvm |
- |
-#endif |