xref: /llvm-project/llvm/test/Transforms/IndVarSimplify/pr39673.ll (revision 6017d9a628fc71e5679c0e80bf6e13c2d55e0a1b)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=indvars -indvars-predicate-loops=0  < %s | FileCheck %s
3
4define i16 @constant() {
5; CHECK-LABEL: @constant(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    br label [[LOOP1:%.*]]
8; CHECK:       loop1:
9; CHECK-NEXT:    [[L1:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[L1_ADD:%.*]], [[LOOP1]] ]
10; CHECK-NEXT:    [[L1_ADD]] = add nuw nsw i16 [[L1]], 1
11; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i16 [[L1_ADD]], 2
12; CHECK-NEXT:    br i1 [[CMP1]], label [[LOOP1]], label [[LOOP2_PREHEADER:%.*]]
13; CHECK:       loop2.preheader:
14; CHECK-NEXT:    br label [[LOOP2:%.*]]
15; CHECK:       loop2:
16; CHECK-NEXT:    [[K2:%.*]] = phi i16 [ [[K2_ADD:%.*]], [[LOOP2]] ], [ 182, [[LOOP2_PREHEADER]] ]
17; CHECK-NEXT:    [[L2:%.*]] = phi i16 [ [[L2_ADD:%.*]], [[LOOP2]] ], [ 0, [[LOOP2_PREHEADER]] ]
18; CHECK-NEXT:    [[L2_ADD]] = add nuw nsw i16 [[L2]], 1
19; CHECK-NEXT:    tail call void @foo(i16 [[K2]])
20; CHECK-NEXT:    [[K2_ADD]] = add nuw nsw i16 [[K2]], 1
21; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i16 [[L2_ADD]], 2
22; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP2]], label [[LOOP2_END:%.*]]
23; CHECK:       loop2.end:
24; CHECK-NEXT:    ret i16 184
25;
26entry:
27  br label %loop1
28
29loop1:                                           ; preds = %entry, %loop1
30  %k1 = phi i16 [ 180, %entry ], [ %k1.add, %loop1 ]
31  %l1 = phi i16 [ 0, %entry ], [ %l1.add, %loop1 ]
32  %k1.add = add nuw nsw i16 %k1, 1
33  %l1.add = add nuw nsw i16 %l1, 1
34  %cmp1 = icmp ult i16 %l1.add, 2
35  br i1 %cmp1, label %loop1, label %loop2.preheader
36
37loop2.preheader:                                 ; preds = %loop1
38  %k1.add.lcssa = phi i16 [ %k1.add, %loop1 ]
39  br label %loop2
40
41loop2:                                           ; preds = %loop2.preheader, %loop2
42  %k2 = phi i16 [ %k2.add, %loop2 ], [ %k1.add.lcssa, %loop2.preheader ]
43  %l2 = phi i16 [ %l2.add, %loop2 ], [ 0, %loop2.preheader ]
44  %l2.add = add nuw i16 %l2, 1
45  tail call void @foo(i16 %k2)
46  %k2.add = add nuw nsw i16 %k2, 1
47  %cmp2 = icmp ult i16 %l2.add, 2
48  br i1 %cmp2, label %loop2, label %loop2.end
49
50loop2.end:                                       ; preds = %loop2
51  %k2.add.lcssa = phi i16 [ %k2.add, %loop2 ]
52  ret i16 %k2.add.lcssa
53}
54
55define i16 @dom_argument(i16 %arg1, i16 %arg2) {
56; CHECK-LABEL: @dom_argument(
57; CHECK-NEXT:  entry:
58; CHECK-NEXT:    br label [[LOOP1:%.*]]
59; CHECK:       loop1:
60; CHECK-NEXT:    [[L1:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[L1_ADD:%.*]], [[LOOP1]] ]
61; CHECK-NEXT:    [[L1_ADD]] = add nuw nsw i16 [[L1]], 1
62; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i16 [[L1_ADD]], 2
63; CHECK-NEXT:    br i1 [[CMP1]], label [[LOOP1]], label [[LOOP2_PREHEADER:%.*]]
64; CHECK:       loop2.preheader:
65; CHECK-NEXT:    br label [[LOOP2:%.*]]
66; CHECK:       loop2:
67; CHECK-NEXT:    [[K2:%.*]] = phi i16 [ [[K2_ADD:%.*]], [[LOOP2]] ], [ [[ARG2:%.*]], [[LOOP2_PREHEADER]] ]
68; CHECK-NEXT:    [[L2:%.*]] = phi i16 [ [[L2_ADD:%.*]], [[LOOP2]] ], [ 0, [[LOOP2_PREHEADER]] ]
69; CHECK-NEXT:    [[L2_ADD]] = add nuw nsw i16 [[L2]], 1
70; CHECK-NEXT:    tail call void @foo(i16 [[K2]])
71; CHECK-NEXT:    [[K2_ADD]] = add nuw nsw i16 [[K2]], 1
72; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i16 [[L2_ADD]], 2
73; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP2]], label [[LOOP2_END:%.*]]
74; CHECK:       loop2.end:
75; CHECK-NEXT:    [[K2_ADD_LCSSA:%.*]] = phi i16 [ [[K2_ADD]], [[LOOP2]] ]
76; CHECK-NEXT:    ret i16 [[K2_ADD_LCSSA]]
77;
78entry:
79  br label %loop1
80
81loop1:                                           ; preds = %entry, %loop1
82  %k1 = phi i16 [ 100, %entry ], [ %k1.add, %loop1 ]
83  %l1 = phi i16 [ 0, %entry ], [ %l1.add, %loop1 ]
84  %selector = phi i16 [ %arg1, %entry ], [ %arg2, %loop1 ]
85  %k1.add = add nuw nsw i16 %k1, 1
86  %l1.add = add nuw nsw i16 %l1, 1
87  %cmp1 = icmp ult i16 %l1.add, 2
88  br i1 %cmp1, label %loop1, label %loop2.preheader
89
90loop2.preheader:                                 ; preds = %loop1
91  %k1.add.lcssa = phi i16 [ %selector, %loop1 ]
92  br label %loop2
93
94loop2:                                           ; preds = %loop2.preheader, %loop2
95  %k2 = phi i16 [ %k2.add, %loop2 ], [ %k1.add.lcssa, %loop2.preheader ]
96  %l2 = phi i16 [ %l2.add, %loop2 ], [ 0, %loop2.preheader ]
97  %l2.add = add nuw i16 %l2, 1
98  tail call void @foo(i16 %k2)
99  %k2.add = add nuw nsw i16 %k2, 1
100  %cmp2 = icmp ult i16 %l2.add, 2
101  br i1 %cmp2, label %loop2, label %loop2.end
102
103loop2.end:                                       ; preds = %loop2
104  %k2.add.lcssa = phi i16 [ %k2.add, %loop2 ]
105  ret i16 %k2.add.lcssa
106}
107
108define i16 @dummy_phi_outside_loop(i16 %arg) {
109; CHECK-LABEL: @dummy_phi_outside_loop(
110; CHECK-NEXT:  entry:
111; CHECK-NEXT:    br label [[LOOP2_PREHEADER:%.*]]
112; CHECK:       loop2.preheader:
113; CHECK-NEXT:    [[DUMMY:%.*]] = phi i16 [ [[ARG:%.*]], [[ENTRY:%.*]] ]
114; CHECK-NEXT:    br label [[LOOP2:%.*]]
115; CHECK:       loop2:
116; CHECK-NEXT:    [[K2:%.*]] = phi i16 [ [[K2_ADD:%.*]], [[LOOP2]] ], [ [[DUMMY]], [[LOOP2_PREHEADER]] ]
117; CHECK-NEXT:    [[L2:%.*]] = phi i16 [ [[L2_ADD:%.*]], [[LOOP2]] ], [ 0, [[LOOP2_PREHEADER]] ]
118; CHECK-NEXT:    [[L2_ADD]] = add nuw nsw i16 [[L2]], 1
119; CHECK-NEXT:    tail call void @foo(i16 [[K2]])
120; CHECK-NEXT:    [[K2_ADD]] = add nuw nsw i16 [[K2]], 1
121; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i16 [[L2_ADD]], 2
122; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP2]], label [[LOOP2_END:%.*]]
123; CHECK:       loop2.end:
124; CHECK-NEXT:    [[K2_ADD_LCSSA:%.*]] = phi i16 [ [[K2_ADD]], [[LOOP2]] ]
125; CHECK-NEXT:    ret i16 [[K2_ADD_LCSSA]]
126;
127entry:
128  br label %loop2.preheader
129
130loop2.preheader:                                 ; preds = %loop1
131  %dummy = phi i16 [ %arg, %entry ]
132  br label %loop2
133
134loop2:                                           ; preds = %loop2.preheader, %loop2
135  %k2 = phi i16 [ %k2.add, %loop2 ], [ %dummy, %loop2.preheader ]
136  %l2 = phi i16 [ %l2.add, %loop2 ], [ 0, %loop2.preheader ]
137  %l2.add = add nuw i16 %l2, 1
138  tail call void @foo(i16 %k2)
139  %k2.add = add nuw nsw i16 %k2, 1
140  %cmp2 = icmp ult i16 %l2.add, 2
141  br i1 %cmp2, label %loop2, label %loop2.end
142
143loop2.end:                                       ; preds = %loop2
144  %k2.add.lcssa = phi i16 [ %k2.add, %loop2 ]
145  ret i16 %k2.add.lcssa
146}
147
148define i16 @neg_loop_carried(i16 %arg) {
149; CHECK-LABEL: @neg_loop_carried(
150; CHECK-NEXT:  entry:
151; CHECK-NEXT:    br label [[LOOP1:%.*]]
152; CHECK:       loop1:
153; CHECK-NEXT:    [[L1:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[L1_ADD:%.*]], [[LOOP1]] ]
154; CHECK-NEXT:    [[L1_ADD]] = add nuw nsw i16 [[L1]], 1
155; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i16 [[L1_ADD]], 2
156; CHECK-NEXT:    br i1 [[CMP1]], label [[LOOP1]], label [[LOOP2_PREHEADER:%.*]]
157; CHECK:       loop2.preheader:
158; CHECK-NEXT:    [[TMP0:%.*]] = add i16 [[ARG:%.*]], 2
159; CHECK-NEXT:    br label [[LOOP2:%.*]]
160; CHECK:       loop2:
161; CHECK-NEXT:    [[K2:%.*]] = phi i16 [ [[K2_ADD:%.*]], [[LOOP2]] ], [ [[TMP0]], [[LOOP2_PREHEADER]] ]
162; CHECK-NEXT:    [[L2:%.*]] = phi i16 [ [[L2_ADD:%.*]], [[LOOP2]] ], [ 0, [[LOOP2_PREHEADER]] ]
163; CHECK-NEXT:    [[L2_ADD]] = add nuw nsw i16 [[L2]], 1
164; CHECK-NEXT:    tail call void @foo(i16 [[K2]])
165; CHECK-NEXT:    [[K2_ADD]] = add nuw nsw i16 [[K2]], 1
166; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i16 [[L2_ADD]], 2
167; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP2]], label [[LOOP2_END:%.*]]
168; CHECK:       loop2.end:
169; CHECK-NEXT:    [[K2_ADD_LCSSA:%.*]] = phi i16 [ [[K2_ADD]], [[LOOP2]] ]
170; CHECK-NEXT:    ret i16 [[K2_ADD_LCSSA]]
171;
172entry:
173  br label %loop1
174
175loop1:                                           ; preds = %entry, %loop1
176  %k1 = phi i16 [ %arg, %entry ], [ %k1.add, %loop1 ]
177  %l1 = phi i16 [ 0, %entry ], [ %l1.add, %loop1 ]
178  %k1.add = add nuw nsw i16 %k1, 1
179  %l1.add = add nuw nsw i16 %l1, 1
180  %cmp1 = icmp ult i16 %l1.add, 2
181  br i1 %cmp1, label %loop1, label %loop2.preheader
182
183loop2.preheader:                                 ; preds = %loop1
184  %k1.add.lcssa = phi i16 [ %k1.add, %loop1 ]
185  br label %loop2
186
187loop2:                                           ; preds = %loop2.preheader, %loop2
188  %k2 = phi i16 [ %k2.add, %loop2 ], [ %k1.add.lcssa, %loop2.preheader ]
189  %l2 = phi i16 [ %l2.add, %loop2 ], [ 0, %loop2.preheader ]
190  %l2.add = add nuw i16 %l2, 1
191  tail call void @foo(i16 %k2)
192  %k2.add = add nuw nsw i16 %k2, 1
193  %cmp2 = icmp ult i16 %l2.add, 2
194  br i1 %cmp2, label %loop2, label %loop2.end
195
196loop2.end:                                       ; preds = %loop2
197  %k2.add.lcssa = phi i16 [ %k2.add, %loop2 ]
198  ret i16 %k2.add.lcssa
199}
200
201
202declare void @foo(i16)
203