[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