; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt < %s -loop-reduce -S | FileCheck %s target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-windows-msvc" ; Check that we do not segfault by moving an iterator past the end of a basic ; block. define void @f() personality ptr @__CxxFrameHandler3 { ; CHECK-LABEL: define void @f() personality ptr @__CxxFrameHandler3 { ; CHECK-NEXT: [[ENTRY:.*]]: ; CHECK-NEXT: br label %[[FOR_COND_I:.*]] ; CHECK: [[FOR_COND_I]]: ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i64 [ [[LSR_IV_NEXT:%.*]], %[[FOR_INC_I:.*]] ], [ 0, %[[ENTRY]] ] ; CHECK-NEXT: [[LSR_IV_LCSSA1:%.*]] = inttoptr i64 [[LSR_IV]] to ptr ; CHECK-NEXT: invoke void @g() ; CHECK-NEXT: to label %[[FOR_INC_I]] unwind label %[[CATCH_DISPATCH_I:.*]] ; CHECK: [[CATCH_DISPATCH_I]]: ; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label %[[FOR_COND_1_PREHEADER_I:.*]]] unwind to caller ; CHECK: [[FOR_COND_1_PREHEADER_I]]: ; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] [ptr null, i32 64, ptr null] ; CHECK-NEXT: [[CMP_I:%.*]] = icmp eq ptr [[LSR_IV_LCSSA1]], null ; CHECK-NEXT: br label %[[FOR_COND_1_I:.*]] ; CHECK: [[FOR_COND_1_I]]: ; CHECK-NEXT: br i1 [[CMP_I]], label %[[FOR_END_I:.*]], label %[[FOR_BODY_I:.*]] ; CHECK: [[FOR_BODY_I]]: ; CHECK-NEXT: call void @g() ; CHECK-NEXT: br label %[[FOR_COND_1_I]] ; CHECK: [[FOR_INC_I]]: ; CHECK-NEXT: [[LSR_IV_NEXT]] = add i64 [[LSR_IV]], -4 ; CHECK-NEXT: br label %[[FOR_COND_I]] ; CHECK: [[FOR_END_I]]: ; CHECK-NEXT: catchret from [[TMP0]] to label %[[LEAVE:.*]] ; CHECK: [[LEAVE]]: ; CHECK-NEXT: ret void ; entry: br label %for.cond.i for.cond.i: ; preds = %for.inc.i, %entry %_First.addr.0.i = phi ptr [ null, %entry ], [ %incdec.ptr.i, %for.inc.i ] invoke void @g() to label %for.inc.i unwind label %catch.dispatch.i catch.dispatch.i: ; preds = %for.cond.i %cs = catchswitch within none [label %for.cond.1.preheader.i] unwind to caller for.cond.1.preheader.i: ; preds = %catch.dispatch.i %0 = catchpad within %cs [ptr null, i32 64, ptr null] %cmp.i = icmp eq ptr %_First.addr.0.i, null br label %for.cond.1.i for.cond.1.i: ; preds = %for.body.i, %for.cond.1.preheader.i br i1 %cmp.i, label %for.end.i, label %for.body.i for.body.i: ; preds = %for.cond.1.i call void @g() br label %for.cond.1.i for.inc.i: ; preds = %for.cond.i %incdec.ptr.i = getelementptr inbounds i32, ptr %_First.addr.0.i, i64 1 br label %for.cond.i for.end.i: ; preds = %for.cond.1.i catchret from %0 to label %leave leave: ; preds = %for.end.i ret void } declare void @g() declare i32 @__CxxFrameHandler3(...)