154 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -disable-output -passes=print-mustexecute %s 2>&1 | FileCheck %s3 4define i1 @header_with_icf(ptr noalias %p, i32 %high) {5; CHECK-LABEL: @header_with_icf(6; CHECK-LABEL: loop:7; CHECK: %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] ; (mustexec in: loop)8; CHECK: %v = load i32, ptr %p, align 4 ; (mustexec in: loop)9; CHECK: call void @maythrow_and_use(i32 %v) ; (mustexec in: loop)10; CHECK-NOT: mustexec11 12entry:13 br label %loop14 15loop:16 %iv = phi i32 [0, %entry], [%iv.next, %loop]17 %v = load i32, ptr %p18 call void @maythrow_and_use(i32 %v)19 %iv.next = add nsw nuw i32 %iv, 120 %exit.test = icmp slt i32 %iv, %high21 br i1 %exit.test, label %exit, label %loop22 23exit:24 ret i1 false25}26 27define i1 @split_header(ptr noalias %p, i32 %high) {28; CHECK-LABEL: @split_header(29; CHECK-LABEL: loop:30; CHECK: %iv = phi i32 [ 0, %entry ], [ %iv.next, %next ] ; (mustexec in: loop)31; CHECK: %v = load i32, ptr %p, align 4 ; (mustexec in: loop)32; CHECK: br label %next ; (mustexec in: loop)33; CHECK-NOT: mustexec34entry:35 br label %loop36 37loop:38 %iv = phi i32 [0, %entry], [%iv.next, %next]39 %v = load i32, ptr %p40 br label %next41next:42 call void @maythrow_and_use(i32 %v)43 %iv.next = add nsw nuw i32 %iv, 144 %exit.test = icmp slt i32 %iv, %high45 br i1 %exit.test, label %exit, label %loop46 47exit:48 ret i1 false49}50 51; FIXME: everything in inner loop header should be must execute52; for outer as well53define i1 @nested(ptr noalias %p, i32 %high) {54; CHECK-LABEL: @nested55; CHECK-LABEL: loop: ; preds = %next56; CHECK: %iv = phi i32 [ 0, %entry ], [ %iv.next, %next ] ; (mustexec in: loop)57; CHECK: br label %inner_loop ; (mustexec in: loop)58; CHECK-LABEL: inner_loop:59; CHECK: %v = load i32, ptr %p, align 4 ; (mustexec in: inner_loop)60; CHECK: %inner.test = icmp eq i32 %v, 0 ; (mustexec in: inner_loop)61; CHECK: br i1 %inner.test, label %inner_loop, label %next ; (mustexec in: inner_loop)62; CHECK-NOT: mustexec63 64entry:65 br label %loop66 67loop:68 %iv = phi i32 [0, %entry], [%iv.next, %next]69 br label %inner_loop70 71inner_loop:72 %v = load i32, ptr %p73 %inner.test = icmp eq i32 %v, 074 br i1 %inner.test, label %inner_loop, label %next75 76next:77 call void @maythrow_and_use(i32 %v)78 %iv.next = add nsw nuw i32 %iv, 179 %exit.test = icmp slt i32 %iv, %high80 br i1 %exit.test, label %exit, label %loop81 82exit:83 ret i1 false84}85 86define i1 @nested_no_throw(ptr noalias %p, i32 %high) {87; CHECK-LABEL: @nested_no_throw88; CHECK-LABEL: loop: ; preds = %next89; CHECK: %iv = phi i32 [ 0, %entry ], [ %iv.next, %next ] ; (mustexec in: loop)90; CHECK: br label %inner_loop ; (mustexec in: loop)91; CHECK-LABEL: inner_loop:92; CHECK: %v = load i32, ptr %p, align 4 ; (mustexec in 2 loops: inner_loop, loop)93; CHECK: %inner.test = icmp eq i32 %v, 0 ; (mustexec in 2 loops: inner_loop, loop)94; CHECK: br i1 %inner.test, label %inner_loop, label %next ; (mustexec in 2 loops: inner_loop, loop)95; CHECK-LABEL: next:96; CHECK: %iv.next = add nuw nsw i32 %iv, 1 ; (mustexec in: loop)97; CHECK: %exit.test = icmp slt i32 %iv, %high ; (mustexec in: loop)98; CHECK: br i1 %exit.test, label %exit, label %loop ; (mustexec in: loop)99 100entry:101 br label %loop102 103loop:104 %iv = phi i32 [0, %entry], [%iv.next, %next]105 br label %inner_loop106 107inner_loop:108 %v = load i32, ptr %p109 %inner.test = icmp eq i32 %v, 0110 br i1 %inner.test, label %inner_loop, label %next111 112next:113 %iv.next = add nsw nuw i32 %iv, 1114 %exit.test = icmp slt i32 %iv, %high115 br i1 %exit.test, label %exit, label %loop116 117exit:118 ret i1 false119}120 121; Since all the instructions in the loop dominate the only exit122; and there's no implicit control flow in the loop, all must execute123; FIXME: handled by loop safety info, test it124define i1 @nothrow_loop(ptr noalias %p, i32 %high) {125; CHECK-LABEL: @nothrow_loop(126; CHECK-LABEL: loop:127; CHECK: %iv = phi i32 [ 0, %entry ], [ %iv.next, %next ] ; (mustexec in: loop)128; CHECK: br label %next ; (mustexec in: loop)129; CHECK-LABEL: next:130; CHECK: %v = load i32, ptr %p, align 4 ; (mustexec in: loop)131; CHECK: %iv.next = add nuw nsw i32 %iv, 1 ; (mustexec in: loop)132; CHECK: %exit.test = icmp slt i32 %iv, %high ; (mustexec in: loop)133; CHECK: br i1 %exit.test, label %exit, label %loop ; (mustexec in: loop)134; CHECK-NOT: mustexec135 136entry:137 br label %loop138 139loop:140 %iv = phi i32 [0, %entry], [%iv.next, %next]141 br label %next142next:143 %v = load i32, ptr %p144 %iv.next = add nsw nuw i32 %iv, 1145 %exit.test = icmp slt i32 %iv, %high146 br i1 %exit.test, label %exit, label %loop147 148exit:149 ret i1 false150}151 152 153declare void @maythrow_and_use(i32)154