diff options
| author | Brian Gaeke <gaeke@uiuc.edu> | 2004-07-06 18:15:39 +0000 |
|---|---|---|
| committer | Brian Gaeke <gaeke@uiuc.edu> | 2004-07-06 18:15:39 +0000 |
| commit | 0e0fe8a2e9b8d36fdc9f8db3519825a72e131157 (patch) | |
| tree | 741a1df8120b27d27893f052c425274af838f2f2 /llvm/lib | |
| parent | bea724735725b25b8310ac005a35a72a353d89d2 (diff) | |
| download | bcm5719-llvm-0e0fe8a2e9b8d36fdc9f8db3519825a72e131157.tar.gz bcm5719-llvm-0e0fe8a2e9b8d36fdc9f8db3519825a72e131157.zip | |
Add helper function.
Don't touch GEPs for which DecomposeArrayRef is not going to do anything
special (e.g., < 2 indices, or 2 indices and the last one is a constant.)
llvm-svn: 14647
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/DecomposeMultiDimRefs.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/DecomposeMultiDimRefs.cpp b/llvm/lib/Transforms/Scalar/DecomposeMultiDimRefs.cpp index 10482a997c8..bcd0f78aba2 100644 --- a/llvm/lib/Transforms/Scalar/DecomposeMultiDimRefs.cpp +++ b/llvm/lib/Transforms/Scalar/DecomposeMultiDimRefs.cpp @@ -24,6 +24,7 @@ #include "llvm/BasicBlock.h" #include "llvm/Pass.h" #include "Support/Statistic.h" +#include "Support/Debug.h" using namespace llvm; namespace { @@ -52,6 +53,10 @@ FunctionPass *llvm::createDecomposeMultiDimRefsPass() { return new DecomposePass(); } +static inline bool isZeroConst (Value *V) { + return isa<Constant> (V) && (cast<Constant>(V)->isNullValue()); +} + // Function: DecomposeArrayRef() // // For any GetElementPtrInst with 2 or more array and structure indices: @@ -76,8 +81,15 @@ FunctionPass *llvm::createDecomposeMultiDimRefsPass() { // Return value: true if the instruction was replaced; false otherwise. // bool llvm::DecomposeArrayRef(GetElementPtrInst* GEP) { - if (GEP->getNumIndices() < 2) + if (GEP->getNumIndices() < 2 + || (GEP->getNumIndices() == 2 + && isZeroConst(GEP->getOperand(1)) + && isa<ConstantInt>(GEP->getOperand(2)))) { + DEBUG (std::cerr << "DecomposeArrayRef: Skipping " << *GEP); return false; + } else { + DEBUG (std::cerr << "DecomposeArrayRef: Decomposing " << *GEP); + } BasicBlock *BB = GEP->getParent(); Value *LastPtr = GEP->getPointerOperand(); @@ -90,7 +102,7 @@ bool llvm::DecomposeArrayRef(GetElementPtrInst* GEP) { // If this is the first index and is 0, skip it and move on! if (OI == GEP->idx_begin()) { - if (*OI == ConstantInt::getNullValue((*OI)->getType())) + if (isZeroConst (*OI)) continue; } else // Not the first index: include initial [0] to deref the last ptr |

