xref: /llvm-project/llvm/test/Transforms/IndVarSimplify/trivial-guard.ll (revision f15ed06a65de2715130ffeba5ed3698a08047d27)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=indvars -S < %s | FileCheck %s
3
4declare i1 @cond()
5
6define void @test_01(i32 %x) {
7; CHECK-LABEL: @test_01(
8; CHECK-NEXT:  entry:
9; CHECK-NEXT:    br i1 true, label [[LOOP_1_PREHEADER:%.*]], label [[LOOP_2_PREHEADER:%.*]]
10; CHECK:       loop.2.preheader:
11; CHECK-NEXT:    br label [[LOOP_2:%.*]]
12; CHECK:       loop.1.preheader:
13; CHECK-NEXT:    br label [[LOOP_1:%.*]]
14; CHECK:       loop.1:
15; CHECK-NEXT:    [[IV_1:%.*]] = phi i32 [ [[IV_NEXT_1:%.*]], [[GUARDED_1:%.*]] ], [ 0, [[LOOP_1_PREHEADER]] ]
16; CHECK-NEXT:    [[CHECK_1:%.*]] = icmp slt i32 [[IV_1]], [[X:%.*]]
17; CHECK-NEXT:    br i1 [[CHECK_1]], label [[GUARDED_1]], label [[FAIL_LOOPEXIT:%.*]]
18; CHECK:       guarded.1:
19; CHECK-NEXT:    [[IV_NEXT_1]] = add nuw nsw i32 [[IV_1]], 1
20; CHECK-NEXT:    [[LOOP_COND_1:%.*]] = call i1 @cond()
21; CHECK-NEXT:    br i1 [[LOOP_COND_1]], label [[LOOP_1]], label [[EXIT_LOOPEXIT:%.*]]
22; CHECK:       loop.2:
23; CHECK-NEXT:    br i1 true, label [[GUARDED_2:%.*]], label [[FAIL_LOOPEXIT1:%.*]]
24; CHECK:       guarded.2:
25; CHECK-NEXT:    [[LOOP_COND_2:%.*]] = call i1 @cond()
26; CHECK-NEXT:    br i1 [[LOOP_COND_2]], label [[LOOP_2]], label [[EXIT_LOOPEXIT2:%.*]]
27; CHECK:       exit.loopexit:
28; CHECK-NEXT:    br label [[EXIT:%.*]]
29; CHECK:       exit.loopexit2:
30; CHECK-NEXT:    br label [[EXIT]]
31; CHECK:       exit:
32; CHECK-NEXT:    ret void
33; CHECK:       fail.loopexit:
34; CHECK-NEXT:    br label [[FAIL:%.*]]
35; CHECK:       fail.loopexit1:
36; CHECK-NEXT:    br label [[FAIL]]
37; CHECK:       fail:
38; CHECK-NEXT:    unreachable
39;
40entry:
41  br i1 true, label %loop.1, label %loop.2
42
43loop.1:
44  %iv.1 = phi i32 [0, %entry], [%iv.next.1, %guarded.1]
45  %check.1 = icmp slt i32 %iv.1, %x
46  br i1 %check.1, label %guarded.1, label %fail
47
48guarded.1:
49  %iv.next.1 = add i32 %iv.1, 1
50  %loop.cond.1 = call i1 @cond()
51  br i1 %loop.cond.1, label %loop.1, label %exit
52
53loop.2:
54  %iv.2 = phi i32 [0, %entry], [%iv.next.2, %guarded.2]
55  %check.2 = icmp slt i32 %iv.2, %x
56  br i1 %check.2, label %guarded.2, label %fail
57
58guarded.2:
59  %iv.next.2 = add i32 %iv.2, 1
60  %loop.cond.2 = call i1 @cond()
61  br i1 %loop.cond.2, label %loop.2, label %exit
62
63exit:
64  ret void
65
66fail:
67  unreachable
68}
69
70define void @test_02(i32 %x) {
71; CHECK-LABEL: @test_02(
72; CHECK-NEXT:  entry:
73; CHECK-NEXT:    br i1 false, label [[LOOP_1_PREHEADER:%.*]], label [[LOOP_2_PREHEADER:%.*]]
74; CHECK:       loop.2.preheader:
75; CHECK-NEXT:    br label [[LOOP_2:%.*]]
76; CHECK:       loop.1.preheader:
77; CHECK-NEXT:    br label [[LOOP_1:%.*]]
78; CHECK:       loop.1:
79; CHECK-NEXT:    br i1 true, label [[GUARDED_1:%.*]], label [[FAIL_LOOPEXIT:%.*]]
80; CHECK:       guarded.1:
81; CHECK-NEXT:    [[LOOP_COND_1:%.*]] = call i1 @cond()
82; CHECK-NEXT:    br i1 [[LOOP_COND_1]], label [[LOOP_1]], label [[EXIT_LOOPEXIT:%.*]]
83; CHECK:       loop.2:
84; CHECK-NEXT:    [[IV_2:%.*]] = phi i32 [ [[IV_NEXT_2:%.*]], [[GUARDED_2:%.*]] ], [ 0, [[LOOP_2_PREHEADER]] ]
85; CHECK-NEXT:    [[CHECK_2:%.*]] = icmp slt i32 [[IV_2]], [[X:%.*]]
86; CHECK-NEXT:    br i1 [[CHECK_2]], label [[GUARDED_2]], label [[FAIL_LOOPEXIT1:%.*]]
87; CHECK:       guarded.2:
88; CHECK-NEXT:    [[IV_NEXT_2]] = add nuw nsw i32 [[IV_2]], 1
89; CHECK-NEXT:    [[LOOP_COND_2:%.*]] = call i1 @cond()
90; CHECK-NEXT:    br i1 [[LOOP_COND_2]], label [[LOOP_2]], label [[EXIT_LOOPEXIT2:%.*]]
91; CHECK:       exit.loopexit:
92; CHECK-NEXT:    br label [[EXIT:%.*]]
93; CHECK:       exit.loopexit2:
94; CHECK-NEXT:    br label [[EXIT]]
95; CHECK:       exit:
96; CHECK-NEXT:    ret void
97; CHECK:       fail.loopexit:
98; CHECK-NEXT:    br label [[FAIL:%.*]]
99; CHECK:       fail.loopexit1:
100; CHECK-NEXT:    br label [[FAIL]]
101; CHECK:       fail:
102; CHECK-NEXT:    unreachable
103;
104entry:
105  br i1 false, label %loop.1, label %loop.2
106
107loop.1:
108  %iv.1 = phi i32 [0, %entry], [%iv.next.1, %guarded.1]
109  %check.1 = icmp slt i32 %iv.1, %x
110  br i1 %check.1, label %guarded.1, label %fail
111
112guarded.1:
113  %iv.next.1 = add i32 %iv.1, 1
114  %loop.cond.1 = call i1 @cond()
115  br i1 %loop.cond.1, label %loop.1, label %exit
116
117loop.2:
118  %iv.2 = phi i32 [0, %entry], [%iv.next.2, %guarded.2]
119  %check.2 = icmp slt i32 %iv.2, %x
120  br i1 %check.2, label %guarded.2, label %fail
121
122guarded.2:
123  %iv.next.2 = add i32 %iv.2, 1
124  %loop.cond.2 = call i1 @cond()
125  br i1 %loop.cond.2, label %loop.2, label %exit
126
127exit:
128  ret void
129
130fail:
131  unreachable
132}
133