xref: /llvm-project/llvm/test/Analysis/LoopCacheAnalysis/PowerPC/matmul.ll (revision 670259466b238176ac302c8dedf806d2b2be7e0c)
1dd3b6498SWhitney Tsang; RUN: opt < %s -passes='print<loop-cache-cost>' -disable-output 2>&1 | FileCheck %s
2dd3b6498SWhitney Tsang
3dd3b6498SWhitney Tsangtarget datalayout = "e-m:e-i64:64-n32:64"
4dd3b6498SWhitney Tsangtarget triple = "powerpc64le-unknown-linux-gnu"
5dd3b6498SWhitney Tsang
6dd3b6498SWhitney Tsang; void matmul(long n, long m, long o, int A[n][m], int B[n][m], int C[n]) {
7dd3b6498SWhitney Tsang;   for (long i = 0; i < n; i++)
8dd3b6498SWhitney Tsang;     for (long j = 0; j < m; j++)
9dd3b6498SWhitney Tsang;       for (long k = 0; k < o; k++)
10dd3b6498SWhitney Tsang;         C[i][j] = C[i][j] + A[i][k] * B[k][j];
11dd3b6498SWhitney Tsang; }
12dd3b6498SWhitney Tsang
133d6fe7acSCongzhe Cao; CHECK:Loop 'for.i' has cost = 2010000
14*67025946SRouzbeh; CHECK-NEXT:Loop 'for.k' has cost = 1050000
15*67025946SRouzbeh; CHECK-NEXT:Loop 'for.j' has cost = 90000
16dd3b6498SWhitney Tsang
171aee1e1fSNikita Popovdefine void @matmul(i64 %n, i64 %m, i64 %o, ptr %A, ptr %B, ptr %C) {
18dd3b6498SWhitney Tsangentry:
19dd3b6498SWhitney Tsang  br label %for.i
20dd3b6498SWhitney Tsang
21dd3b6498SWhitney Tsangfor.i:                                         ; preds = %entry, %for.inc.i
22dd3b6498SWhitney Tsang  %i = phi i64 [ 0, %entry ], [ %i.next, %for.inc.i ]
23dd3b6498SWhitney Tsang  %muli = mul i64 %i, %m
24dd3b6498SWhitney Tsang  br label %for.j
25dd3b6498SWhitney Tsang
26dd3b6498SWhitney Tsangfor.j:                                        ; preds = %for.i, %for.inc.j
27dd3b6498SWhitney Tsang  %j = phi i64 [ 0, %for.i ], [ %j.next, %for.inc.j ]
28dd3b6498SWhitney Tsang  %addj = add i64 %muli, %j
29dd3b6498SWhitney Tsang  %mulj = mul i64 %addj, %o
30dd3b6498SWhitney Tsang  br label %for.k
31dd3b6498SWhitney Tsang
32dd3b6498SWhitney Tsangfor.k:                                        ; preds = %for.j, %for.inc.k
33dd3b6498SWhitney Tsang  %k = phi i64 [ 0, %for.j ], [ %k.next, %for.inc.k ]
34dd3b6498SWhitney Tsang
35dd3b6498SWhitney Tsang  ; A[i][k]
36dd3b6498SWhitney Tsang  %arrayidx3 = add i64 %k, %muli
371aee1e1fSNikita Popov  %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 %arrayidx3
381aee1e1fSNikita Popov  %elem_A = load i32, ptr %arrayidx4, align 4
39dd3b6498SWhitney Tsang
40dd3b6498SWhitney Tsang  ; B[k][j]
41dd3b6498SWhitney Tsang  %mulk = mul i64 %k, %o
42dd3b6498SWhitney Tsang  %arrayidx5 = add i64 %j, %mulk
431aee1e1fSNikita Popov  %arrayidx6 = getelementptr inbounds i32, ptr %B, i64 %arrayidx5
441aee1e1fSNikita Popov  %elem_B = load i32, ptr %arrayidx6, align 4
45dd3b6498SWhitney Tsang
46dd3b6498SWhitney Tsang  ; C[i][k]
47dd3b6498SWhitney Tsang  %arrayidx7 = add i64 %j, %muli
481aee1e1fSNikita Popov  %arrayidx8 = getelementptr inbounds i32, ptr %C, i64 %arrayidx7
491aee1e1fSNikita Popov  %elem_C = load i32, ptr %arrayidx8, align 4
50dd3b6498SWhitney Tsang
51dd3b6498SWhitney Tsang  ; C[i][j] = C[i][j] + A[i][k] * B[k][j];
52dd3b6498SWhitney Tsang  %mul = mul nsw i32 %elem_A, %elem_B
53dd3b6498SWhitney Tsang  %add = add nsw i32 %elem_C, %mul
541aee1e1fSNikita Popov  store i32 %add, ptr %arrayidx8, align 4
55dd3b6498SWhitney Tsang
56dd3b6498SWhitney Tsang  br label %for.inc.k
57dd3b6498SWhitney Tsang
58dd3b6498SWhitney Tsangfor.inc.k:                                          ; preds = %for.k
59dd3b6498SWhitney Tsang  %k.next = add nuw nsw i64 %k, 1
60dd3b6498SWhitney Tsang  %exitcond = icmp ne i64 %k.next, %o
61dd3b6498SWhitney Tsang  br i1 %exitcond, label %for.k, label %for.end
62dd3b6498SWhitney Tsang
63dd3b6498SWhitney Tsangfor.end:                                          ; preds = %for.inc
64dd3b6498SWhitney Tsang  br label %for.inc.j
65dd3b6498SWhitney Tsang
66dd3b6498SWhitney Tsangfor.inc.j:                                        ; preds = %for.end
67dd3b6498SWhitney Tsang  %j.next = add nuw nsw i64 %j, 1
68dd3b6498SWhitney Tsang  %exitcond5 = icmp ne i64 %j.next, %m
69dd3b6498SWhitney Tsang  br i1 %exitcond5, label %for.j, label %for.end23
70dd3b6498SWhitney Tsang
71dd3b6498SWhitney Tsangfor.end23:                                        ; preds = %for.inc.j
72dd3b6498SWhitney Tsang  br label %for.inc.i
73dd3b6498SWhitney Tsang
74dd3b6498SWhitney Tsangfor.inc.i:                                        ; preds = %for.end23
75dd3b6498SWhitney Tsang  %i.next = add nuw nsw i64 %i, 1
76dd3b6498SWhitney Tsang  %exitcond8 = icmp ne i64 %i.next, %n
77dd3b6498SWhitney Tsang  br i1 %exitcond8, label %for.i, label %for.end26
78dd3b6498SWhitney Tsang
79dd3b6498SWhitney Tsangfor.end26:                                        ; preds = %for.inc.i
80dd3b6498SWhitney Tsang  ret void
81dd3b6498SWhitney Tsang}
82