mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-28 07:17:32 +00:00
Implement more aggressive folding of constant GEP instructions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6913 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -141,12 +141,30 @@ Constant *ConstantFoldGetElementPtr(const Constant *C,
|
|||||||
|
|
||||||
// FIXME: Implement folding of GEP constant exprs the same as instcombine does
|
// FIXME: Implement folding of GEP constant exprs the same as instcombine does
|
||||||
|
|
||||||
|
if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
|
||||||
|
// Implement folding of:
|
||||||
|
// void ()** getelementptr (%struct..TorRec* getelementptr
|
||||||
|
// ([N x %struct..TorRec]* %llvm.global_dtors, long 0, long 0),
|
||||||
|
// long 0, ubyte 1)
|
||||||
|
// Into:
|
||||||
|
// %struct..TorRec* getelementptr ([N x %struct..TorRec]*
|
||||||
|
// %llvm.global_dtors, long 0, long 0, ubyte 1)
|
||||||
|
//
|
||||||
|
if (CE->getOpcode() == Instruction::GetElementPtr)
|
||||||
|
if (IdxList[0] == Constant::getNullValue(Type::LongTy)) {
|
||||||
|
std::vector<Constant*> NewIndices;
|
||||||
|
NewIndices.reserve(IdxList.size() + CE->getNumOperands());
|
||||||
|
for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i)
|
||||||
|
NewIndices.push_back(cast<Constant>(CE->getOperand(i)));
|
||||||
|
NewIndices.insert(NewIndices.end(), IdxList.begin()+1, IdxList.end());
|
||||||
|
return ConstantExpr::getGetElementPtr(CE->getOperand(0), NewIndices);
|
||||||
|
}
|
||||||
|
|
||||||
// Implement folding of:
|
// Implement folding of:
|
||||||
// int* getelementptr ([2 x int]* cast ([3 x int]* %X to [2 x int]*),
|
// int* getelementptr ([2 x int]* cast ([3 x int]* %X to [2 x int]*),
|
||||||
// long 0, long 0)
|
// long 0, long 0)
|
||||||
// To: int* getelementptr ([3 x int]* %X, long 0, long 0)
|
// To: int* getelementptr ([3 x int]* %X, long 0, long 0)
|
||||||
//
|
//
|
||||||
if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C))
|
|
||||||
if (CE->getOpcode() == Instruction::Cast && IdxList.size() > 1 &&
|
if (CE->getOpcode() == Instruction::Cast && IdxList.size() > 1 &&
|
||||||
IdxList[0]->isNullValue())
|
IdxList[0]->isNullValue())
|
||||||
if (const PointerType *SPT =
|
if (const PointerType *SPT =
|
||||||
@@ -157,6 +175,7 @@ Constant *ConstantFoldGetElementPtr(const Constant *C,
|
|||||||
if (CAT->getElementType() == SAT->getElementType())
|
if (CAT->getElementType() == SAT->getElementType())
|
||||||
return ConstantExpr::getGetElementPtr(
|
return ConstantExpr::getGetElementPtr(
|
||||||
(Constant*)CE->getOperand(0), IdxList);
|
(Constant*)CE->getOperand(0), IdxList);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user