blob: 3e729993d425e788a6c1265eb25d74d364b3e6f8 [file] [log] [blame]
Philip Reamesce998ad2018-03-20 18:43:44 +00001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -disable-output -print-mustexecute %s 2>&1 | FileCheck %s
Philip Reames89f22412018-03-20 17:09:21 +00003
Philip Reames89f22412018-03-20 17:09:21 +00004define i1 @header_with_icf(i32* noalias %p, i32 %high) {
Philip Reamesce998ad2018-03-20 18:43:44 +00005; 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, i32* %p ; (mustexec in: loop)
9; CHECK: call void @maythrow_and_use(i32 %v) ; (mustexec in: loop)
10; CHECK-NOT: mustexec
11
Philip Reames89f22412018-03-20 17:09:21 +000012entry:
13 br label %loop
14
15loop:
16 %iv = phi i32 [0, %entry], [%iv.next, %loop]
17 %v = load i32, i32* %p
18 call void @maythrow_and_use(i32 %v)
19 %iv.next = add nsw nuw i32 %iv, 1
20 %exit.test = icmp slt i32 %iv, %high
21 br i1 %exit.test, label %exit, label %loop
22
23exit:
24 ret i1 false
25}
26
Philip Reamesce998ad2018-03-20 18:43:44 +000027define i1 @split_header(i32* 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, i32* %p ; (mustexec in: loop)
32; CHECK: br label %next ; (mustexec in: loop)
33; CHECK-NOT: mustexec
Philip Reames89f22412018-03-20 17:09:21 +000034entry:
35 br label %loop
36
37loop:
38 %iv = phi i32 [0, %entry], [%iv.next, %next]
39 %v = load i32, i32* %p
40 br label %next
41next:
42 call void @maythrow_and_use(i32 %v)
43 %iv.next = add nsw nuw i32 %iv, 1
44 %exit.test = icmp slt i32 %iv, %high
45 br i1 %exit.test, label %exit, label %loop
46
47exit:
48 ret i1 false
49}
50
Philip Reamesce998ad2018-03-20 18:43:44 +000051; FIXME: everything in inner loop header should be must execute
52; for outer as well
Philip Reames89f22412018-03-20 17:09:21 +000053define i1 @nested(i32* noalias %p, i32 %high) {
Philip Reamesce998ad2018-03-20 18:43:44 +000054; CHECK-LABEL: @nested
55; CHECK-LABEL: loop: ; preds = %next
56; 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, i32* %p ; (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: mustexec
63
Philip Reames89f22412018-03-20 17:09:21 +000064entry:
65 br label %loop
66
67loop:
68 %iv = phi i32 [0, %entry], [%iv.next, %next]
69 br label %inner_loop
70
71inner_loop:
72 %v = load i32, i32* %p
73 %inner.test = icmp eq i32 %v, 0
74 br i1 %inner.test, label %inner_loop, label %next
75
76next:
77 call void @maythrow_and_use(i32 %v)
78 %iv.next = add nsw nuw i32 %iv, 1
79 %exit.test = icmp slt i32 %iv, %high
80 br i1 %exit.test, label %exit, label %loop
81
82exit:
83 ret i1 false
84}
85
Philip Reames164b1b42018-03-20 22:55:20 +000086; Since all the instructions in the loop dominate the only exit
87; and there's no implicit control flow in the loop, all must execute
88; FIXME: handled by loop safety info, test it
89define i1 @nothrow_loop(i32* noalias %p, i32 %high) {
90; CHECK-LABEL: @nothrow_loop(
Philip Reames37a1a292018-03-20 23:00:54 +000091; CHECK-LABEL: loop:
Philip Reames164b1b42018-03-20 22:55:20 +000092; CHECK: %iv = phi i32 [ 0, %entry ], [ %iv.next, %next ] ; (mustexec in: loop)
93; CHECK: br label %next ; (mustexec in: loop)
Philip Reames37a1a292018-03-20 23:00:54 +000094; CHECK-LABEL: next:
95; CHECK: %v = load i32, i32* %p ; (mustexec in: loop)
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)
Philip Reames164b1b42018-03-20 22:55:20 +000099; CHECK-NOT: mustexec
100
101entry:
102 br label %loop
103
104loop:
105 %iv = phi i32 [0, %entry], [%iv.next, %next]
106 br label %next
107next:
108 %v = load i32, i32* %p
109 %iv.next = add nsw nuw i32 %iv, 1
110 %exit.test = icmp slt i32 %iv, %high
111 br i1 %exit.test, label %exit, label %loop
112
113exit:
114 ret i1 false
115}
116
Philip Reames89f22412018-03-20 17:09:21 +0000117
118declare void @maythrow_and_use(i32)