| ; RUN: llc < %s -march=thumb |
| ; RUN: llc < %s -mtriple=thumb-apple-darwin -relocation-model=pic \ |
| ; RUN: -mattr=+v6,+vfp2 | not grep {add r., r7, #2 \\* 4} |
| |
| %struct.__fooAllocator = type opaque |
| %struct.__fooY = type { %struct.fooXBase, %struct.__fooString*, %struct.__fooU*, %struct.__fooV*, i8** } |
| %struct.__fooZ = type opaque |
| %struct.__fooU = type opaque |
| %struct.__fooString = type opaque |
| %struct.__fooV = type opaque |
| %struct.fooXBase = type { i32, [4 x i8] } |
| %struct.fooXClass = type { i32, i8*, void (i8*)*, i8* (%struct.__fooAllocator*, i8*)*, void (i8*)*, i8 (i8*, i8*) zeroext *, i32 (i8*)*, %struct.__fooString* (i8*, %struct.__fooZ*)*, %struct.__fooString* (i8*)* } |
| %struct.aa_cache = type { i32, i32, [1 x %struct.aa_method*] } |
| %struct.aa_class = type { %struct.aa_class*, %struct.aa_class*, i8*, i32, i32, i32, %struct.aa_ivar_list*, %struct.aa_method_list**, %struct.aa_cache*, %struct.aa_protocol_list* } |
| %struct.aa_ivar = type { i8*, i8*, i32 } |
| %struct.aa_ivar_list = type { i32, [1 x %struct.aa_ivar] } |
| %struct.aa_method = type { %struct.aa_ss*, i8*, %struct.aa_object* (%struct.aa_object*, %struct.aa_ss*, ...)* } |
| %struct.aa_method_list = type { %struct.aa_method_list*, i32, [1 x %struct.aa_method] } |
| %struct.aa_object = type { %struct.aa_class* } |
| %struct.aa_protocol_list = type { %struct.aa_protocol_list*, i32, [1 x %struct.aa_object*] } |
| %struct.aa_ss = type opaque |
| @__kfooYTypeID = external global i32 ; <i32*> [#uses=3] |
| @__fooYClass = external constant %struct.fooXClass ; <%struct.fooXClass*> [#uses=1] |
| @__fooXClassTableSize = external global i32 ; <i32*> [#uses=1] |
| @__fooXAaClassTable = external global i32* ; <i32**> [#uses=1] |
| @s.10319 = external global %struct.aa_ss* ; <%struct.aa_ss**> [#uses=2] |
| @str15 = external constant [24 x i8] ; <[24 x i8]*> [#uses=1] |
| |
| |
| define i8 @test(%struct.__fooY* %calendar, double* %atp, i8* %componentDesc, ...) zeroext { |
| entry: |
| %args = alloca i8*, align 4 ; <i8**> [#uses=5] |
| %args4 = bitcast i8** %args to i8* ; <i8*> [#uses=2] |
| call void @llvm.va_start( i8* %args4 ) |
| %tmp6 = load i32* @__kfooYTypeID ; <i32> [#uses=1] |
| icmp eq i32 %tmp6, 0 ; <i1>:0 [#uses=1] |
| br i1 %0, label %cond_true, label %cond_next |
| |
| cond_true: ; preds = %entry |
| %tmp7 = call i32 @_fooXRegisterClass( %struct.fooXClass* @__fooYClass ) ; <i32> [#uses=1] |
| store i32 %tmp7, i32* @__kfooYTypeID |
| br label %cond_next |
| |
| cond_next: ; preds = %cond_true, %entry |
| %tmp8 = load i32* @__kfooYTypeID ; <i32> [#uses=2] |
| %tmp15 = load i32* @__fooXClassTableSize ; <i32> [#uses=1] |
| icmp ugt i32 %tmp15, %tmp8 ; <i1>:1 [#uses=1] |
| br i1 %1, label %cond_next18, label %cond_true58 |
| |
| cond_next18: ; preds = %cond_next |
| %tmp21 = getelementptr %struct.__fooY* %calendar, i32 0, i32 0, i32 0 ; <i32*> [#uses=1] |
| %tmp22 = load i32* %tmp21 ; <i32> [#uses=2] |
| %tmp29 = load i32** @__fooXAaClassTable ; <i32*> [#uses=1] |
| %tmp31 = getelementptr i32* %tmp29, i32 %tmp8 ; <i32*> [#uses=1] |
| %tmp32 = load i32* %tmp31 ; <i32> [#uses=1] |
| icmp eq i32 %tmp22, %tmp32 ; <i1>:2 [#uses=1] |
| %.not = xor i1 %2, true ; <i1> [#uses=1] |
| icmp ugt i32 %tmp22, 4095 ; <i1>:3 [#uses=1] |
| %bothcond = and i1 %.not, %3 ; <i1> [#uses=1] |
| br i1 %bothcond, label %cond_true58, label %bb48 |
| |
| bb48: ; preds = %cond_next18 |
| %tmp78 = call i32 @strlen( i8* %componentDesc ) ; <i32> [#uses=4] |
| %tmp92 = alloca i32, i32 %tmp78 ; <i32*> [#uses=2] |
| icmp sgt i32 %tmp78, 0 ; <i1>:4 [#uses=1] |
| br i1 %4, label %cond_true111, label %bb114 |
| |
| cond_true58: ; preds = %cond_next18, %cond_next |
| %tmp59 = load %struct.aa_ss** @s.10319 ; <%struct.aa_ss*> [#uses=2] |
| icmp eq %struct.aa_ss* %tmp59, null ; <i1>:5 [#uses=1] |
| %tmp6869 = bitcast %struct.__fooY* %calendar to i8* ; <i8*> [#uses=2] |
| br i1 %5, label %cond_true60, label %cond_next64 |
| |
| cond_true60: ; preds = %cond_true58 |
| %tmp63 = call %struct.aa_ss* @sel_registerName( i8* getelementptr ([24 x i8]* @str15, i32 0, i32 0) ) ; <%struct.aa_ss*> [#uses=2] |
| store %struct.aa_ss* %tmp63, %struct.aa_ss** @s.10319 |
| %tmp66137 = volatile load i8** %args ; <i8*> [#uses=1] |
| %tmp73138 = call i8 (i8*, %struct.aa_ss*, ...) zeroext * bitcast (%struct.aa_object* (%struct.aa_object*, %struct.aa_ss*, ...)* @aa_mm to i8 (i8*, %struct.aa_ss*, ...) zeroext *)( i8* %tmp6869, %struct.aa_ss* %tmp63, double* %atp, i8* %componentDesc, i8* %tmp66137) zeroext ; <i8> [#uses=1] |
| ret i8 %tmp73138 |
| |
| cond_next64: ; preds = %cond_true58 |
| %tmp66 = volatile load i8** %args ; <i8*> [#uses=1] |
| %tmp73 = call i8 (i8*, %struct.aa_ss*, ...) zeroext * bitcast (%struct.aa_object* (%struct.aa_object*, %struct.aa_ss*, ...)* @aa_mm to i8 (i8*, %struct.aa_ss*, ...) zeroext *)( i8* %tmp6869, %struct.aa_ss* %tmp59, double* %atp, i8* %componentDesc, i8* %tmp66 ) zeroext ; <i8> [#uses=1] |
| ret i8 %tmp73 |
| |
| cond_true111: ; preds = %cond_true111, %bb48 |
| %idx.2132.0 = phi i32 [ 0, %bb48 ], [ %indvar.next, %cond_true111 ] ; <i32> [#uses=2] |
| %tmp95 = volatile load i8** %args ; <i8*> [#uses=2] |
| %tmp97 = getelementptr i8* %tmp95, i32 4 ; <i8*> [#uses=1] |
| volatile store i8* %tmp97, i8** %args |
| %tmp9899 = bitcast i8* %tmp95 to i32* ; <i32*> [#uses=1] |
| %tmp100 = load i32* %tmp9899 ; <i32> [#uses=1] |
| %tmp104 = getelementptr i32* %tmp92, i32 %idx.2132.0 ; <i32*> [#uses=1] |
| store i32 %tmp100, i32* %tmp104 |
| %indvar.next = add i32 %idx.2132.0, 1 ; <i32> [#uses=2] |
| icmp eq i32 %indvar.next, %tmp78 ; <i1>:6 [#uses=1] |
| br i1 %6, label %bb114, label %cond_true111 |
| |
| bb114: ; preds = %cond_true111, %bb48 |
| call void @llvm.va_end( i8* %args4 ) |
| %tmp122 = call i8 @_fooYCCV( %struct.__fooY* %calendar, double* %atp, i8* %componentDesc, i32* %tmp92, i32 %tmp78 ) zeroext ; <i8> [#uses=1] |
| ret i8 %tmp122 |
| } |
| |
| declare i32 @_fooXRegisterClass(%struct.fooXClass*) |
| |
| declare i8 @_fooYCCV(%struct.__fooY*, double*, i8*, i32*, i32) zeroext |
| |
| declare %struct.aa_object* @aa_mm(%struct.aa_object*, %struct.aa_ss*, ...) |
| |
| declare %struct.aa_ss* @sel_registerName(i8*) |
| |
| declare void @llvm.va_start(i8*) |
| |
| declare i32 @strlen(i8*) |
| |
| declare void @llvm.va_end(i8*) |