[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / UnifyLoopExits / basic.ll
blobc69996e823e4c52f1f8cb97b5b153fb0eaa0e036
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -unify-loop-exits -enable-new-pm=0 -S | FileCheck %s
3 ; RUN: opt < %s -passes='lowerswitch,unify-loop-exits' -S | FileCheck %s
5 define void @loop_1(i1 %PredEntry, i1 %PredB, i1 %PredC, i1 %PredD) {
6 ; CHECK-LABEL: @loop_1(
7 ; CHECK-NEXT:  entry:
8 ; CHECK-NEXT:    br i1 [[PREDENTRY:%.*]], label [[A:%.*]], label [[G:%.*]]
9 ; CHECK:       A:
10 ; CHECK-NEXT:    br label [[B:%.*]]
11 ; CHECK:       B:
12 ; CHECK-NEXT:    br i1 [[PREDB:%.*]], label [[C:%.*]], label [[LOOP_EXIT_GUARD:%.*]]
13 ; CHECK:       C:
14 ; CHECK-NEXT:    br i1 [[PREDC:%.*]], label [[D:%.*]], label [[LOOP_EXIT_GUARD]]
15 ; CHECK:       D:
16 ; CHECK-NEXT:    br i1 [[PREDD:%.*]], label [[A]], label [[LOOP_EXIT_GUARD]]
17 ; CHECK:       E:
18 ; CHECK-NEXT:    br label [[EXIT:%.*]]
19 ; CHECK:       F:
20 ; CHECK-NEXT:    br label [[EXIT]]
21 ; CHECK:       G:
22 ; CHECK-NEXT:    br label [[F:%.*]]
23 ; CHECK:       exit:
24 ; CHECK-NEXT:    ret void
25 ; CHECK:       loop.exit.guard:
26 ; CHECK-NEXT:    [[GUARD_E:%.*]] = phi i1 [ true, [[B]] ], [ false, [[C]] ], [ false, [[D]] ]
27 ; CHECK-NEXT:    br i1 [[GUARD_E]], label [[E:%.*]], label [[F]]
29 entry:
30   br i1 %PredEntry, label %A, label %G
33   br label %B
36   br i1 %PredB, label %C, label %E
39   br i1 %PredC, label %D, label %F
42   br i1 %PredD, label %A, label %F
45   br label %exit
48   br label %exit
51   br label %F
53 exit:
54   ret void
57 define void @loop_2(i1 %PredA, i1 %PredB, i1 %PredC) {
58 ; CHECK-LABEL: @loop_2(
59 ; CHECK-NEXT:  entry:
60 ; CHECK-NEXT:    br label [[A:%.*]]
61 ; CHECK:       A:
62 ; CHECK-NEXT:    br i1 [[PREDA:%.*]], label [[B:%.*]], label [[LOOP_EXIT_GUARD:%.*]]
63 ; CHECK:       B:
64 ; CHECK-NEXT:    br i1 [[PREDB:%.*]], label [[C:%.*]], label [[LOOP_EXIT_GUARD]]
65 ; CHECK:       C:
66 ; CHECK-NEXT:    br i1 [[PREDC:%.*]], label [[D:%.*]], label [[LOOP_EXIT_GUARD]]
67 ; CHECK:       D:
68 ; CHECK-NEXT:    br label [[A]]
69 ; CHECK:       X:
70 ; CHECK-NEXT:    br label [[EXIT:%.*]]
71 ; CHECK:       Y:
72 ; CHECK-NEXT:    br label [[EXIT]]
73 ; CHECK:       Z:
74 ; CHECK-NEXT:    br label [[EXIT]]
75 ; CHECK:       exit:
76 ; CHECK-NEXT:    ret void
77 ; CHECK:       loop.exit.guard:
78 ; CHECK-NEXT:    [[GUARD_X:%.*]] = phi i1 [ true, [[A]] ], [ false, [[B]] ], [ false, [[C]] ]
79 ; CHECK-NEXT:    [[GUARD_Y:%.*]] = phi i1 [ false, [[A]] ], [ true, [[B]] ], [ false, [[C]] ]
80 ; CHECK-NEXT:    br i1 [[GUARD_X]], label [[X:%.*]], label [[LOOP_EXIT_GUARD1:%.*]]
81 ; CHECK:       loop.exit.guard1:
82 ; CHECK-NEXT:    br i1 [[GUARD_Y]], label [[Y:%.*]], label [[Z:%.*]]
84 entry:
85   br label %A
88   br i1 %PredA, label %B, label %X
91   br i1 %PredB, label %C, label %Y
94   br i1 %PredC, label %D, label %Z
97   br label %A
100   br label %exit
103   br label %exit
106   br label %exit
108 exit:
109   ret void