enhance FoldReinterpretLoadFromConstPtr to handle loads of up to 32

bytes (i256).


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84941 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2009-10-23 06:50:36 +00:00
parent fe8c7c807c
commit 739208a790
2 changed files with 19 additions and 6 deletions

View File

@@ -232,7 +232,7 @@ static Constant *FoldReinterpretLoadFromConstPtr(Constant *C,
}
unsigned BytesLoaded = (IntType->getBitWidth() + 7) / 8;
if (BytesLoaded > 8 || BytesLoaded == 0) return 0;
if (BytesLoaded > 32 || BytesLoaded == 0) return 0;
GlobalValue *GVal;
int64_t Offset;
@@ -253,16 +253,18 @@ static Constant *FoldReinterpretLoadFromConstPtr(Constant *C,
if (uint64_t(Offset) >= TD.getTypeAllocSize(GV->getInitializer()->getType()))
return UndefValue::get(IntType);
unsigned char RawBytes[8] = {0};
unsigned char RawBytes[32] = {0};
if (!ReadDataFromGlobal(GV->getInitializer(), Offset, RawBytes,
BytesLoaded, TD))
return 0;
uint64_t ResultVal = 0;
for (unsigned i = 0; i != BytesLoaded; ++i)
ResultVal |= (uint64_t)RawBytes[i] << (i * 8);
APInt ResultVal(IntType->getBitWidth(), 0);
for (unsigned i = 0; i != BytesLoaded; ++i) {
ResultVal <<= 8;
ResultVal |= APInt(IntType->getBitWidth(), RawBytes[BytesLoaded-1-i]);
}
return ConstantInt::get(IntType, ResultVal);
return ConstantInt::get(IntType->getContext(), ResultVal);
}
/// ConstantFoldLoadFromConstPtr - Return the value that a load from C would