| ; 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(...) |