1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs < %s -mtriple=armv7-apple-ios | FileCheck --check-prefix=CHECK-APPLE %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -O0 < %s -mtriple=armv7-apple-ios | FileCheck --check-prefix=CHECK-O0 %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i8* @malloc(i64) 5*9880d681SAndroid Build Coastguard Workerdeclare void @free(i8*) 6*9880d681SAndroid Build Coastguard Worker%swift_error = type { i64, i8 } 7*9880d681SAndroid Build Coastguard Worker%struct.S = type { i32, i32, i32, i32, i32, i32 } 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; This tests the basic usage of a swifterror parameter. "foo" is the function 10*9880d681SAndroid Build Coastguard Worker; that takes a swifterror parameter and "caller" is the caller of "foo". 11*9880d681SAndroid Build Coastguard Workerdefine float @foo(%swift_error** swifterror %error_ptr_ref) { 12*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: foo: 13*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r0, #16 14*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: malloc 15*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: mov [[ID:r[0-9]+]], #1 16*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: mov r6, r{{.*}} 17*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: strb [[ID]], [r{{.*}}, #8] 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: foo: 20*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r{{.*}}, #16 21*9880d681SAndroid Build Coastguard Worker; CHECK-O0: malloc 22*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov [[ID2:r[0-9]+]], r0 23*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov [[ID:r[0-9]+]], #1 24*9880d681SAndroid Build Coastguard Worker; CHECK-O0: strb [[ID]], [r0, #8] 25*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r6, [[ID2]] 26*9880d681SAndroid Build Coastguard Workerentry: 27*9880d681SAndroid Build Coastguard Worker %call = call i8* @malloc(i64 16) 28*9880d681SAndroid Build Coastguard Worker %call.0 = bitcast i8* %call to %swift_error* 29*9880d681SAndroid Build Coastguard Worker store %swift_error* %call.0, %swift_error** %error_ptr_ref 30*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr inbounds i8, i8* %call, i64 8 31*9880d681SAndroid Build Coastguard Worker store i8 1, i8* %tmp 32*9880d681SAndroid Build Coastguard Worker ret float 1.0 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; "caller" calls "foo" that takes a swifterror parameter. 36*9880d681SAndroid Build Coastguard Workerdefine float @caller(i8* %error_ref) { 37*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: caller: 38*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: mov [[ID:r[0-9]+]], r0 39*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: mov r6, #0 40*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: bl {{.*}}foo 41*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: cmp r6, #0 42*9880d681SAndroid Build Coastguard Worker; Access part of the error object and save it to error_ref 43*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: ldrbeq [[CODE:r[0-9]+]], [r6, #8] 44*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: strbeq [[CODE]], [{{.*}}[[ID]]] 45*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r0, r6 46*9880d681SAndroid Build Coastguard Worker; CHECK_APPLE: bl {{.*}}free 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: caller: 49*9880d681SAndroid Build Coastguard Worker; spill r0 50*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: str r0, 51*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: mov r6, #0 52*9880d681SAndroid Build Coastguard Worker; CHECK-O0: bl {{.*}}foo 53*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r{{.*}}, r6 54*9880d681SAndroid Build Coastguard Worker; CHECK-O0: bne 55*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ldrb [[CODE:r[0-9]+]], [r0, #8] 56*9880d681SAndroid Build Coastguard Worker; reload r0 57*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ldr [[ID:r[0-9]+]], 58*9880d681SAndroid Build Coastguard Worker; CHECK-O0: strb [[CODE]], [{{.*}}[[ID]]] 59*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r0, 60*9880d681SAndroid Build Coastguard Worker; CHECK-O0: free 61*9880d681SAndroid Build Coastguard Workerentry: 62*9880d681SAndroid Build Coastguard Worker %error_ptr_ref = alloca swifterror %swift_error* 63*9880d681SAndroid Build Coastguard Worker store %swift_error* null, %swift_error** %error_ptr_ref 64*9880d681SAndroid Build Coastguard Worker %call = call float @foo(%swift_error** swifterror %error_ptr_ref) 65*9880d681SAndroid Build Coastguard Worker %error_from_foo = load %swift_error*, %swift_error** %error_ptr_ref 66*9880d681SAndroid Build Coastguard Worker %had_error_from_foo = icmp ne %swift_error* %error_from_foo, null 67*9880d681SAndroid Build Coastguard Worker %tmp = bitcast %swift_error* %error_from_foo to i8* 68*9880d681SAndroid Build Coastguard Worker br i1 %had_error_from_foo, label %handler, label %cont 69*9880d681SAndroid Build Coastguard Workercont: 70*9880d681SAndroid Build Coastguard Worker %v1 = getelementptr inbounds %swift_error, %swift_error* %error_from_foo, i64 0, i32 1 71*9880d681SAndroid Build Coastguard Worker %t = load i8, i8* %v1 72*9880d681SAndroid Build Coastguard Worker store i8 %t, i8* %error_ref 73*9880d681SAndroid Build Coastguard Worker br label %handler 74*9880d681SAndroid Build Coastguard Workerhandler: 75*9880d681SAndroid Build Coastguard Worker call void @free(i8* %tmp) 76*9880d681SAndroid Build Coastguard Worker ret float 1.0 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker; "caller2" is the caller of "foo", it calls "foo" inside a loop. 80*9880d681SAndroid Build Coastguard Workerdefine float @caller2(i8* %error_ref) { 81*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: caller2: 82*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: mov [[ID:r[0-9]+]], r0 83*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: mov r6, #0 84*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: bl {{.*}}foo 85*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: cmp r6, #0 86*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: bne 87*9880d681SAndroid Build Coastguard Worker; Access part of the error object and save it to error_ref 88*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: ldrb [[CODE:r[0-9]+]], [r6, #8] 89*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: strb [[CODE]], [{{.*}}[[ID]]] 90*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r0, r6 91*9880d681SAndroid Build Coastguard Worker; CHECK_APPLE: bl {{.*}}free 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: caller2: 94*9880d681SAndroid Build Coastguard Worker; spill r0 95*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: str r0, 96*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: mov r6, #0 97*9880d681SAndroid Build Coastguard Worker; CHECK-O0: bl {{.*}}foo 98*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r{{.*}}, r6 99*9880d681SAndroid Build Coastguard Worker; CHECK-O0: bne 100*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ble 101*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ldrb [[CODE:r[0-9]+]], [r0, #8] 102*9880d681SAndroid Build Coastguard Worker; reload r0 103*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ldr [[ID:r[0-9]+]], 104*9880d681SAndroid Build Coastguard Worker; CHECK-O0: strb [[CODE]], [{{.*}}[[ID]]] 105*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r0, 106*9880d681SAndroid Build Coastguard Worker; CHECK-O0: free 107*9880d681SAndroid Build Coastguard Workerentry: 108*9880d681SAndroid Build Coastguard Worker %error_ptr_ref = alloca swifterror %swift_error* 109*9880d681SAndroid Build Coastguard Worker br label %bb_loop 110*9880d681SAndroid Build Coastguard Workerbb_loop: 111*9880d681SAndroid Build Coastguard Worker store %swift_error* null, %swift_error** %error_ptr_ref 112*9880d681SAndroid Build Coastguard Worker %call = call float @foo(%swift_error** swifterror %error_ptr_ref) 113*9880d681SAndroid Build Coastguard Worker %error_from_foo = load %swift_error*, %swift_error** %error_ptr_ref 114*9880d681SAndroid Build Coastguard Worker %had_error_from_foo = icmp ne %swift_error* %error_from_foo, null 115*9880d681SAndroid Build Coastguard Worker %tmp = bitcast %swift_error* %error_from_foo to i8* 116*9880d681SAndroid Build Coastguard Worker br i1 %had_error_from_foo, label %handler, label %cont 117*9880d681SAndroid Build Coastguard Workercont: 118*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt float %call, 1.000000e+00 119*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb_end, label %bb_loop 120*9880d681SAndroid Build Coastguard Workerbb_end: 121*9880d681SAndroid Build Coastguard Worker %v1 = getelementptr inbounds %swift_error, %swift_error* %error_from_foo, i64 0, i32 1 122*9880d681SAndroid Build Coastguard Worker %t = load i8, i8* %v1 123*9880d681SAndroid Build Coastguard Worker store i8 %t, i8* %error_ref 124*9880d681SAndroid Build Coastguard Worker br label %handler 125*9880d681SAndroid Build Coastguard Workerhandler: 126*9880d681SAndroid Build Coastguard Worker call void @free(i8* %tmp) 127*9880d681SAndroid Build Coastguard Worker ret float 1.0 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; "foo_if" is a function that takes a swifterror parameter, it sets swifterror 131*9880d681SAndroid Build Coastguard Worker; under a certain condition. 132*9880d681SAndroid Build Coastguard Workerdefine float @foo_if(%swift_error** swifterror %error_ptr_ref, i32 %cc) { 133*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: foo_if: 134*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: cmp r0, #0 135*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: eq 136*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r0, #16 137*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: malloc 138*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov [[ID:r[0-9]+]], #1 139*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: mov r6, r{{.*}} 140*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: strb [[ID]], [r{{.*}}, #8] 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: foo_if: 143*9880d681SAndroid Build Coastguard Worker; CHECK-O0: cmp r0, #0 144*9880d681SAndroid Build Coastguard Worker; spill to stack 145*9880d681SAndroid Build Coastguard Worker; CHECK-O0: str r6 146*9880d681SAndroid Build Coastguard Worker; CHECK-O0: beq 147*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r0, #16 148*9880d681SAndroid Build Coastguard Worker; CHECK-O0: malloc 149*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov [[ID:r[0-9]+]], r0 150*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov [[ID2:[a-z0-9]+]], #1 151*9880d681SAndroid Build Coastguard Worker; CHECK-O0: strb [[ID2]], [r0, #8] 152*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r6, [[ID]] 153*9880d681SAndroid Build Coastguard Worker; reload from stack 154*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ldr r6 155*9880d681SAndroid Build Coastguard Workerentry: 156*9880d681SAndroid Build Coastguard Worker %cond = icmp ne i32 %cc, 0 157*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %gen_error, label %normal 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workergen_error: 160*9880d681SAndroid Build Coastguard Worker %call = call i8* @malloc(i64 16) 161*9880d681SAndroid Build Coastguard Worker %call.0 = bitcast i8* %call to %swift_error* 162*9880d681SAndroid Build Coastguard Worker store %swift_error* %call.0, %swift_error** %error_ptr_ref 163*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr inbounds i8, i8* %call, i64 8 164*9880d681SAndroid Build Coastguard Worker store i8 1, i8* %tmp 165*9880d681SAndroid Build Coastguard Worker ret float 1.0 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workernormal: 168*9880d681SAndroid Build Coastguard Worker ret float 0.0 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker; "foo_loop" is a function that takes a swifterror parameter, it sets swifterror 172*9880d681SAndroid Build Coastguard Worker; under a certain condition inside a loop. 173*9880d681SAndroid Build Coastguard Workerdefine float @foo_loop(%swift_error** swifterror %error_ptr_ref, i32 %cc, float %cc2) { 174*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: foo_loop: 175*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov [[CODE:r[0-9]+]], r0 176*9880d681SAndroid Build Coastguard Worker; swifterror is kept in a register 177*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov [[ID:r[0-9]+]], r6 178*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: cmp [[CODE]], #0 179*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: beq 180*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r0, #16 181*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: malloc 182*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: strb r{{.*}}, [{{.*}}[[ID]], #8] 183*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: ble 184*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r6, [[ID]] 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: foo_loop: 187*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r{{.*}}, r6 188*9880d681SAndroid Build Coastguard Worker; CHECK-O0: cmp r{{.*}}, #0 189*9880d681SAndroid Build Coastguard Worker; CHECK-O0: beq 190*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: movw r{{.*}}, #1 191*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: mov r{{.*}}, #16 192*9880d681SAndroid Build Coastguard Worker; CHECK-O0: malloc 193*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: mov [[ID:r[0-9]+]], r0 194*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: ldr [[ID2:r[0-9]+]], [sp{{.*}}] 195*9880d681SAndroid Build Coastguard Worker; CHECK-O0: strb [[ID2]], [{{.*}}[[ID]], #8] 196*9880d681SAndroid Build Coastguard Worker; spill r0 197*9880d681SAndroid Build Coastguard Worker; CHECK-O0: str r0, [sp{{.*}}] 198*9880d681SAndroid Build Coastguard Worker; CHECK-O0: vcmpe 199*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ble 200*9880d681SAndroid Build Coastguard Worker; reload from stack 201*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ldr r6 202*9880d681SAndroid Build Coastguard Workerentry: 203*9880d681SAndroid Build Coastguard Worker br label %bb_loop 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerbb_loop: 206*9880d681SAndroid Build Coastguard Worker %cond = icmp ne i32 %cc, 0 207*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %gen_error, label %bb_cont 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workergen_error: 210*9880d681SAndroid Build Coastguard Worker %call = call i8* @malloc(i64 16) 211*9880d681SAndroid Build Coastguard Worker %call.0 = bitcast i8* %call to %swift_error* 212*9880d681SAndroid Build Coastguard Worker store %swift_error* %call.0, %swift_error** %error_ptr_ref 213*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr inbounds i8, i8* %call, i64 8 214*9880d681SAndroid Build Coastguard Worker store i8 1, i8* %tmp 215*9880d681SAndroid Build Coastguard Worker br label %bb_cont 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Workerbb_cont: 218*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt float %cc2, 1.000000e+00 219*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb_end, label %bb_loop 220*9880d681SAndroid Build Coastguard Workerbb_end: 221*9880d681SAndroid Build Coastguard Worker ret float 0.0 222*9880d681SAndroid Build Coastguard Worker} 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker; "foo_sret" is a function that takes a swifterror parameter, it also has a sret 225*9880d681SAndroid Build Coastguard Worker; parameter. 226*9880d681SAndroid Build Coastguard Workerdefine void @foo_sret(%struct.S* sret %agg.result, i32 %val1, %swift_error** swifterror %error_ptr_ref) { 227*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: foo_sret: 228*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov [[SRET:r[0-9]+]], r0 229*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r0, #16 230*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: malloc 231*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov [[REG:r[0-9]+]], #1 232*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: mov r6, r0 233*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: strb [[REG]], [r0, #8] 234*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: str r{{.*}}, [{{.*}}[[SRET]], #4] 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: foo_sret: 237*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r{{.*}}, #16 238*9880d681SAndroid Build Coastguard Worker; spill to stack: sret and val1 239*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: str r0 240*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: str r1 241*9880d681SAndroid Build Coastguard Worker; CHECK-O0: malloc 242*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov [[ID:r[0-9]+]], #1 243*9880d681SAndroid Build Coastguard Worker; CHECK-O0: strb [[ID]], [r0, #8] 244*9880d681SAndroid Build Coastguard Worker; reload from stack: sret and val1 245*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ldr 246*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ldr 247*9880d681SAndroid Build Coastguard Worker; CHECK-O0: str r{{.*}}, [{{.*}}, #4] 248*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r6 249*9880d681SAndroid Build Coastguard Workerentry: 250*9880d681SAndroid Build Coastguard Worker %call = call i8* @malloc(i64 16) 251*9880d681SAndroid Build Coastguard Worker %call.0 = bitcast i8* %call to %swift_error* 252*9880d681SAndroid Build Coastguard Worker store %swift_error* %call.0, %swift_error** %error_ptr_ref 253*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr inbounds i8, i8* %call, i64 8 254*9880d681SAndroid Build Coastguard Worker store i8 1, i8* %tmp 255*9880d681SAndroid Build Coastguard Worker %v2 = getelementptr inbounds %struct.S, %struct.S* %agg.result, i32 0, i32 1 256*9880d681SAndroid Build Coastguard Worker store i32 %val1, i32* %v2 257*9880d681SAndroid Build Coastguard Worker ret void 258*9880d681SAndroid Build Coastguard Worker} 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Worker; "caller3" calls "foo_sret" that takes a swifterror parameter. 261*9880d681SAndroid Build Coastguard Workerdefine float @caller3(i8* %error_ref) { 262*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: caller3: 263*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov [[ID:r[0-9]+]], r0 264*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r6, #0 265*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: bl {{.*}}foo_sret 266*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: cmp r6, #0 267*9880d681SAndroid Build Coastguard Worker; Access part of the error object and save it to error_ref 268*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: ldrbeq [[CODE:r[0-9]+]], [r6, #8] 269*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: strbeq [[CODE]], [{{.*}}[[ID]]] 270*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r0, r6 271*9880d681SAndroid Build Coastguard Worker; CHECK_APPLE: bl {{.*}}free 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: caller3: 274*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: mov r6, #0 275*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: mov r0 276*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: mov r1 277*9880d681SAndroid Build Coastguard Worker; CHECK-O0: bl {{.*}}foo_sret 278*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov [[ID2:r[0-9]+]], r6 279*9880d681SAndroid Build Coastguard Worker; CHECK-O0: cmp [[ID2]] 280*9880d681SAndroid Build Coastguard Worker; CHECK-O0: bne 281*9880d681SAndroid Build Coastguard Worker; Access part of the error object and save it to error_ref 282*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ldrb [[CODE:r[0-9]+]] 283*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ldr [[ID:r[0-9]+]] 284*9880d681SAndroid Build Coastguard Worker; CHECK-O0: strb [[CODE]], [{{.*}}[[ID]]] 285*9880d681SAndroid Build Coastguard Worker; CHECK-O0: mov r0, 286*9880d681SAndroid Build Coastguard Worker; CHECK_O0: bl {{.*}}free 287*9880d681SAndroid Build Coastguard Workerentry: 288*9880d681SAndroid Build Coastguard Worker %s = alloca %struct.S, align 8 289*9880d681SAndroid Build Coastguard Worker %error_ptr_ref = alloca swifterror %swift_error* 290*9880d681SAndroid Build Coastguard Worker store %swift_error* null, %swift_error** %error_ptr_ref 291*9880d681SAndroid Build Coastguard Worker call void @foo_sret(%struct.S* sret %s, i32 1, %swift_error** swifterror %error_ptr_ref) 292*9880d681SAndroid Build Coastguard Worker %error_from_foo = load %swift_error*, %swift_error** %error_ptr_ref 293*9880d681SAndroid Build Coastguard Worker %had_error_from_foo = icmp ne %swift_error* %error_from_foo, null 294*9880d681SAndroid Build Coastguard Worker %tmp = bitcast %swift_error* %error_from_foo to i8* 295*9880d681SAndroid Build Coastguard Worker br i1 %had_error_from_foo, label %handler, label %cont 296*9880d681SAndroid Build Coastguard Workercont: 297*9880d681SAndroid Build Coastguard Worker %v1 = getelementptr inbounds %swift_error, %swift_error* %error_from_foo, i64 0, i32 1 298*9880d681SAndroid Build Coastguard Worker %t = load i8, i8* %v1 299*9880d681SAndroid Build Coastguard Worker store i8 %t, i8* %error_ref 300*9880d681SAndroid Build Coastguard Worker br label %handler 301*9880d681SAndroid Build Coastguard Workerhandler: 302*9880d681SAndroid Build Coastguard Worker call void @free(i8* %tmp) 303*9880d681SAndroid Build Coastguard Worker ret float 1.0 304*9880d681SAndroid Build Coastguard Worker} 305*9880d681SAndroid Build Coastguard Worker 306*9880d681SAndroid Build Coastguard Worker; "foo_vararg" is a function that takes a swifterror parameter, it also has 307*9880d681SAndroid Build Coastguard Worker; variable number of arguments. 308*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.va_start(i8*) nounwind 309*9880d681SAndroid Build Coastguard Workerdefine float @foo_vararg(%swift_error** swifterror %error_ptr_ref, ...) { 310*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: foo_vararg: 311*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r0, #16 312*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: malloc 313*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov [[REG:r[0-9]+]], r0 314*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov [[ID:r[0-9]+]], #1 315*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: strb [[ID]], [{{.*}}[[REG]], #8] 316*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-DAG: mov r6, [[REG]] 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Workerentry: 319*9880d681SAndroid Build Coastguard Worker %call = call i8* @malloc(i64 16) 320*9880d681SAndroid Build Coastguard Worker %call.0 = bitcast i8* %call to %swift_error* 321*9880d681SAndroid Build Coastguard Worker store %swift_error* %call.0, %swift_error** %error_ptr_ref 322*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr inbounds i8, i8* %call, i64 8 323*9880d681SAndroid Build Coastguard Worker store i8 1, i8* %tmp 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker %args = alloca i8*, align 8 326*9880d681SAndroid Build Coastguard Worker %a10 = alloca i32, align 4 327*9880d681SAndroid Build Coastguard Worker %a11 = alloca i32, align 4 328*9880d681SAndroid Build Coastguard Worker %a12 = alloca i32, align 4 329*9880d681SAndroid Build Coastguard Worker %v10 = bitcast i8** %args to i8* 330*9880d681SAndroid Build Coastguard Worker call void @llvm.va_start(i8* %v10) 331*9880d681SAndroid Build Coastguard Worker %v11 = va_arg i8** %args, i32 332*9880d681SAndroid Build Coastguard Worker store i32 %v11, i32* %a10, align 4 333*9880d681SAndroid Build Coastguard Worker %v12 = va_arg i8** %args, i32 334*9880d681SAndroid Build Coastguard Worker store i32 %v12, i32* %a11, align 4 335*9880d681SAndroid Build Coastguard Worker %v13 = va_arg i8** %args, i32 336*9880d681SAndroid Build Coastguard Worker store i32 %v13, i32* %a12, align 4 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker ret float 1.0 339*9880d681SAndroid Build Coastguard Worker} 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker; "caller4" calls "foo_vararg" that takes a swifterror parameter. 342*9880d681SAndroid Build Coastguard Workerdefine float @caller4(i8* %error_ref) { 343*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: caller4: 344*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov [[ID:r[0-9]+]], r0 345*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r6, #0 346*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: bl {{.*}}foo_vararg 347*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: cmp r6, #0 348*9880d681SAndroid Build Coastguard Worker; Access part of the error object and save it to error_ref 349*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: ldrbeq [[CODE:r[0-9]+]], [r6, #8] 350*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: strbeq [[CODE]], [{{.*}}[[ID]]] 351*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: mov r0, r6 352*9880d681SAndroid Build Coastguard Worker; CHECK_APPLE: bl {{.*}}free 353*9880d681SAndroid Build Coastguard Workerentry: 354*9880d681SAndroid Build Coastguard Worker %error_ptr_ref = alloca swifterror %swift_error* 355*9880d681SAndroid Build Coastguard Worker store %swift_error* null, %swift_error** %error_ptr_ref 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker %a10 = alloca i32, align 4 358*9880d681SAndroid Build Coastguard Worker %a11 = alloca i32, align 4 359*9880d681SAndroid Build Coastguard Worker %a12 = alloca i32, align 4 360*9880d681SAndroid Build Coastguard Worker store i32 10, i32* %a10, align 4 361*9880d681SAndroid Build Coastguard Worker store i32 11, i32* %a11, align 4 362*9880d681SAndroid Build Coastguard Worker store i32 12, i32* %a12, align 4 363*9880d681SAndroid Build Coastguard Worker %v10 = load i32, i32* %a10, align 4 364*9880d681SAndroid Build Coastguard Worker %v11 = load i32, i32* %a11, align 4 365*9880d681SAndroid Build Coastguard Worker %v12 = load i32, i32* %a12, align 4 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard Worker %call = call float (%swift_error**, ...) @foo_vararg(%swift_error** swifterror %error_ptr_ref, i32 %v10, i32 %v11, i32 %v12) 368*9880d681SAndroid Build Coastguard Worker %error_from_foo = load %swift_error*, %swift_error** %error_ptr_ref 369*9880d681SAndroid Build Coastguard Worker %had_error_from_foo = icmp ne %swift_error* %error_from_foo, null 370*9880d681SAndroid Build Coastguard Worker %tmp = bitcast %swift_error* %error_from_foo to i8* 371*9880d681SAndroid Build Coastguard Worker br i1 %had_error_from_foo, label %handler, label %cont 372*9880d681SAndroid Build Coastguard Worker 373*9880d681SAndroid Build Coastguard Workercont: 374*9880d681SAndroid Build Coastguard Worker %v1 = getelementptr inbounds %swift_error, %swift_error* %error_from_foo, i64 0, i32 1 375*9880d681SAndroid Build Coastguard Worker %t = load i8, i8* %v1 376*9880d681SAndroid Build Coastguard Worker store i8 %t, i8* %error_ref 377*9880d681SAndroid Build Coastguard Worker br label %handler 378*9880d681SAndroid Build Coastguard Workerhandler: 379*9880d681SAndroid Build Coastguard Worker call void @free(i8* %tmp) 380*9880d681SAndroid Build Coastguard Worker ret float 1.0 381*9880d681SAndroid Build Coastguard Worker} 382