ConstantFolding: Evaluate GEP indices in the index type.

This fixes some edge cases that we would get wrong with uint64_ts.
PR14986.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173289 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer
2013-01-23 20:41:05 +00:00
parent 9e6a5a3746
commit b4d201ec54
2 changed files with 33 additions and 5 deletions

View File

@ -254,13 +254,22 @@ static bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV,
if (!CI) return false; // Index isn't a simple constant?
if (CI->isZero()) continue; // Not adding anything.
// Evaluate offsets in the index type.
APInt APOffset(CI->getBitWidth(), Offset);
if (StructType *ST = dyn_cast<StructType>(*GTI)) {
// N = N + Offset
Offset += TD.getStructLayout(ST)->getElementOffset(CI->getZExtValue());
APOffset +=
APInt(CI->getBitWidth(),
TD.getStructLayout(ST)->getElementOffset(CI->getZExtValue()));
} else {
SequentialType *SQT = cast<SequentialType>(*GTI);
Offset += TD.getTypeAllocSize(SQT->getElementType())*CI->getSExtValue();
APOffset +=
APInt(CI->getBitWidth(),
TD.getTypeAllocSize(SQT->getElementType())*CI->getSExtValue());
}
Offset = APOffset.getSExtValue();
}
return true;
}