Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / UnifyLoopExits / basic.ll
blobccd15d4e6b9436ba033c113370b81aff9c4ca810
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes='lower-switch,unify-loop-exits' -S | FileCheck %s
4 define void @loop_1(i1 %PredEntry, i1 %PredB, i1 %PredC, i1 %PredD) {
5 ; CHECK-LABEL: @loop_1(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    br i1 [[PREDENTRY:%.*]], label [[A:%.*]], label [[G:%.*]]
8 ; CHECK:       A:
9 ; CHECK-NEXT:    br label [[B:%.*]]
10 ; CHECK:       B:
11 ; CHECK-NEXT:    br i1 [[PREDB:%.*]], label [[C:%.*]], label [[LOOP_EXIT_GUARD:%.*]]
12 ; CHECK:       C:
13 ; CHECK-NEXT:    br i1 [[PREDC:%.*]], label [[D:%.*]], label [[LOOP_EXIT_GUARD]]
14 ; CHECK:       D:
15 ; CHECK-NEXT:    br i1 [[PREDD:%.*]], label [[A]], label [[LOOP_EXIT_GUARD]]
16 ; CHECK:       E:
17 ; CHECK-NEXT:    br label [[EXIT:%.*]]
18 ; CHECK:       F:
19 ; CHECK-NEXT:    br label [[EXIT]]
20 ; CHECK:       G:
21 ; CHECK-NEXT:    br label [[F:%.*]]
22 ; CHECK:       exit:
23 ; CHECK-NEXT:    ret void
24 ; CHECK:       loop.exit.guard:
25 ; CHECK-NEXT:    [[GUARD_E:%.*]] = phi i1 [ true, [[B]] ], [ false, [[C]] ], [ false, [[D]] ]
26 ; CHECK-NEXT:    br i1 [[GUARD_E]], label [[E:%.*]], label [[F]]
28 entry:
29   br i1 %PredEntry, label %A, label %G
32   br label %B
35   br i1 %PredB, label %C, label %E
38   br i1 %PredC, label %D, label %F
41   br i1 %PredD, label %A, label %F
44   br label %exit
47   br label %exit
50   br label %F
52 exit:
53   ret void
56 define void @loop_2(i1 %PredA, i1 %PredB, i1 %PredC) {
57 ; CHECK-LABEL: @loop_2(
58 ; CHECK-NEXT:  entry:
59 ; CHECK-NEXT:    br label [[A:%.*]]
60 ; CHECK:       A:
61 ; CHECK-NEXT:    br i1 [[PREDA:%.*]], label [[B:%.*]], label [[LOOP_EXIT_GUARD:%.*]]
62 ; CHECK:       B:
63 ; CHECK-NEXT:    br i1 [[PREDB:%.*]], label [[C:%.*]], label [[LOOP_EXIT_GUARD]]
64 ; CHECK:       C:
65 ; CHECK-NEXT:    br i1 [[PREDC:%.*]], label [[D:%.*]], label [[LOOP_EXIT_GUARD]]
66 ; CHECK:       D:
67 ; CHECK-NEXT:    br label [[A]]
68 ; CHECK:       X:
69 ; CHECK-NEXT:    br label [[EXIT:%.*]]
70 ; CHECK:       Y:
71 ; CHECK-NEXT:    br label [[EXIT]]
72 ; CHECK:       Z:
73 ; CHECK-NEXT:    br label [[EXIT]]
74 ; CHECK:       exit:
75 ; CHECK-NEXT:    ret void
76 ; CHECK:       loop.exit.guard:
77 ; CHECK-NEXT:    [[GUARD_X:%.*]] = phi i1 [ true, [[A]] ], [ false, [[B]] ], [ false, [[C]] ]
78 ; CHECK-NEXT:    [[GUARD_Y:%.*]] = phi i1 [ false, [[A]] ], [ true, [[B]] ], [ false, [[C]] ]
79 ; CHECK-NEXT:    br i1 [[GUARD_X]], label [[X:%.*]], label [[LOOP_EXIT_GUARD1:%.*]]
80 ; CHECK:       loop.exit.guard1:
81 ; CHECK-NEXT:    br i1 [[GUARD_Y]], label [[Y:%.*]], label [[Z:%.*]]
83 entry:
84   br label %A
87   br i1 %PredA, label %B, label %X
90   br i1 %PredB, label %C, label %Y
93   br i1 %PredC, label %D, label %Z
96   br label %A
99   br label %exit
102   br label %exit
105   br label %exit
107 exit:
108   ret void