[llvm-commits] CVS: poolalloc/lib/PoolAllocate/PointerCompress.cpp
Chris Lattner
lattner at cs.uiuc.edu
Thu Feb 10 13:26:33 PST 2005
Changes in directory poolalloc/lib/PoolAllocate:
PointerCompress.cpp updated: 1.4 -> 1.5
---
Log message:
Add support for LOADING VALUES from a compressed data structure. Now we can
build AND read from our data structures. :)
---
Diffs of the changes: (+47 -1)
Index: poolalloc/lib/PoolAllocate/PointerCompress.cpp
diff -u poolalloc/lib/PoolAllocate/PointerCompress.cpp:1.4 poolalloc/lib/PoolAllocate/PointerCompress.cpp:1.5
--- poolalloc/lib/PoolAllocate/PointerCompress.cpp:1.4 Thu Feb 10 14:47:27 2005
+++ poolalloc/lib/PoolAllocate/PointerCompress.cpp Thu Feb 10 15:26:23 2005
@@ -268,7 +268,8 @@
/// getNodeIfCompressed - If the specified value is a pointer that will be
/// compressed, return the DSNode corresponding to the pool it belongs to.
const DSNode *getNodeIfCompressed(Value *V) {
- if (!isa<PointerType>(V->getType())) return false;
+ if (!isa<PointerType>(V->getType()) || isa<ConstantPointerNull>(V))
+ return false;
DSNode *N = DSG.getNodeForValue(V).getNode();
return PoolInfo.count(N) ? N : 0;
}
@@ -296,6 +297,7 @@
void visitCastInst(CastInst &CI);
void visitPHINode(PHINode &PN);
+ void visitLoadInst(LoadInst &LI);
void visitStoreInst(StoreInst &SI);
void visitCallInst(CallInst &CI);
@@ -362,6 +364,48 @@
setTransformedValue(PN, New);
}
+void InstructionRewriter::visitLoadInst(LoadInst &LI) {
+ if (isa<ConstantPointerNull>(LI.getOperand(0))) return; // load null ??
+
+ const CompressedPoolInfo *SrcPI = getPoolInfo(LI.getOperand(0));
+ if (SrcPI == 0) {
+ assert(getPoolInfo(&LI) == 0 &&
+ "Cannot load a compressed pointer from non-compressed memory!");
+ return;
+ }
+
+ // We care about two cases, here:
+ // 1. Loading a normal value from a ptr compressed data structure.
+ // 2. Loading a compressed ptr from a ptr compressed data structure.
+ bool LoadingCompressedPtr = getNodeIfCompressed(&LI) != 0;
+
+ // Get the pool base pointer.
+ Constant *Zero = Constant::getNullValue(Type::UIntTy);
+ Value *BasePtrPtr = new GetElementPtrInst(SrcPI->getPoolDesc(), Zero, Zero,
+ "poolbaseptrptr", &LI);
+ Value *BasePtr = new LoadInst(BasePtrPtr, "poolbaseptr", &LI);
+
+ // Get the pointer to load from.
+ std::vector<Value*> Ops;
+ Ops.push_back(getTransformedValue(LI.getOperand(0)));
+ Value *SrcPtr = new GetElementPtrInst(BasePtr, Ops,
+ LI.getOperand(0)->getName()+".pp", &LI);
+ const Type *DestTy = LoadingCompressedPtr ? Type::UIntTy : LI.getType();
+ SrcPtr = new CastInst(SrcPtr, PointerType::get(DestTy),
+ SrcPtr->getName(), &LI);
+ std::string OldName = LI.getName(); LI.setName("");
+ Value *NewLoad = new LoadInst(SrcPtr, OldName, &LI);
+
+ if (LoadingCompressedPtr) {
+ setTransformedValue(LI, NewLoad);
+ } else {
+ LI.replaceAllUsesWith(NewLoad);
+ LI.eraseFromParent();
+ }
+}
+
+
+
void InstructionRewriter::visitStoreInst(StoreInst &SI) {
const CompressedPoolInfo *DestPI = getPoolInfo(SI.getOperand(1));
if (DestPI == 0) {
@@ -391,6 +435,8 @@
Value *BasePtrPtr = new GetElementPtrInst(DestPI->getPoolDesc(), Zero, Zero,
"poolbaseptrptr", &SI);
Value *BasePtr = new LoadInst(BasePtrPtr, "poolbaseptr", &SI);
+
+ // Get the pointer to store to.
std::vector<Value*> Ops;
Ops.push_back(getTransformedValue(SI.getOperand(1)));
Value *DestPtr = new GetElementPtrInst(BasePtr, Ops,
More information about the llvm-commits
mailing list