347 lines · plain
1; RUN: opt -verify-loop-info -irce-print-changed-loops -passes=irce < %s 2>&1 | FileCheck %s2; RUN: opt -verify-loop-info -irce-print-changed-loops -passes='require<branch-prob>,irce' < %s 2>&1 | FileCheck %s3 4; This test checks if we update the LoopInfo correctly in the presence5; of parents, uncles and cousins.6 7; Function Attrs: alwaysinline8define void @inner_loop(ptr %arr, ptr %a_len_ptr, i32 %n) #0 {9; CHECK: irce: in function inner_loop: constrained Loop at depth 1 containing: %loop<header><exiting>,%in.bounds<latch><exiting>10 11entry:12 %len = load i32, ptr %a_len_ptr, !range !013 %first.itr.check = icmp sgt i32 %n, 014 br i1 %first.itr.check, label %loop, label %exit15 16loop: ; preds = %in.bounds, %entry17 %idx = phi i32 [ 0, %entry ], [ %idx.next, %in.bounds ]18 %idx.next = add i32 %idx, 119 %abc = icmp slt i32 %idx, %len20 br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !121 22in.bounds: ; preds = %loop23 %addr = getelementptr i32, ptr %arr, i32 %idx24 store i32 0, ptr %addr25 %next = icmp slt i32 %idx.next, %n26 br i1 %next, label %loop, label %exit27 28out.of.bounds: ; preds = %loop29 ret void30 31exit: ; preds = %in.bounds, %entry32 ret void33}34 35; Function Attrs: alwaysinline36define void @with_parent(ptr %arr, ptr %a_len_ptr, i32 %n, i32 %parent.count) #0 {37; CHECK: irce: in function with_parent: constrained Loop at depth 2 containing: %loop.i<header><exiting>,%in.bounds.i<latch><exiting>38 39entry:40 br label %loop41 42loop: ; preds = %inner_loop.exit, %entry43 %idx = phi i32 [ 0, %entry ], [ %idx.next, %inner_loop.exit ]44 %idx.next = add i32 %idx, 145 %next = icmp ult i32 %idx.next, %parent.count46 %len.i = load i32, ptr %a_len_ptr, !range !047 %first.itr.check.i = icmp sgt i32 %n, 048 br i1 %first.itr.check.i, label %loop.i, label %exit.i49 50loop.i: ; preds = %in.bounds.i, %loop51 %idx.i = phi i32 [ 0, %loop ], [ %idx.next.i, %in.bounds.i ]52 %idx.next.i = add i32 %idx.i, 153 %abc.i = icmp slt i32 %idx.i, %len.i54 br i1 %abc.i, label %in.bounds.i, label %out.of.bounds.i, !prof !155 56in.bounds.i: ; preds = %loop.i57 %addr.i = getelementptr i32, ptr %arr, i32 %idx.i58 store i32 0, ptr %addr.i59 %next.i = icmp slt i32 %idx.next.i, %n60 br i1 %next.i, label %loop.i, label %exit.i61 62out.of.bounds.i: ; preds = %loop.i63 br label %inner_loop.exit64 65exit.i: ; preds = %in.bounds.i, %loop66 br label %inner_loop.exit67 68inner_loop.exit: ; preds = %exit.i, %out.of.bounds.i69 br i1 %next, label %loop, label %exit70 71exit: ; preds = %inner_loop.exit72 ret void73}74 75; Function Attrs: alwaysinline76define void @with_grandparent(ptr %arr, ptr %a_len_ptr, i32 %n, i32 %parent.count, i32 %grandparent.count) #0 {77; CHECK: irce: in function with_grandparent: constrained Loop at depth 3 containing: %loop.i.i<header><exiting>,%in.bounds.i.i<latch><exiting>78 79entry:80 br label %loop81 82loop: ; preds = %with_parent.exit, %entry83 %idx = phi i32 [ 0, %entry ], [ %idx.next, %with_parent.exit ]84 %idx.next = add i32 %idx, 185 %next = icmp ult i32 %idx.next, %grandparent.count86 br label %loop.i87 88loop.i: ; preds = %inner_loop.exit.i, %loop89 %idx.i = phi i32 [ 0, %loop ], [ %idx.next.i, %inner_loop.exit.i ]90 %idx.next.i = add i32 %idx.i, 191 %next.i = icmp ult i32 %idx.next.i, %parent.count92 %len.i.i = load i32, ptr %a_len_ptr, !range !093 %first.itr.check.i.i = icmp sgt i32 %n, 094 br i1 %first.itr.check.i.i, label %loop.i.i, label %exit.i.i95 96loop.i.i: ; preds = %in.bounds.i.i, %loop.i97 %idx.i.i = phi i32 [ 0, %loop.i ], [ %idx.next.i.i, %in.bounds.i.i ]98 %idx.next.i.i = add i32 %idx.i.i, 199 %abc.i.i = icmp slt i32 %idx.i.i, %len.i.i100 br i1 %abc.i.i, label %in.bounds.i.i, label %out.of.bounds.i.i, !prof !1101 102in.bounds.i.i: ; preds = %loop.i.i103 %addr.i.i = getelementptr i32, ptr %arr, i32 %idx.i.i104 store i32 0, ptr %addr.i.i105 %next.i.i = icmp slt i32 %idx.next.i.i, %n106 br i1 %next.i.i, label %loop.i.i, label %exit.i.i107 108out.of.bounds.i.i: ; preds = %loop.i.i109 br label %inner_loop.exit.i110 111exit.i.i: ; preds = %in.bounds.i.i, %loop.i112 br label %inner_loop.exit.i113 114inner_loop.exit.i: ; preds = %exit.i.i, %out.of.bounds.i.i115 br i1 %next.i, label %loop.i, label %with_parent.exit116 117with_parent.exit: ; preds = %inner_loop.exit.i118 br i1 %next, label %loop, label %exit119 120exit: ; preds = %with_parent.exit121 ret void122}123 124; Function Attrs: alwaysinline125define void @with_sibling(ptr %arr, ptr %a_len_ptr, i32 %n, i32 %parent.count) #0 {126; CHECK: irce: in function with_sibling: constrained Loop at depth 2 containing: %loop.i<header><exiting>,%in.bounds.i<latch><exiting>127; CHECK: irce: in function with_sibling: constrained Loop at depth 2 containing: %loop.i6<header><exiting>,%in.bounds.i9<latch><exiting>128 129entry:130 br label %loop131 132loop: ; preds = %inner_loop.exit12, %entry133 %idx = phi i32 [ 0, %entry ], [ %idx.next, %inner_loop.exit12 ]134 %idx.next = add i32 %idx, 1135 %next = icmp ult i32 %idx.next, %parent.count136 %len.i = load i32, ptr %a_len_ptr, !range !0137 %first.itr.check.i = icmp sgt i32 %n, 0138 br i1 %first.itr.check.i, label %loop.i, label %exit.i139 140loop.i: ; preds = %in.bounds.i, %loop141 %idx.i = phi i32 [ 0, %loop ], [ %idx.next.i, %in.bounds.i ]142 %idx.next.i = add i32 %idx.i, 1143 %abc.i = icmp slt i32 %idx.i, %len.i144 br i1 %abc.i, label %in.bounds.i, label %out.of.bounds.i, !prof !1145 146in.bounds.i: ; preds = %loop.i147 %addr.i = getelementptr i32, ptr %arr, i32 %idx.i148 store i32 0, ptr %addr.i149 %next.i = icmp slt i32 %idx.next.i, %n150 br i1 %next.i, label %loop.i, label %exit.i151 152out.of.bounds.i: ; preds = %loop.i153 br label %inner_loop.exit154 155exit.i: ; preds = %in.bounds.i, %loop156 br label %inner_loop.exit157 158inner_loop.exit: ; preds = %exit.i, %out.of.bounds.i159 %len.i1 = load i32, ptr %a_len_ptr, !range !0160 %first.itr.check.i2 = icmp sgt i32 %n, 0161 br i1 %first.itr.check.i2, label %loop.i6, label %exit.i11162 163loop.i6: ; preds = %in.bounds.i9, %inner_loop.exit164 %idx.i3 = phi i32 [ 0, %inner_loop.exit ], [ %idx.next.i4, %in.bounds.i9 ]165 %idx.next.i4 = add i32 %idx.i3, 1166 %abc.i5 = icmp slt i32 %idx.i3, %len.i1167 br i1 %abc.i5, label %in.bounds.i9, label %out.of.bounds.i10, !prof !1168 169in.bounds.i9: ; preds = %loop.i6170 %addr.i7 = getelementptr i32, ptr %arr, i32 %idx.i3171 store i32 0, ptr %addr.i7172 %next.i8 = icmp slt i32 %idx.next.i4, %n173 br i1 %next.i8, label %loop.i6, label %exit.i11174 175out.of.bounds.i10: ; preds = %loop.i6176 br label %inner_loop.exit12177 178exit.i11: ; preds = %in.bounds.i9, %inner_loop.exit179 br label %inner_loop.exit12180 181inner_loop.exit12: ; preds = %exit.i11, %out.of.bounds.i10182 br i1 %next, label %loop, label %exit183 184exit: ; preds = %inner_loop.exit12185 ret void186}187 188; Function Attrs: alwaysinline189define void @with_cousin(ptr %arr, ptr %a_len_ptr, i32 %n, i32 %parent.count, i32 %grandparent.count) #0 {190; CHECK: irce: in function with_cousin: constrained Loop at depth 3 containing: %loop.i.i<header><exiting>,%in.bounds.i.i<latch><exiting>191; CHECK: irce: in function with_cousin: constrained Loop at depth 3 containing: %loop.i.i10<header><exiting>,%in.bounds.i.i13<latch><exiting>192 193entry:194 br label %loop195 196loop: ; preds = %with_parent.exit17, %entry197 %idx = phi i32 [ 0, %entry ], [ %idx.next, %with_parent.exit17 ]198 %idx.next = add i32 %idx, 1199 %next = icmp ult i32 %idx.next, %grandparent.count200 br label %loop.i201 202loop.i: ; preds = %inner_loop.exit.i, %loop203 %idx.i = phi i32 [ 0, %loop ], [ %idx.next.i, %inner_loop.exit.i ]204 %idx.next.i = add i32 %idx.i, 1205 %next.i = icmp ult i32 %idx.next.i, %parent.count206 %len.i.i = load i32, ptr %a_len_ptr, !range !0207 %first.itr.check.i.i = icmp sgt i32 %n, 0208 br i1 %first.itr.check.i.i, label %loop.i.i, label %exit.i.i209 210loop.i.i: ; preds = %in.bounds.i.i, %loop.i211 %idx.i.i = phi i32 [ 0, %loop.i ], [ %idx.next.i.i, %in.bounds.i.i ]212 %idx.next.i.i = add i32 %idx.i.i, 1213 %abc.i.i = icmp slt i32 %idx.i.i, %len.i.i214 br i1 %abc.i.i, label %in.bounds.i.i, label %out.of.bounds.i.i, !prof !1215 216in.bounds.i.i: ; preds = %loop.i.i217 %addr.i.i = getelementptr i32, ptr %arr, i32 %idx.i.i218 store i32 0, ptr %addr.i.i219 %next.i.i = icmp slt i32 %idx.next.i.i, %n220 br i1 %next.i.i, label %loop.i.i, label %exit.i.i221 222out.of.bounds.i.i: ; preds = %loop.i.i223 br label %inner_loop.exit.i224 225exit.i.i: ; preds = %in.bounds.i.i, %loop.i226 br label %inner_loop.exit.i227 228inner_loop.exit.i: ; preds = %exit.i.i, %out.of.bounds.i.i229 br i1 %next.i, label %loop.i, label %with_parent.exit230 231with_parent.exit: ; preds = %inner_loop.exit.i232 br label %loop.i6233 234loop.i6: ; preds = %inner_loop.exit.i16, %with_parent.exit235 %idx.i1 = phi i32 [ 0, %with_parent.exit ], [ %idx.next.i2, %inner_loop.exit.i16 ]236 %idx.next.i2 = add i32 %idx.i1, 1237 %next.i3 = icmp ult i32 %idx.next.i2, %parent.count238 %len.i.i4 = load i32, ptr %a_len_ptr, !range !0239 %first.itr.check.i.i5 = icmp sgt i32 %n, 0240 br i1 %first.itr.check.i.i5, label %loop.i.i10, label %exit.i.i15241 242loop.i.i10: ; preds = %in.bounds.i.i13, %loop.i6243 %idx.i.i7 = phi i32 [ 0, %loop.i6 ], [ %idx.next.i.i8, %in.bounds.i.i13 ]244 %idx.next.i.i8 = add i32 %idx.i.i7, 1245 %abc.i.i9 = icmp slt i32 %idx.i.i7, %len.i.i4246 br i1 %abc.i.i9, label %in.bounds.i.i13, label %out.of.bounds.i.i14, !prof !1247 248in.bounds.i.i13: ; preds = %loop.i.i10249 %addr.i.i11 = getelementptr i32, ptr %arr, i32 %idx.i.i7250 store i32 0, ptr %addr.i.i11251 %next.i.i12 = icmp slt i32 %idx.next.i.i8, %n252 br i1 %next.i.i12, label %loop.i.i10, label %exit.i.i15253 254out.of.bounds.i.i14: ; preds = %loop.i.i10255 br label %inner_loop.exit.i16256 257exit.i.i15: ; preds = %in.bounds.i.i13, %loop.i6258 br label %inner_loop.exit.i16259 260inner_loop.exit.i16: ; preds = %exit.i.i15, %out.of.bounds.i.i14261 br i1 %next.i3, label %loop.i6, label %with_parent.exit17262 263with_parent.exit17: ; preds = %inner_loop.exit.i16264 br i1 %next, label %loop, label %exit265 266exit: ; preds = %with_parent.exit17267 ret void268}269 270; Function Attrs: alwaysinline271define void @with_uncle(ptr %arr, ptr %a_len_ptr, i32 %n, i32 %parent.count, i32 %grandparent.count) #0 {272; CHECK: irce: in function with_uncle: constrained Loop at depth 2 containing: %loop.i<header><exiting>,%in.bounds.i<latch><exiting>273; CHECK: irce: in function with_uncle: constrained Loop at depth 3 containing: %loop.i.i<header><exiting>,%in.bounds.i.i<latch><exiting>274 275entry:276 br label %loop277 278loop: ; preds = %with_parent.exit, %entry279 %idx = phi i32 [ 0, %entry ], [ %idx.next, %with_parent.exit ]280 %idx.next = add i32 %idx, 1281 %next = icmp ult i32 %idx.next, %grandparent.count282 %len.i = load i32, ptr %a_len_ptr, !range !0283 %first.itr.check.i = icmp sgt i32 %n, 0284 br i1 %first.itr.check.i, label %loop.i, label %exit.i285 286loop.i: ; preds = %in.bounds.i, %loop287 %idx.i = phi i32 [ 0, %loop ], [ %idx.next.i, %in.bounds.i ]288 %idx.next.i = add i32 %idx.i, 1289 %abc.i = icmp slt i32 %idx.i, %len.i290 br i1 %abc.i, label %in.bounds.i, label %out.of.bounds.i, !prof !1291 292in.bounds.i: ; preds = %loop.i293 %addr.i = getelementptr i32, ptr %arr, i32 %idx.i294 store i32 0, ptr %addr.i295 %next.i = icmp slt i32 %idx.next.i, %n296 br i1 %next.i, label %loop.i, label %exit.i297 298out.of.bounds.i: ; preds = %loop.i299 br label %inner_loop.exit300 301exit.i: ; preds = %in.bounds.i, %loop302 br label %inner_loop.exit303 304inner_loop.exit: ; preds = %exit.i, %out.of.bounds.i305 br label %loop.i4306 307loop.i4: ; preds = %inner_loop.exit.i, %inner_loop.exit308 %idx.i1 = phi i32 [ 0, %inner_loop.exit ], [ %idx.next.i2, %inner_loop.exit.i ]309 %idx.next.i2 = add i32 %idx.i1, 1310 %next.i3 = icmp ult i32 %idx.next.i2, %parent.count311 %len.i.i = load i32, ptr %a_len_ptr, !range !0312 %first.itr.check.i.i = icmp sgt i32 %n, 0313 br i1 %first.itr.check.i.i, label %loop.i.i, label %exit.i.i314 315loop.i.i: ; preds = %in.bounds.i.i, %loop.i4316 %idx.i.i = phi i32 [ 0, %loop.i4 ], [ %idx.next.i.i, %in.bounds.i.i ]317 %idx.next.i.i = add i32 %idx.i.i, 1318 %abc.i.i = icmp slt i32 %idx.i.i, %len.i.i319 br i1 %abc.i.i, label %in.bounds.i.i, label %out.of.bounds.i.i, !prof !1320 321in.bounds.i.i: ; preds = %loop.i.i322 %addr.i.i = getelementptr i32, ptr %arr, i32 %idx.i.i323 store i32 0, ptr %addr.i.i324 %next.i.i = icmp slt i32 %idx.next.i.i, %n325 br i1 %next.i.i, label %loop.i.i, label %exit.i.i326 327out.of.bounds.i.i: ; preds = %loop.i.i328 br label %inner_loop.exit.i329 330exit.i.i: ; preds = %in.bounds.i.i, %loop.i4331 br label %inner_loop.exit.i332 333inner_loop.exit.i: ; preds = %exit.i.i, %out.of.bounds.i.i334 br i1 %next.i3, label %loop.i4, label %with_parent.exit335 336with_parent.exit: ; preds = %inner_loop.exit.i337 br i1 %next, label %loop, label %exit338 339exit: ; preds = %with_parent.exit340 ret void341}342 343attributes #0 = { alwaysinline }344 345!0 = !{i32 0, i32 2147483647}346!1 = !{!"branch_weights", i32 64, i32 4}347