diff options
| author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-03-24 03:37:53 +0000 |
|---|---|---|
| committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-03-24 03:37:53 +0000 |
| commit | dc96167e00e8c9dcb733cd7725670a8035abe2a6 (patch) | |
| tree | f05d7b5b778dd0b4224bf75b20c73998c7e7a069 /llvm | |
| parent | 8bc420ec6a451ed7b1b8d0bba7dc3564ba2a6272 (diff) | |
| download | bcm5719-llvm-dc96167e00e8c9dcb733cd7725670a8035abe2a6.tar.gz bcm5719-llvm-dc96167e00e8c9dcb733cd7725670a8035abe2a6.zip | |
Major overhaul to FoldGetElemPtr to handle mixed array and struct refs.
llvm-svn: 1968
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp b/llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp index e079c749e37..67f79d5d228 100644 --- a/llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp +++ b/llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp @@ -107,9 +107,10 @@ GetConstantValueAsSignedInt(const Value *V, // Function: FoldGetElemChain // // Purpose: -// Fold a chain of GetElementPtr instructions into an equivalent -// (Pointer, IndexVector) pair. Returns the pointer Value, and -// stores the resulting IndexVector in argument chainIdxVec. +// Fold a chain of GetElementPtr instructions containing only +// structure offsets into an equivalent (Pointer, IndexVector) pair. +// Returns the pointer Value, and stores the resulting IndexVector +// in argument chainIdxVec. //--------------------------------------------------------------------------- Value* @@ -120,11 +121,13 @@ FoldGetElemChain(const InstructionNode* getElemInstrNode, getElemInstrNode->getInstruction(); // Initialize return values from the incoming instruction - Value* ptrVal = getElemInst->getPointerOperand(); - chainIdxVec = getElemInst->copyIndices(); + Value* ptrVal = NULL; + assert(chainIdxVec.size() == 0); - // Now chase the chain of getElementInstr instructions, if any - InstrTreeNode* ptrChild = getElemInstrNode->leftChild(); + // Now chase the chain of getElementInstr instructions, if any. + // Check for any array indices and stop there. + // + const InstrTreeNode* ptrChild = getElemInstrNode; while (ptrChild->getOpLabel() == Instruction::GetElementPtr || ptrChild->getOpLabel() == GetElemPtrIdx) { @@ -132,10 +135,32 @@ FoldGetElemChain(const InstructionNode* getElemInstrNode, getElemInst = (MemAccessInst*) ((InstructionNode*) ptrChild)->getInstruction(); const vector<Value*>& idxVec = getElemInst->copyIndices(); + bool allStructureOffsets = true; + + // If it is a struct* access, the first offset must be array index [0], + // and all other offsets must be structure (not array) offsets + if (!isa<ConstantUInt>(idxVec.front()) || + cast<ConstantUInt>(idxVec.front())->getValue() != 0) + allStructureOffsets = false; - // Get the pointer value out of ptrChild and *prepend* its index vector - ptrVal = getElemInst->getPointerOperand(); - chainIdxVec.insert(chainIdxVec.begin(), idxVec.begin(), idxVec.end()); + if (allStructureOffsets) + for (unsigned int i=1; i < idxVec.size(); i++) + if (idxVec[i]->getType() == Type::UIntTy) + { + allStructureOffsets = false; + break; + } + + if (allStructureOffsets) + { // Get pointer value out of ptrChild and *prepend* its index vector + ptrVal = getElemInst->getPointerOperand(); + chainIdxVec.insert(chainIdxVec.begin(), + idxVec.begin()+1, idxVec.end()); + ((InstructionNode*) ptrChild)->markFoldedIntoParent(); + // mark so no code is generated + } + else // cannot fold this getElementPtr instr. or any further ones + break; ptrChild = ptrChild->leftChild(); } |

