1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; XFAIL: *
3; REQUIRES: asserts
4; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -loop-simplifycfg -verify-loop-info -verify-dom-info -verify-loop-lcssa < %s | FileCheck %s
5; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -passes='require<domtree>,loop(simplify-cfg)' -verify-loop-info -verify-dom-info -verify-loop-lcssa < %s | FileCheck %s
6; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -loop-simplifycfg -enable-mssa-loop-dependency=true -verify-memoryssa -verify-loop-info -verify-dom-info -verify-loop-lcssa < %s | FileCheck %s
7
8target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
9
10define void @c() {
11; CHECK-LABEL: @c(
12; CHECK-NEXT:  entry:
13; CHECK-NEXT:    br label [[D:%.*]]
14; CHECK:       d.loopexit:
15; CHECK-NEXT:    [[DOTLCSSA:%.*]] = phi i32 [ [[TMP1:%.*]], [[FOR_COND:%.*]] ]
16; CHECK-NEXT:    br label [[D]]
17; CHECK:       d:
18; CHECK-NEXT:    [[TMP0:%.*]] = phi i32 [ undef, [[ENTRY:%.*]] ], [ [[DOTLCSSA]], [[D_LOOPEXIT:%.*]] ]
19; CHECK-NEXT:    br label [[FOR_COND]]
20; CHECK:       for.cond:
21; CHECK-NEXT:    [[TMP1]] = phi i32 [ [[TMP0]], [[D]] ], [ 0, [[IF_END:%.*]] ]
22; CHECK-NEXT:    [[TOBOOL2:%.*]] = icmp eq i32 [[TMP1]], 0
23; CHECK-NEXT:    br i1 [[TOBOOL2]], label [[IF_END]], label [[D_LOOPEXIT]]
24; CHECK:       if.end:
25; CHECK-NEXT:    br label [[FOR_COND]]
26;
27entry:
28  br label %d
29
30d.loopexit:                                       ; preds = %if.end.7, %for.body
31  %.lcssa = phi i32 [ %1, %for.body ], [ 0, %if.end.7 ]
32  br label %d
33
34d:                                                ; preds = %d.loopexit, %entry
35  %0 = phi i32 [ undef, %entry ], [ %.lcssa, %d.loopexit ]
36  br label %for.cond
37
38for.cond:                                         ; preds = %if.end.8, %d
39  %1 = phi i32 [ %0, %d ], [ 0, %if.end.8 ]
40  br label %for.body
41
42for.body:                                         ; preds = %for.cond
43  %tobool2 = icmp eq i32 %1, 0
44  br i1 %tobool2, label %if.end, label %d.loopexit
45
46if.end:                                           ; preds = %for.body
47  br label %if.end.7
48
49if.end.7:                                         ; preds = %if.end
50  br i1 true, label %if.end.8, label %d.loopexit
51
52if.end.8:                                         ; preds = %if.end.7
53  br label %for.cond
54}
55
56define void @test_01() {
57; CHECK-LABEL: @test_01(
58; CHECK-NEXT:  entry:
59; CHECK-NEXT:    br label [[FOR_COND:%.*]]
60; CHECK:       for.cond.loopexit:
61; CHECK-NEXT:    br label [[FOR_COND]]
62; CHECK:       for.cond:
63; CHECK-NEXT:    [[INC41_LCSSA3:%.*]] = phi i16 [ undef, [[FOR_COND_LOOPEXIT:%.*]] ], [ undef, [[ENTRY:%.*]] ]
64; CHECK-NEXT:    switch i32 0, label [[FOR_COND_SPLIT:%.*]] [
65; CHECK-NEXT:    i32 1, label [[FOR_COND_LOOPEXIT]]
66; CHECK-NEXT:    ]
67; CHECK:       for.cond-split:
68; CHECK-NEXT:    [[INC41_LCSSA3_LCSSA:%.*]] = phi i16 [ [[INC41_LCSSA3]], [[FOR_COND]] ]
69; CHECK-NEXT:    br label [[WHILE_COND:%.*]]
70; CHECK:       while.cond:
71; CHECK-NEXT:    [[INC41:%.*]] = phi i16 [ [[INC4:%.*]], [[WHILE_COND]] ], [ [[INC41_LCSSA3_LCSSA]], [[FOR_COND_SPLIT]] ]
72; CHECK-NEXT:    [[INC4]] = add nsw i16 [[INC41]], 1
73; CHECK-NEXT:    br label [[WHILE_COND]]
74;
75entry:
76  br label %for.cond
77
78for.cond.loopexit:                                ; preds = %while.cond
79  %inc41.lcssa = phi i16 [ %inc41, %while.cond ]
80  br label %for.cond
81
82for.cond:                                         ; preds = %for.cond.loopexit, %entry
83  %inc41.lcssa3 = phi i16 [ %inc41.lcssa, %for.cond.loopexit ], [ undef, %entry ]
84  br label %while.cond
85
86while.cond:                                       ; preds = %while.body, %for.cond
87  %inc41 = phi i16 [ %inc4, %while.body ], [ %inc41.lcssa3, %for.cond ]
88  br i1 true, label %while.body, label %for.cond.loopexit
89
90while.body:                                       ; preds = %while.cond
91  %inc4 = add nsw i16 %inc41, 1
92  br label %while.cond
93}
94
95define void @bar() {
96
97; CHECK-LABEL: @bar
98
99bb:
100  br label %bb1
101
102bb1:                                              ; preds = %bb6, %bb
103  %tmp = phi i32 [ %tmp7, %bb6 ], [ undef, %bb ]
104  br i1 false, label %bb2, label %bb4
105
106bb2:                                              ; preds = %bb1
107  switch i32 undef, label %bb10 [
108    i32 0, label %bb3
109    i32 1, label %bb8
110  ]
111
112bb3:                                              ; preds = %bb2
113  br label %bb6
114
115bb4:                                              ; preds = %bb1
116  switch i32 undef, label %bb5 [
117    i32 0, label %bb6
118    i32 1, label %bb8
119  ]
120
121bb5:                                              ; preds = %bb4
122  ret void
123
124bb6:                                              ; preds = %bb4, %bb3
125  %tmp7 = add i32 undef, 123
126  br label %bb1
127
128bb8:                                              ; preds = %bb4, %bb2
129  %tmp9 = phi i32 [ %tmp, %bb2 ], [ %tmp, %bb4 ]
130  %use = add i32 %tmp9, 1
131  ret void
132
133bb10:                                             ; preds = %bb2
134  ret void
135}
136