mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-21 18:29:46 +00:00
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:
parent
fe8c7c807c
commit
739208a790
@ -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
|
||||
|
@ -4,6 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
|
||||
|
||||
@test1 = constant {{i32,i8},i32} {{i32,i8} { i32 -559038737, i8 186 }, i32 -889275714 }
|
||||
@test2 = constant double 1.0
|
||||
@test3 = constant {i64, i64} { i64 123, i64 112312312 }
|
||||
|
||||
; Simple load
|
||||
define i32 @test1() {
|
||||
@ -66,3 +67,13 @@ define double @test8() {
|
||||
; @test8
|
||||
; CHECK: ret double 0xDEADBEBA
|
||||
}
|
||||
|
||||
|
||||
; i128 load.
|
||||
define i128 @test9() {
|
||||
%r = load i128* bitcast({i64, i64}* @test3 to i128*)
|
||||
ret i128 %r
|
||||
|
||||
; @test9
|
||||
; CHECK: ret i128 112312312
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user