| ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt < %s -cache-line-size=64 -passes='print<loop-cache-cost>' -disable-output 2>&1 | FileCheck %s | |
| ;; FIXME: For a forked nest getInnerMostLoop() fails to | |
| ;; detect the sibling sub-loops and picks a single wrong innermost loop. | |
| ;; for (i) { | |
| ;; for (j) | |
| ;; for (jj) A[jj][j] = 1; | |
| ;; for (k) | |
| ;; for (kk) B[k][kk] = 1; | |
| ;; } | |
| ;; FIXME: only the 'k/kk' sub-nest is costed, 'a.i' (a fork) should not have a | |
| ;; cost, and 'a.j'/'a.jj' are wrongly costed as loop-invariant. | |
| define void @fork_at_top(ptr %A, ptr %B) { | |
| ; CHECK-LABEL: 'fork_at_top' | |
| ; CHECK-NEXT: Loop 'a.k' has cost = 10000000000 | |
| ; CHECK-NEXT: Loop 'a.kk' has cost = 1300000000 | |
| ; CHECK-NEXT: Loop 'a.i' has cost = 100000000 | |
| ; CHECK-NEXT: Loop 'a.j' has cost = 100000000 | |
| ; CHECK-NEXT: Loop 'a.jj' has cost = 100000000 | |
| ; | |
| entry: | |
| br label %a.i | |
| a.i: | |
| %iv = phi i64 [ 0, %entry ], [ %iv.n, %a.i.inc ] | |
| br label %a.j | |
| a.j: | |
| %jv = phi i64 [ 0, %a.i ], [ %jv.n, %a.j.inc ] | |
| br label %a.jj | |
| a.jj: | |
| %jjv = phi i64 [ 0, %a.j ], [ %jjv.n, %a.jj ] | |
| %ga = getelementptr inbounds [100 x double], ptr %A, i64 %jjv, i64 %jv | |
| store double 1.0, ptr %ga | |
| %jjv.n = add nsw i64 %jjv, 1 | |
| %jj.e = icmp eq i64 %jjv.n, 100 | |
| br i1 %jj.e, label %a.j.inc, label %a.jj | |
| a.j.inc: | |
| %jv.n = add nsw i64 %jv, 1 | |
| %j.e = icmp eq i64 %jv.n, 100 | |
| br i1 %j.e, label %a.k, label %a.j | |
| a.k: | |
| %kv = phi i64 [ 0, %a.j.inc ], [ %kv.n, %a.k.inc ] | |
| br label %a.kk | |
| a.kk: | |
| %kkv = phi i64 [ 0, %a.k ], [ %kkv.n, %a.kk ] | |
| %gb = getelementptr inbounds [100 x double], ptr %B, i64 %kv, i64 %kkv | |
| store double 1.0, ptr %gb | |
| %kkv.n = add nsw i64 %kkv, 1 | |
| %kk.e = icmp eq i64 %kkv.n, 100 | |
| br i1 %kk.e, label %a.k.inc, label %a.kk | |
| a.k.inc: | |
| %kv.n = add nsw i64 %kv, 1 | |
| %k.e = icmp eq i64 %kv.n, 100 | |
| br i1 %k.e, label %a.i.inc, label %a.k | |
| a.i.inc: | |
| %iv.n = add nsw i64 %iv, 1 | |
| %i.e = icmp eq i64 %iv.n, 100 | |
| br i1 %i.e, label %exit, label %a.i | |
| exit: | |
| ret void | |
| } | |
| ;; for (i) | |
| ;; for (j) { | |
| ;; for (k) C[k] = 1; | |
| ;; for (l) D[l] = 1; | |
| ;; } | |
| ;; FIXME: only the 'l' sub-nest is costed, and the fork loops 'b.i'/'b.j' should | |
| ;; not have a cost. | |
| define void @fork_in_middle(ptr %C, ptr %D) { | |
| ; CHECK-LABEL: 'fork_in_middle' | |
| ; CHECK-NEXT: Loop 'b.l' has cost = 13000000 | |
| ; CHECK-NEXT: Loop 'b.i' has cost = 1000000 | |
| ; CHECK-NEXT: Loop 'b.j' has cost = 1000000 | |
| ; CHECK-NEXT: Loop 'b.k' has cost = 1000000 | |
| ; | |
| entry: | |
| br label %b.i | |
| b.i: | |
| %iv = phi i64 [ 0, %entry ], [ %iv.n, %b.i.inc ] | |
| br label %b.j | |
| b.j: | |
| %jv = phi i64 [ 0, %b.i ], [ %jv.n, %b.j.inc ] | |
| br label %b.k | |
| b.k: | |
| %kv = phi i64 [ 0, %b.j ], [ %kv.n, %b.k ] | |
| %gc = getelementptr inbounds double, ptr %C, i64 %kv | |
| store double 1.0, ptr %gc | |
| %kv.n = add nsw i64 %kv, 1 | |
| %k.e = icmp eq i64 %kv.n, 100 | |
| br i1 %k.e, label %b.l, label %b.k | |
| b.l: | |
| %lv = phi i64 [ 0, %b.k ], [ %lv.n, %b.l ] | |
| %gd = getelementptr inbounds double, ptr %D, i64 %lv | |
| store double 1.0, ptr %gd | |
| %lv.n = add nsw i64 %lv, 1 | |
| %l.e = icmp eq i64 %lv.n, 100 | |
| br i1 %l.e, label %b.j.inc, label %b.l | |
| b.j.inc: | |
| %jv.n = add nsw i64 %jv, 1 | |
| %j.e = icmp eq i64 %jv.n, 100 | |
| br i1 %j.e, label %b.i.inc, label %b.j | |
| b.i.inc: | |
| %iv.n = add nsw i64 %iv, 1 | |
| %i.e = icmp eq i64 %iv.n, 100 | |
| br i1 %i.e, label %exit, label %b.i | |
| exit: | |
| ret void | |
| } |