mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-21 11:10:12 +00:00
Fix a bug which caused us to miscompile a couple of Ada
tests. Thanks for the beautiful reduced testcase Duncan! llvm-svn: 63529
This commit is contained in:
parent
7f2ea2d067
commit
ce09ac0c3d
@ -1166,12 +1166,17 @@ void SROA::CanonicalizeAllocaUsers(AllocationInst *AI) {
|
||||
static void MergeInType(const Type *In, uint64_t Offset, const Type *&Accum,
|
||||
const TargetData &TD) {
|
||||
// If this is our first type, just use it.
|
||||
if (Accum == 0 || In == Type::VoidTy ||
|
||||
if ((Accum == 0 && Offset == 0) || In == Type::VoidTy ||
|
||||
// Or if this is a same type, keep it.
|
||||
(In == Accum && Offset == 0)) {
|
||||
Accum = In;
|
||||
return;
|
||||
}
|
||||
|
||||
// Merging something like i32 into offset 8 means that a "field" is merged in
|
||||
// before the basic type is. Make sure to consider the offset below.
|
||||
if (Accum == 0)
|
||||
Accum = Type::Int8Ty;
|
||||
|
||||
if (const VectorType *VATy = dyn_cast<VectorType>(Accum)) {
|
||||
if (VATy->getElementType() == In &&
|
||||
|
@ -0,0 +1,16 @@
|
||||
; RUN: llvm-as < %s | opt -scalarrepl -instcombine | llvm-dis | grep {ret i32 %x}
|
||||
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"
|
||||
target triple = "i386-pc-linux-gnu"
|
||||
|
||||
%pair = type { [1 x i32], i32 }
|
||||
|
||||
define i32 @f(i32 %x, i32 %y) {
|
||||
%instance = alloca %pair
|
||||
%first = getelementptr %pair* %instance, i32 0, i32 0
|
||||
%cast = bitcast [1 x i32]* %first to i32*
|
||||
store i32 %x, i32* %cast
|
||||
%second = getelementptr %pair* %instance, i32 0, i32 1
|
||||
store i32 %y, i32* %second
|
||||
%v = load i32* %cast
|
||||
ret i32 %v
|
||||
}
|
Loading…
Reference in New Issue
Block a user