Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / IndVarSimplify / trivial-guard.ll
blobc1c9a90d9831dc5377a2a4a9ae6254760a84b0c9
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=indvars -S < %s | FileCheck %s
4 declare i1 @cond()
6 define 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
40 entry:
41   br i1 true, label %loop.1, label %loop.2
43 loop.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
48 guarded.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
53 loop.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
58 guarded.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
63 exit:
64   ret void
66 fail:
67   unreachable
70 define 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
104 entry:
105   br i1 false, label %loop.1, label %loop.2
107 loop.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
112 guarded.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
117 loop.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
122 guarded.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
127 exit:
128   ret void
130 fail:
131   unreachable