blob: c788214dd30c61e100d7643f14a73542f18add34 [file]
; 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
}