brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.5 KiB · 2a989cc Raw
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