blob: 1995b8be179aeaded9952cbcf7ef3221615ff066 [file] [edit]
; 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(...)