diff options
author | Andrew Lenharth <andrewl@lenharth.org> | 2006-04-19 15:34:34 +0000 |
---|---|---|
committer | Andrew Lenharth <andrewl@lenharth.org> | 2006-04-19 15:34:34 +0000 |
commit | 02f9df3b7b872ea356306f8b1487c8af0700d08e (patch) | |
tree | 146e45e95ee35310ceaf3b5e9c696b216e407933 /llvm/lib/Analysis/DataStructure/DataStructure.cpp | |
parent | edf349aba6ad809d1c41d79d5eb10079cad69a6e (diff) | |
download | bcm5719-llvm-02f9df3b7b872ea356306f8b1487c8af0700d08e.tar.gz bcm5719-llvm-02f9df3b7b872ea356306f8b1487c8af0700d08e.zip |
Another simple case type merge case to try
llvm-svn: 27831
Diffstat (limited to 'llvm/lib/Analysis/DataStructure/DataStructure.cpp')
-rw-r--r-- | llvm/lib/Analysis/DataStructure/DataStructure.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/DataStructure/DataStructure.cpp b/llvm/lib/Analysis/DataStructure/DataStructure.cpp index 565a596b7cd..f6fca1fa961 100644 --- a/llvm/lib/Analysis/DataStructure/DataStructure.cpp +++ b/llvm/lib/Analysis/DataStructure/DataStructure.cpp @@ -532,6 +532,30 @@ bool DSNode::mergeTypeInfo(const Type *NewTy, unsigned Offset, return mergeTypeInfo(STy, 0); } + //Ty: struct { t1, t2, t3 ... tn} + //NewTy T offset x + //try merge with NewTy: struct : {t1, t2, T} if offset lands on a field in Ty + if (isa<StructType>(Ty)) { + DEBUG(std::cerr << "Ty: " << *Ty << "\nNewTy: " << *NewTy << "@" << Offset << "\n"); + unsigned O = 0; + const StructType *STy = cast<StructType>(Ty); + const StructLayout &SL = *TD.getStructLayout(STy); + unsigned i = SL.getElementContainingOffset(Offset); + //Either we hit it exactly or give up + if (SL.MemberOffsets[i] != Offset) { + if (FoldIfIncompatible) foldNodeCompletely(); + return true; + } + std::vector<const Type*> nt; + for (unsigned x = 0; x < i; ++x) + nt.push_back(STy->getElementType(x)); + nt.push_back(NewTy); + //and merge + STy = StructType::get(nt); + DEBUG(std::cerr << "Trying with: " << *STy << "\n"); + return mergeTypeInfo(STy, 0); + } + std::cerr << "UNIMP: Trying to merge a growth type into " << "offset != 0: Collapsing!\n"; abort(); |