1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -loop-reduce -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" 4*9880d681SAndroid Build Coastguard Workertarget triple = "i686-pc-windows-msvc" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare i32 @_except_handler3(...) 7*9880d681SAndroid Build Coastguard Workerdeclare i32 @__CxxFrameHandler3(...) 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdeclare void @external(i32*) 10*9880d681SAndroid Build Coastguard Workerdeclare void @reserve() 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine void @f() personality i32 (...)* @_except_handler3 { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker br label %throw 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerthrow: ; preds = %throw, %entry 17*9880d681SAndroid Build Coastguard Worker %tmp96 = getelementptr inbounds i8, i8* undef, i32 1 18*9880d681SAndroid Build Coastguard Worker invoke void @reserve() 19*9880d681SAndroid Build Coastguard Worker to label %throw unwind label %pad 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerpad: ; preds = %throw 22*9880d681SAndroid Build Coastguard Worker %phi2 = phi i8* [ %tmp96, %throw ] 23*9880d681SAndroid Build Coastguard Worker %cs = catchswitch within none [label %unreachable] unwind label %blah2 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerunreachable: 26*9880d681SAndroid Build Coastguard Worker catchpad within %cs [] 27*9880d681SAndroid Build Coastguard Worker unreachable 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerblah2: 30*9880d681SAndroid Build Coastguard Worker %cleanuppadi4.i.i.i = cleanuppad within none [] 31*9880d681SAndroid Build Coastguard Worker br label %loop_body 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerloop_body: ; preds = %iter, %pad 34*9880d681SAndroid Build Coastguard Worker %tmp99 = phi i8* [ %tmp101, %iter ], [ %phi2, %blah2 ] 35*9880d681SAndroid Build Coastguard Worker %tmp100 = icmp eq i8* %tmp99, undef 36*9880d681SAndroid Build Coastguard Worker br i1 %tmp100, label %unwind_out, label %iter 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workeriter: ; preds = %loop_body 39*9880d681SAndroid Build Coastguard Worker %tmp101 = getelementptr inbounds i8, i8* %tmp99, i32 1 40*9880d681SAndroid Build Coastguard Worker br i1 undef, label %unwind_out, label %loop_body 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerunwind_out: ; preds = %iter, %loop_body 43*9880d681SAndroid Build Coastguard Worker cleanupret from %cleanuppadi4.i.i.i unwind to caller 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @f( 47*9880d681SAndroid Build Coastguard Worker; CHECK: cleanuppad within none [] 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ptrtoint i8* %phi2 to i32 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine void @g() personality i32 (...)* @_except_handler3 { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker br label %throw 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerthrow: ; preds = %throw, %entry 55*9880d681SAndroid Build Coastguard Worker %tmp96 = getelementptr inbounds i8, i8* undef, i32 1 56*9880d681SAndroid Build Coastguard Worker invoke void @reserve() 57*9880d681SAndroid Build Coastguard Worker to label %throw unwind label %pad 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerpad: 60*9880d681SAndroid Build Coastguard Worker %phi2 = phi i8* [ %tmp96, %throw ] 61*9880d681SAndroid Build Coastguard Worker %cs = catchswitch within none [label %unreachable, label %blah] unwind to caller 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerunreachable: 64*9880d681SAndroid Build Coastguard Worker catchpad within %cs [] 65*9880d681SAndroid Build Coastguard Worker unreachable 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerblah: 68*9880d681SAndroid Build Coastguard Worker %catchpad = catchpad within %cs [] 69*9880d681SAndroid Build Coastguard Worker br label %loop_body 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerunwind_out: 72*9880d681SAndroid Build Coastguard Worker catchret from %catchpad to label %leave 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerleave: 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerloop_body: ; preds = %iter, %pad 78*9880d681SAndroid Build Coastguard Worker %tmp99 = phi i8* [ %tmp101, %iter ], [ %phi2, %blah ] 79*9880d681SAndroid Build Coastguard Worker %tmp100 = icmp eq i8* %tmp99, undef 80*9880d681SAndroid Build Coastguard Worker br i1 %tmp100, label %unwind_out, label %iter 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workeriter: ; preds = %loop_body 83*9880d681SAndroid Build Coastguard Worker %tmp101 = getelementptr inbounds i8, i8* %tmp99, i32 1 84*9880d681SAndroid Build Coastguard Worker br i1 undef, label %unwind_out, label %loop_body 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @g( 88*9880d681SAndroid Build Coastguard Worker; CHECK: blah: 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: catchpad within %cs [] 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ptrtoint i8* %phi2 to i32 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine void @h() personality i32 (...)* @_except_handler3 { 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker br label %throw 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerthrow: ; preds = %throw, %entry 98*9880d681SAndroid Build Coastguard Worker %tmp96 = getelementptr inbounds i8, i8* undef, i32 1 99*9880d681SAndroid Build Coastguard Worker invoke void @reserve() 100*9880d681SAndroid Build Coastguard Worker to label %throw unwind label %pad 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerpad: 103*9880d681SAndroid Build Coastguard Worker %cs = catchswitch within none [label %unreachable, label %blug] unwind to caller 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerunreachable: 106*9880d681SAndroid Build Coastguard Worker catchpad within %cs [] 107*9880d681SAndroid Build Coastguard Worker unreachable 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerblug: 110*9880d681SAndroid Build Coastguard Worker %phi2 = phi i8* [ %tmp96, %pad ] 111*9880d681SAndroid Build Coastguard Worker %catchpad = catchpad within %cs [] 112*9880d681SAndroid Build Coastguard Worker br label %loop_body 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerunwind_out: 115*9880d681SAndroid Build Coastguard Worker catchret from %catchpad to label %leave 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerleave: 118*9880d681SAndroid Build Coastguard Worker ret void 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerloop_body: ; preds = %iter, %pad 121*9880d681SAndroid Build Coastguard Worker %tmp99 = phi i8* [ %tmp101, %iter ], [ %phi2, %blug ] 122*9880d681SAndroid Build Coastguard Worker %tmp100 = icmp eq i8* %tmp99, undef 123*9880d681SAndroid Build Coastguard Worker br i1 %tmp100, label %unwind_out, label %iter 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workeriter: ; preds = %loop_body 126*9880d681SAndroid Build Coastguard Worker %tmp101 = getelementptr inbounds i8, i8* %tmp99, i32 1 127*9880d681SAndroid Build Coastguard Worker br i1 undef, label %unwind_out, label %loop_body 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @h( 131*9880d681SAndroid Build Coastguard Worker; CHECK: blug: 132*9880d681SAndroid Build Coastguard Worker; CHECK: catchpad within %cs [] 133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ptrtoint i8* %phi2 to i32 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerdefine void @i() personality i32 (...)* @_except_handler3 { 136*9880d681SAndroid Build Coastguard Workerentry: 137*9880d681SAndroid Build Coastguard Worker br label %throw 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerthrow: ; preds = %throw, %entry 140*9880d681SAndroid Build Coastguard Worker %tmp96 = getelementptr inbounds i8, i8* undef, i32 1 141*9880d681SAndroid Build Coastguard Worker invoke void @reserve() 142*9880d681SAndroid Build Coastguard Worker to label %throw unwind label %catchpad 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workercatchpad: ; preds = %throw 145*9880d681SAndroid Build Coastguard Worker %phi2 = phi i8* [ %tmp96, %throw ] 146*9880d681SAndroid Build Coastguard Worker %cs = catchswitch within none [label %cp_body] unwind label %cleanuppad 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workercp_body: 149*9880d681SAndroid Build Coastguard Worker catchpad within %cs [] 150*9880d681SAndroid Build Coastguard Worker br label %loop_head 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workercleanuppad: 153*9880d681SAndroid Build Coastguard Worker cleanuppad within none [] 154*9880d681SAndroid Build Coastguard Worker br label %loop_head 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerloop_head: 157*9880d681SAndroid Build Coastguard Worker br label %loop_body 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerloop_body: ; preds = %iter, %catchpad 160*9880d681SAndroid Build Coastguard Worker %tmp99 = phi i8* [ %tmp101, %iter ], [ %phi2, %loop_head ] 161*9880d681SAndroid Build Coastguard Worker %tmp100 = icmp eq i8* %tmp99, undef 162*9880d681SAndroid Build Coastguard Worker br i1 %tmp100, label %unwind_out, label %iter 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Workeriter: ; preds = %loop_body 165*9880d681SAndroid Build Coastguard Worker %tmp101 = getelementptr inbounds i8, i8* %tmp99, i32 1 166*9880d681SAndroid Build Coastguard Worker br i1 undef, label %unwind_out, label %loop_body 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerunwind_out: ; preds = %iter, %loop_body 169*9880d681SAndroid Build Coastguard Worker unreachable 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @i( 173*9880d681SAndroid Build Coastguard Worker; CHECK: ptrtoint i8* %phi2 to i32 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32* %b, i32* %c) personality i32 (...)* @__CxxFrameHandler3 { 176*9880d681SAndroid Build Coastguard Workerentry: 177*9880d681SAndroid Build Coastguard Worker br label %for.cond 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerfor.cond: ; preds = %for.inc, %entry 180*9880d681SAndroid Build Coastguard Worker %d.0 = phi i32* [ %b, %entry ], [ %incdec.ptr, %for.inc ] 181*9880d681SAndroid Build Coastguard Worker invoke void @external(i32* %d.0) 182*9880d681SAndroid Build Coastguard Worker to label %for.inc unwind label %catch.dispatch 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %for.cond 185*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %d.0, i32 1 186*9880d681SAndroid Build Coastguard Worker br label %for.cond 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workercatch.dispatch: ; preds = %for.cond 189*9880d681SAndroid Build Coastguard Worker %cs = catchswitch within none [label %catch] unwind label %catch.dispatch.2 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workercatch: ; preds = %catch.dispatch 192*9880d681SAndroid Build Coastguard Worker %0 = catchpad within %cs [i8* null, i32 64, i8* null] 193*9880d681SAndroid Build Coastguard Worker catchret from %0 to label %try.cont 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workertry.cont: ; preds = %catch 196*9880d681SAndroid Build Coastguard Worker invoke void @external(i32* %c) 197*9880d681SAndroid Build Coastguard Worker to label %try.cont.7 unwind label %catch.dispatch.2 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workercatch.dispatch.2: ; preds = %try.cont, %catchendblock 200*9880d681SAndroid Build Coastguard Worker %e.0 = phi i32* [ %c, %try.cont ], [ %b, %catch.dispatch ] 201*9880d681SAndroid Build Coastguard Worker %cs2 = catchswitch within none [label %catch.4] unwind to caller 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Workercatch.4: ; preds = %catch.dispatch.2 204*9880d681SAndroid Build Coastguard Worker catchpad within %cs2 [i8* null, i32 64, i8* null] 205*9880d681SAndroid Build Coastguard Worker unreachable 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Workertry.cont.7: ; preds = %try.cont 208*9880d681SAndroid Build Coastguard Worker ret void 209*9880d681SAndroid Build Coastguard Worker} 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test1( 212*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond: 213*9880d681SAndroid Build Coastguard Worker; CHECK: %d.0 = phi i32* [ %b, %entry ], [ %incdec.ptr, %for.inc ] 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Worker; CHECK: catch.dispatch.2: 216*9880d681SAndroid Build Coastguard Worker; CHECK: %e.0 = phi i32* [ %c, %try.cont ], [ %b, %catch.dispatch ] 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Workerdefine i32 @test2() personality i32 (...)* @_except_handler3 { 219*9880d681SAndroid Build Coastguard Workerentry: 220*9880d681SAndroid Build Coastguard Worker br label %for.body 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.inc, %entry 223*9880d681SAndroid Build Coastguard Worker %phi = phi i32 [ %inc, %for.inc ], [ 0, %entry ] 224*9880d681SAndroid Build Coastguard Worker invoke void @reserve() 225*9880d681SAndroid Build Coastguard Worker to label %for.inc unwind label %catch.dispatch 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Workercatch.dispatch: ; preds = %for.body 228*9880d681SAndroid Build Coastguard Worker %tmp18 = catchswitch within none [label %catch.handler] unwind to caller 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Workercatch.handler: ; preds = %catch.dispatch 231*9880d681SAndroid Build Coastguard Worker %phi.lcssa = phi i32 [ %phi, %catch.dispatch ] 232*9880d681SAndroid Build Coastguard Worker %tmp19 = catchpad within %tmp18 [i8* null] 233*9880d681SAndroid Build Coastguard Worker catchret from %tmp19 to label %done 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Workerdone: 236*9880d681SAndroid Build Coastguard Worker ret i32 %phi.lcssa 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %for.body 239*9880d681SAndroid Build Coastguard Worker %inc = add i32 %phi, 1 240*9880d681SAndroid Build Coastguard Worker br label %for.body 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @test2( 244*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.lcssa = phi i32 [ %phi, %catch.dispatch ] 245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: catchpad within 246