Here’s a working testcase:
; ModuleID = ‘/tmp/crtbegin.bc’
target datalayout = “E-p:32:32:128-i1:8:128-i8:8:128-i16:16:128-i32:32:128-i64:32:128-f32:32:128-f64:64:128-v64:64:64-v128:128:128-a0:0:128-s0:128:128”
target triple = “spu”
@__dso_handle = hidden global i8* null, align 16 ; <i8**> [#uses=0]
@CTOR_LIST = internal global [1 x void ()] [ void () inttoptr (i64 4294967295 to void ()) ], section “.ctors”, align 4 ; <[1 x void ()]> [#uses=1]
@DTOR_LIST = internal global [1 x void ()] [ void ()* inttoptr (i64 4294967295 to void ()) ], section “.dtors”, align 4 ; <[1 x void ()]> [#uses=2]
@JCR_LIST = internal global [0 x i8] zeroinitializer, section “.jcr”, align 4 ; <[0 x i8*]> [#uses=2]
@completed.1936.b = internal global i1 false ; <i1> [#uses=2]
@p.1934 = internal global void ()** getelementptr ([1 x void ()] @DTOR_LIST, i32 0, i32 1), align 16 ; <void ()> [#uses=3]
@llvm.used = appending global [2 x i8] [ i8 bitcast ([1 x void ()]* @CTOR_LIST to i8*), i8* bitcast (void ()* @frame_dummy to i8*) ], section “llvm.metadata” ; <[6 x i8*]*> [#uses=0]
define internal void @frame_dummy() {
entry:
%tmp1 = load i8** getelementptr ([0 x i8*]* @JCR_LIST, i32 0, i32 0), align 4 ; <i8*> [#uses=1]
%tmp2 = icmp eq i8* %tmp1, null ; [#uses=1]
br i1 %tmp2, label %UnifiedReturnBlock, label %bb
bb: ; preds = %entry
%tmp5 = tail call void (i8*)* (void (i8*)) asm “”, “=r,0”( void (i8*)* @_Jv_RegisterClasses ) ; <void (i8*)> [#uses=2]
%tmp7 = icmp eq void (i8)* %tmp5, null ; [#uses=1]
br i1 %tmp7, label %UnifiedReturnBlock, label %bb10
bb10: ; preds = %bb
tail call void %tmp5( i8* bitcast ([0 x i8*]* @JCR_LIST to i8*) )
ret void
UnifiedReturnBlock: ; preds = %bb, %entry
ret void
}
declare extern_weak void @_Jv_RegisterClasses(i8*)