mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-21 18:29:46 +00:00
apply Dan's fix for PR8268 which allows constant folding to handle indexes over
zero sized elements. This allows us to compile: #include <string> void foo() { std::string s; } into an empty function. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119933 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cbd323ad52
commit
c1da204c43
@ -538,7 +538,7 @@ static Constant *CastGEPIndices(Constant *const *Ops, unsigned NumOps,
|
||||
for (unsigned i = 1; i != NumOps; ++i) {
|
||||
if ((i == 1 ||
|
||||
!isa<StructType>(GetElementPtrInst::getIndexedType(Ops[0]->getType(),
|
||||
reinterpret_cast<Value *const *>(Ops+1),
|
||||
reinterpret_cast<Value *const *>(Ops+1),
|
||||
i-1))) &&
|
||||
Ops[i]->getType() != IntPtrTy) {
|
||||
Any = true;
|
||||
@ -639,12 +639,19 @@ static Constant *SymbolicallyEvaluateGEP(Constant *const *Ops, unsigned NumOps,
|
||||
|
||||
// Determine which element of the array the offset points into.
|
||||
APInt ElemSize(BitWidth, TD->getTypeAllocSize(ATy->getElementType()));
|
||||
const IntegerType *IntPtrTy = TD->getIntPtrType(Ty->getContext());
|
||||
if (ElemSize == 0)
|
||||
return 0;
|
||||
APInt NewIdx = Offset.udiv(ElemSize);
|
||||
Offset -= NewIdx * ElemSize;
|
||||
NewIdxs.push_back(ConstantInt::get(TD->getIntPtrType(Ty->getContext()),
|
||||
NewIdx));
|
||||
// The element size is 0. This may be [0 x Ty]*, so just use a zero
|
||||
// index for this level and procede to the next level to see if it can
|
||||
// accomodate the offset.
|
||||
NewIdxs.push_back(ConstantInt::get(IntPtrTy, 0));
|
||||
else {
|
||||
// The element size is non-zero divide the offset by the element
|
||||
// size (rounding down), to compute the index at this level.
|
||||
APInt NewIdx = Offset.udiv(ElemSize);
|
||||
Offset -= NewIdx * ElemSize;
|
||||
NewIdxs.push_back(ConstantInt::get(IntPtrTy, NewIdx));
|
||||
}
|
||||
Ty = ATy->getElementType();
|
||||
} else if (const StructType *STy = dyn_cast<StructType>(Ty)) {
|
||||
// Determine which field of the struct the offset points into. The
|
||||
@ -743,7 +750,8 @@ Constant *llvm::ConstantFoldInstruction(Instruction *I, const TargetData *TD) {
|
||||
Constant *llvm::ConstantFoldConstantExpression(const ConstantExpr *CE,
|
||||
const TargetData *TD) {
|
||||
SmallVector<Constant*, 8> Ops;
|
||||
for (User::const_op_iterator i = CE->op_begin(), e = CE->op_end(); i != e; ++i) {
|
||||
for (User::const_op_iterator i = CE->op_begin(), e = CE->op_end();
|
||||
i != e; ++i) {
|
||||
Constant *NewC = cast<Constant>(*i);
|
||||
// Recursively fold the ConstantExpr's operands.
|
||||
if (ConstantExpr *NewCE = dyn_cast<ConstantExpr>(NewC))
|
||||
|
Loading…
Reference in New Issue
Block a user