101 lines · plain
1; RUN: opt -irce-print-changed-loops -verify-loop-info -passes=irce -S < %s 2>&1 | FileCheck %s2; RUN: opt -irce-print-changed-loops -verify-loop-info -passes='require<branch-prob>,irce' -S < %s 2>&1 | FileCheck %s3 4; CHECK-NOT: constrained Loop at depth5 6; Demonstrates that we don't currently handle the general expression7; `A * I + B'.8 9define void @general_affine_expressions(ptr %arr, ptr %a_len_ptr, i32 %n,10 i32 %scale, i32 %offset) {11 entry: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 16 loop:17 %idx = phi i32 [ 0, %entry ] , [ %idx.next, %in.bounds ]18 %idx.next = add i32 %idx, 119 %idx.mul = mul i32 %idx, %scale20 %array.idx = add i32 %idx.mul, %offset21 %abc.high = icmp slt i32 %array.idx, %len22 %abc.low = icmp sge i32 %array.idx, 023 %abc = and i1 %abc.low, %abc.high24 br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !125 26 in.bounds:27 %addr = getelementptr i32, ptr %arr, i32 %array.idx28 store i32 0, ptr %addr29 %next = icmp slt i32 %idx.next, %n30 br i1 %next, label %loop, label %exit31 32 out.of.bounds:33 ret void34 35 exit:36 ret void37}38 39; Check that we do the right thing for a loop that could not be40; simplified due to an indirectbr.41 42define void @multiple_latches(ptr %arr, ptr %a_len_ptr, i32 %n) {43 entry:44 %len = load i32, ptr %a_len_ptr, !range !045 %n.add.1 = add i32 %n, 146 %first.itr.check = icmp sgt i32 %n, 047 br i1 %first.itr.check, label %loop, label %exit48 49 loop:50 %idx = phi i32 [ 0, %entry ], [ %idx.next, %in.bounds ], [ %idx.next, %continue ]51 %idx.next = add i32 %idx, 152 %idx.next2 = add i32 %idx, 253 %abc = icmp slt i32 %idx, %len54 br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !155 56 in.bounds:57 %addr = getelementptr i32, ptr %arr, i32 %idx58 store i32 0, ptr %addr59 %next = icmp slt i32 %idx.next, %n60 br i1 %next, label %loop, label %continue61 62 continue:63 %next2 = icmp slt i32 %idx.next, %n.add.164 %dest = select i1 %next2, ptr blockaddress(@multiple_latches, %loop), ptr blockaddress(@multiple_latches, %exit)65 indirectbr ptr %dest, [ label %loop, label %exit]66 67 out.of.bounds:68 ret void69 70 exit:71 ret void72}73 74define void @already_cloned(ptr %arr, ptr %a_len_ptr, i32 %n) {75 entry:76 %len = load i32, ptr %a_len_ptr, !range !077 %first.itr.check = icmp sgt i32 %n, 078 br i1 %first.itr.check, label %loop, label %exit79 80 loop:81 %idx = phi i32 [ 0, %entry ] , [ %idx.next, %in.bounds ]82 %idx.next = add i32 %idx, 183 %abc = icmp slt i32 %idx, %len84 br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !185 86 in.bounds:87 %addr = getelementptr i32, ptr %arr, i32 %idx88 store i32 0, ptr %addr89 %next = icmp slt i32 %idx.next, %n90 br i1 %next, label %loop, label %exit, !loop_constrainer.loop.clone !{}91 92 out.of.bounds:93 ret void94 95 exit:96 ret void97}98 99!0 = !{i32 0, i32 2147483647}100!1 = !{!"branch_weights", i32 64, i32 4}101