From d9c3dabbba5f96b929a3367d7b9701a743d454ea Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Wed, 23 Jan 2013 20:41:05 +0000 Subject: ConstantFolding: Evaluate GEP indices in the index type. This fixes some edge cases that we would get wrong with uint64_ts. PR14986. llvm-svn: 173289 --- llvm/lib/Analysis/ConstantFolding.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'llvm/lib/Analysis/ConstantFolding.cpp') diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index e2b1e25..95a68bf 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -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(*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(*GTI); - Offset += TD.getTypeAllocSize(SQT->getElementType())*CI->getSExtValue(); + APOffset += + APInt(CI->getBitWidth(), + TD.getTypeAllocSize(SQT->getElementType())*CI->getSExtValue()); } + + Offset = APOffset.getSExtValue(); } return true; } -- cgit v1.1