mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
When folding a load from a global constant, if the load started in the middle
of an array element (rather than at the beginning of the element) and extended into the next element, then the load from the second element was being handled wrong due to incorrect updating of the notion of which byte to load next. This fixes PR13442. Thanks to Chris Smowton for reporting the problem, analyzing it and providing a fix. llvm-svn: 160711
This commit is contained in:
parent
f52e519898
commit
8080fe449f
@ -358,17 +358,20 @@ static bool ReadDataFromGlobal(Constant *C, uint64_t ByteOffset,
|
||||
NumElts = AT->getNumElements();
|
||||
else
|
||||
NumElts = cast<VectorType>(C->getType())->getNumElements();
|
||||
|
||||
|
||||
for (; Index != NumElts; ++Index) {
|
||||
if (!ReadDataFromGlobal(C->getAggregateElement(Index), Offset, CurPtr,
|
||||
BytesLeft, TD))
|
||||
return false;
|
||||
if (EltSize >= BytesLeft)
|
||||
|
||||
uint64_t BytesWritten = EltSize - Offset;
|
||||
assert(BytesWritten <= EltSize && "Not indexing into this element?");
|
||||
if (BytesWritten >= BytesLeft)
|
||||
return true;
|
||||
|
||||
|
||||
Offset = 0;
|
||||
BytesLeft -= EltSize;
|
||||
CurPtr += EltSize;
|
||||
BytesLeft -= BytesWritten;
|
||||
CurPtr += BytesWritten;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
12
test/Transforms/InstCombine/2012-07-25-LoadPart.ll
Normal file
12
test/Transforms/InstCombine/2012-07-25-LoadPart.ll
Normal file
@ -0,0 +1,12 @@
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
; PR13442
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
|
||||
|
||||
@test = constant [4 x i32] [i32 1, i32 2, i32 3, i32 4]
|
||||
|
||||
define i64 @foo() {
|
||||
%ret = load i64* bitcast (i8* getelementptr (i8* bitcast ([4 x i32]* @test to i8*), i64 2) to i64*)
|
||||
ret i64 %ret
|
||||
; CHECK: ret i64 844424930263040
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user