1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O1 -mtriple thumbv7-apple-ios6 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; Just make sure no one tries to make the assumption that the normal edge of an 3*9880d681SAndroid Build Coastguard Worker; invoke is never a critical edge. Previously, this code would assert. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker%struct.__CFString = type opaque 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare void @bar(%struct.__CFString*, %struct.__CFString*) 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine noalias i8* @foo(i8* nocapture %inRefURL) noreturn ssp personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) { 10*9880d681SAndroid Build Coastguard Workerentry: 11*9880d681SAndroid Build Coastguard Worker %call = tail call %struct.__CFString* @bar3() 12*9880d681SAndroid Build Coastguard Worker %call2 = invoke i8* @bar2() 13*9880d681SAndroid Build Coastguard Worker to label %for.cond unwind label %lpad 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerfor.cond: ; preds = %entry, %for.cond 16*9880d681SAndroid Build Coastguard Worker invoke void @bar(%struct.__CFString* undef, %struct.__CFString* null) 17*9880d681SAndroid Build Coastguard Worker to label %for.cond unwind label %lpad5 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerlpad: ; preds = %entry 20*9880d681SAndroid Build Coastguard Worker %0 = landingpad { i8*, i32 } 21*9880d681SAndroid Build Coastguard Worker cleanup 22*9880d681SAndroid Build Coastguard Worker %1 = extractvalue { i8*, i32 } %0, 0 23*9880d681SAndroid Build Coastguard Worker %2 = extractvalue { i8*, i32 } %0, 1 24*9880d681SAndroid Build Coastguard Worker br label %ehcleanup 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerlpad5: ; preds = %for.cond 27*9880d681SAndroid Build Coastguard Worker %3 = landingpad { i8*, i32 } 28*9880d681SAndroid Build Coastguard Worker cleanup 29*9880d681SAndroid Build Coastguard Worker %4 = extractvalue { i8*, i32 } %3, 0 30*9880d681SAndroid Build Coastguard Worker %5 = extractvalue { i8*, i32 } %3, 1 31*9880d681SAndroid Build Coastguard Worker invoke void @release(i8* %call2) 32*9880d681SAndroid Build Coastguard Worker to label %ehcleanup unwind label %terminate.lpad.i.i16 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerterminate.lpad.i.i16: ; preds = %lpad5 35*9880d681SAndroid Build Coastguard Worker %6 = landingpad { i8*, i32 } 36*9880d681SAndroid Build Coastguard Worker catch i8* null 37*9880d681SAndroid Build Coastguard Worker tail call void @terminatev() noreturn nounwind 38*9880d681SAndroid Build Coastguard Worker unreachable 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerehcleanup: ; preds = %lpad5, %lpad 41*9880d681SAndroid Build Coastguard Worker %exn.slot.0 = phi i8* [ %1, %lpad ], [ %4, %lpad5 ] 42*9880d681SAndroid Build Coastguard Worker %ehselector.slot.0 = phi i32 [ %2, %lpad ], [ %5, %lpad5 ] 43*9880d681SAndroid Build Coastguard Worker %7 = bitcast %struct.__CFString* %call to i8* 44*9880d681SAndroid Build Coastguard Worker invoke void @release(i8* %7) 45*9880d681SAndroid Build Coastguard Worker to label %_ZN5SmartIPK10__CFStringED1Ev.exit unwind label %terminate.lpad.i.i 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerterminate.lpad.i.i: ; preds = %ehcleanup 48*9880d681SAndroid Build Coastguard Worker %8 = landingpad { i8*, i32 } 49*9880d681SAndroid Build Coastguard Worker catch i8* null 50*9880d681SAndroid Build Coastguard Worker tail call void @terminatev() noreturn nounwind 51*9880d681SAndroid Build Coastguard Worker unreachable 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker_ZN5SmartIPK10__CFStringED1Ev.exit: ; preds = %ehcleanup 54*9880d681SAndroid Build Coastguard Worker %lpad.val = insertvalue { i8*, i32 } undef, i8* %exn.slot.0, 0 55*9880d681SAndroid Build Coastguard Worker %lpad.val12 = insertvalue { i8*, i32 } %lpad.val, i32 %ehselector.slot.0, 1 56*9880d681SAndroid Build Coastguard Worker resume { i8*, i32 } %lpad.val12 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdeclare %struct.__CFString* @bar3() 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdeclare i8* @bar2() 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_sj0(...) 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdeclare void @release(i8*) 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdeclare void @terminatev() 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; Make sure that the instruction DemoteRegToStack inserts to reload 70*9880d681SAndroid Build Coastguard Worker; %call.i.i.i14.i.i follows the instruction that saves the value to the stack in 71*9880d681SAndroid Build Coastguard Worker; basic block %entry.do.body.i.i.i_crit_edge. 72*9880d681SAndroid Build Coastguard Worker; Previously, DemoteRegToStack would insert a load instruction into the entry 73*9880d681SAndroid Build Coastguard Worker; block to reload %call.i.i.i14.i.i before the phi instruction (%0) in block 74*9880d681SAndroid Build Coastguard Worker; %do.body.i.i.i. 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: __Z4foo1c: 77*9880d681SAndroid Build Coastguard Worker; CHECK: bl __Znwm 78*9880d681SAndroid Build Coastguard Worker; CHECK: {{.*}}@ %do.body.i.i.i.preheader 79*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, [[OFFSET:#[0-9]+]]] 80*9880d681SAndroid Build Coastguard Worker; CHECK: {{.*}}@ %do.body.i.i.i 81*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[R0:r[0-9]+]], [sp, [[OFFSET]]] 82*9880d681SAndroid Build Coastguard Worker; CHECK: cbz [[R0]] 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker%"class.std::__1::basic_string" = type { %"class.std::__1::__compressed_pair" } 85*9880d681SAndroid Build Coastguard Worker%"class.std::__1::__compressed_pair" = type { %"class.std::__1::__libcpp_compressed_pair_imp" } 86*9880d681SAndroid Build Coastguard Worker%"class.std::__1::__libcpp_compressed_pair_imp" = type { %"struct.std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__rep" } 87*9880d681SAndroid Build Coastguard Worker%"struct.std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__rep" = type { %union.anon } 88*9880d681SAndroid Build Coastguard Worker%union.anon = type { %"struct.std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__long" } 89*9880d681SAndroid Build Coastguard Worker%"struct.std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__long" = type { i32, i32, i8* } 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker@.str = private unnamed_addr constant [12 x i8] c"some_string\00", align 1 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine void @_Z4foo1c(i8 signext %a) personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) { 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker %s1 = alloca %"class.std::__1::basic_string", align 4 96*9880d681SAndroid Build Coastguard Worker call void @_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm(%"class.std::__1::basic_string"* %s1, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0), i32 11) 97*9880d681SAndroid Build Coastguard Worker %call.i.i.i14.i.i = invoke noalias i8* @_Znwm(i32 1024) 98*9880d681SAndroid Build Coastguard Worker to label %do.body.i.i.i unwind label %lpad.body 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerdo.body.i.i.i: ; preds = %entry, %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i 101*9880d681SAndroid Build Coastguard Worker %lsr.iv = phi i32 [ %lsr.iv.next, %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i ], [ -1024, %entry ] 102*9880d681SAndroid Build Coastguard Worker %0 = phi i8* [ %incdec.ptr.i.i.i, %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i ], [ %call.i.i.i14.i.i, %entry ] 103*9880d681SAndroid Build Coastguard Worker %new.isnull.i.i.i.i = icmp eq i8* %0, null 104*9880d681SAndroid Build Coastguard Worker br i1 %new.isnull.i.i.i.i, label %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i, label %new.notnull.i.i.i.i 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workernew.notnull.i.i.i.i: ; preds = %do.body.i.i.i 107*9880d681SAndroid Build Coastguard Worker store i8 %a, i8* %0, align 1 108*9880d681SAndroid Build Coastguard Worker br label %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i: ; preds = %new.notnull.i.i.i.i, %do.body.i.i.i 111*9880d681SAndroid Build Coastguard Worker %1 = phi i8* [ null, %do.body.i.i.i ], [ %0, %new.notnull.i.i.i.i ] 112*9880d681SAndroid Build Coastguard Worker %incdec.ptr.i.i.i = getelementptr inbounds i8, i8* %1, i32 1 113*9880d681SAndroid Build Coastguard Worker %lsr.iv.next = add i32 %lsr.iv, 1 114*9880d681SAndroid Build Coastguard Worker %cmp.i16.i.i = icmp eq i32 %lsr.iv.next, 0 115*9880d681SAndroid Build Coastguard Worker br i1 %cmp.i16.i.i, label %invoke.cont, label %do.body.i.i.i 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerinvoke.cont: ; preds = %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i 118*9880d681SAndroid Build Coastguard Worker invoke void @_Z4foo2Pci(i8* %call.i.i.i14.i.i, i32 1024) 119*9880d681SAndroid Build Coastguard Worker to label %invoke.cont5 unwind label %lpad2 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerinvoke.cont5: ; preds = %invoke.cont 122*9880d681SAndroid Build Coastguard Worker %cmp.i.i.i15 = icmp eq i8* %call.i.i.i14.i.i, null 123*9880d681SAndroid Build Coastguard Worker br i1 %cmp.i.i.i15, label %invoke.cont6, label %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i19 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i19: ; preds = %invoke.cont5 126*9880d681SAndroid Build Coastguard Worker call void @_ZdlPv(i8* %call.i.i.i14.i.i) 127*9880d681SAndroid Build Coastguard Worker br label %invoke.cont6 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerinvoke.cont6: ; preds = %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i19, %invoke.cont5 130*9880d681SAndroid Build Coastguard Worker %call10 = call %"class.std::__1::basic_string"* @_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(%"class.std::__1::basic_string"* %s1) 131*9880d681SAndroid Build Coastguard Worker ret void 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerlpad.body: ; preds = %entry 134*9880d681SAndroid Build Coastguard Worker %2 = landingpad { i8*, i32 } 135*9880d681SAndroid Build Coastguard Worker cleanup 136*9880d681SAndroid Build Coastguard Worker %3 = extractvalue { i8*, i32 } %2, 0 137*9880d681SAndroid Build Coastguard Worker %4 = extractvalue { i8*, i32 } %2, 1 138*9880d681SAndroid Build Coastguard Worker br label %ehcleanup 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerlpad2: ; preds = %invoke.cont 141*9880d681SAndroid Build Coastguard Worker %5 = landingpad { i8*, i32 } 142*9880d681SAndroid Build Coastguard Worker cleanup 143*9880d681SAndroid Build Coastguard Worker %6 = extractvalue { i8*, i32 } %5, 0 144*9880d681SAndroid Build Coastguard Worker %7 = extractvalue { i8*, i32 } %5, 1 145*9880d681SAndroid Build Coastguard Worker %cmp.i.i.i21 = icmp eq i8* %call.i.i.i14.i.i, null 146*9880d681SAndroid Build Coastguard Worker br i1 %cmp.i.i.i21, label %ehcleanup, label %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i26 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i26: ; preds = %lpad2 149*9880d681SAndroid Build Coastguard Worker call void @_ZdlPv(i8* %call.i.i.i14.i.i) 150*9880d681SAndroid Build Coastguard Worker br label %ehcleanup 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerehcleanup: ; preds = %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i26, %lpad2, %lpad.body 153*9880d681SAndroid Build Coastguard Worker %exn.slot.0 = phi i8* [ %3, %lpad.body ], [ %6, %lpad2 ], [ %6, %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i26 ] 154*9880d681SAndroid Build Coastguard Worker %ehselector.slot.0 = phi i32 [ %4, %lpad.body ], [ %7, %lpad2 ], [ %7, %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i26 ] 155*9880d681SAndroid Build Coastguard Worker %call12 = invoke %"class.std::__1::basic_string"* @_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(%"class.std::__1::basic_string"* %s1) 156*9880d681SAndroid Build Coastguard Worker to label %eh.resume unwind label %terminate.lpad 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workereh.resume: ; preds = %ehcleanup 159*9880d681SAndroid Build Coastguard Worker %lpad.val = insertvalue { i8*, i32 } undef, i8* %exn.slot.0, 0 160*9880d681SAndroid Build Coastguard Worker %lpad.val13 = insertvalue { i8*, i32 } %lpad.val, i32 %ehselector.slot.0, 1 161*9880d681SAndroid Build Coastguard Worker resume { i8*, i32 } %lpad.val13 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerterminate.lpad: ; preds = %ehcleanup 164*9880d681SAndroid Build Coastguard Worker %8 = landingpad { i8*, i32 } 165*9880d681SAndroid Build Coastguard Worker catch i8* null 166*9880d681SAndroid Build Coastguard Worker %9 = extractvalue { i8*, i32 } %8, 0 167*9880d681SAndroid Build Coastguard Worker call void @__clang_call_terminate(i8* %9) 168*9880d681SAndroid Build Coastguard Worker unreachable 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdeclare void @_Z4foo2Pci(i8*, i32) 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdefine linkonce_odr hidden void @__clang_call_terminate(i8*) { 174*9880d681SAndroid Build Coastguard Worker %2 = tail call i8* @__cxa_begin_catch(i8* %0) 175*9880d681SAndroid Build Coastguard Worker tail call void @_ZSt9terminatev() 176*9880d681SAndroid Build Coastguard Worker unreachable 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerdeclare i8* @__cxa_begin_catch(i8*) 180*9880d681SAndroid Build Coastguard Workerdeclare void @_ZSt9terminatev() 181*9880d681SAndroid Build Coastguard Workerdeclare %"class.std::__1::basic_string"* @_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(%"class.std::__1::basic_string"* returned) 182*9880d681SAndroid Build Coastguard Workerdeclare void @_ZdlPv(i8*) #3 183*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @_Znwm(i32) 184*9880d681SAndroid Build Coastguard Workerdeclare void @_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm(%"class.std::__1::basic_string"*, i8*, i32) 185*9880d681SAndroid Build Coastguard Workerdeclare void @_Unwind_SjLj_Register({ i8*, i32, [4 x i32], i8*, i8*, [5 x i8*] }*) 186*9880d681SAndroid Build Coastguard Workerdeclare void @_Unwind_SjLj_Unregister({ i8*, i32, [4 x i32], i8*, i8*, [5 x i8*] }*) 187*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.frameaddress(i32) 188*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.stacksave() 189*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.stackrestore(i8*) 190*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.eh.sjlj.setjmp(i8*) 191*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.eh.sjlj.lsda() 192*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.eh.sjlj.callsite(i32) 193*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.eh.sjlj.functioncontext(i8*) 194