brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 0b06ce9 Raw
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