[PATCH] Fix SROA creating invalid bitcasts between address spaces
Joey Gouly
joey.gouly at arm.com
Thu Dec 5 10:14:51 PST 2013
================
Comment at: lib/Transforms/Scalar/SROA.cpp:1432
@@ -1431,3 +1432,3 @@
if (Ptr->getType() != PointerTy)
Ptr = IRB.CreateBitCast(Ptr, PointerTy, "cast");
----------------
Joey Gouly wrote:
> This line can also crash! I'll try get a test case.
Here is the test case, it runs with 'opt -sroa'.
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32-S64"
target triple = "armv7-none-linux-gnueabi"
%struct.struct_test_27.0.13 = type { i32, float, i64, i8, [4 x i32] }
; Function Attrs: nounwind
define void @copy_struct([5 x i64] %in.coerce) {
for.end:
%in = alloca %struct.struct_test_27.0.13, align 8
%0 = bitcast %struct.struct_test_27.0.13* %in to [5 x i64]*
store [5 x i64] %in.coerce, [5 x i64]* %0, align 8
%scevgep9 = getelementptr %struct.struct_test_27.0.13* %in, i32 0, i32 4, i32 0
%scevgep910 = bitcast i32* %scevgep9 to i8*
call void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)* undef, i8* %scevgep910, i32 16, i32 4, i1 false)
ret void
}
; Function Attrs: nounwind
declare void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)* nocapture, i8* nocapture readonly, i32, i32, i1)
http://llvm-reviews.chandlerc.com/D1764
More information about the llvm-commits
mailing list