| ; 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 |
| } |