xref: /llvm-project/llvm/test/Analysis/LoopCacheAnalysis/PowerPC/multi-store.ll (revision 670259466b238176ac302c8dedf806d2b2be7e0c)
1edb2fc6dSNikita Popov; RUN: opt < %s  -passes='print<loop-cache-cost>' -disable-output 2>&1 | FileCheck %s
2ef4ecc3cSBardia Mahjour
3ef4ecc3cSBardia Mahjourtarget datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
4ef4ecc3cSBardia Mahjourtarget triple = "powerpc64le-unknown-linux-gnu"
5ef4ecc3cSBardia Mahjour
680ab16d0SCongzhe Cao; CHECK: Loop 'for.j' has cost = 201000000
780ab16d0SCongzhe Cao; CHECK-NEXT: Loop 'for.i' has cost = 102000000
8*67025946SRouzbeh; CHECK-NEXT: Loop 'for.k' has cost = 120000
9ef4ecc3cSBardia Mahjour
10ef4ecc3cSBardia Mahjour;; Test to make sure when we have multiple conflicting access patterns, the
11ef4ecc3cSBardia Mahjour;; chosen loop configuration favours the majority of those accesses.
12ef4ecc3cSBardia Mahjour;; For example this nest should be ordered as j-i-k.
13ef4ecc3cSBardia Mahjour;;  for (int i = 0; i < n; i++)
14ef4ecc3cSBardia Mahjour;;    for (int j = 0; j < n; j++)
15ef4ecc3cSBardia Mahjour;;      for (int k = 0; k < n; k++) {
16ef4ecc3cSBardia Mahjour;;        A[i][j][k] = 1;
17ef4ecc3cSBardia Mahjour;;        B[j][i][k] = 2;
18ef4ecc3cSBardia Mahjour;;        C[j][i][k] = 3;
19ef4ecc3cSBardia Mahjour;;      }
20ef4ecc3cSBardia Mahjour
21ef4ecc3cSBardia Mahjourdefine void @foo(i32 noundef signext %n, ptr noalias noundef %A, ptr noalias noundef %B, ptr noalias noundef %C) {
22ef4ecc3cSBardia Mahjourentry:
23ef4ecc3cSBardia Mahjour  %0 = zext i32 %n to i64
24ef4ecc3cSBardia Mahjour  %1 = zext i32 %n to i64
25ef4ecc3cSBardia Mahjour  %2 = zext i32 %n to i64
26ef4ecc3cSBardia Mahjour  %3 = zext i32 %n to i64
27ef4ecc3cSBardia Mahjour  %4 = zext i32 %n to i64
28ef4ecc3cSBardia Mahjour  %5 = zext i32 %n to i64
29ef4ecc3cSBardia Mahjour  %cmp5 = icmp sgt i32 %n, 0
30ef4ecc3cSBardia Mahjour  br i1 %cmp5, label %for.i.preheader, label %for.end30
31ef4ecc3cSBardia Mahjour
32ef4ecc3cSBardia Mahjourfor.i.preheader:                               ; preds = %entry
33ef4ecc3cSBardia Mahjour  %wide.trip.count16 = zext i32 %n to i64
34ef4ecc3cSBardia Mahjour  br label %for.i
35ef4ecc3cSBardia Mahjour
36ef4ecc3cSBardia Mahjourfor.i:                                         ; preds = %for.i.preheader, %for.inc28
37ef4ecc3cSBardia Mahjour  %indvars.iv13 = phi i64 [ 0, %for.i.preheader ], [ %indvars.iv.next14, %for.inc28 ]
38ef4ecc3cSBardia Mahjour  %cmp23 = icmp sgt i32 %n, 0
39ef4ecc3cSBardia Mahjour  br i1 %cmp23, label %for.j.preheader, label %for.inc28
40ef4ecc3cSBardia Mahjour
41ef4ecc3cSBardia Mahjourfor.j.preheader:                              ; preds = %for.i
42ef4ecc3cSBardia Mahjour  %wide.trip.count11 = zext i32 %n to i64
43ef4ecc3cSBardia Mahjour  br label %for.j
44ef4ecc3cSBardia Mahjour
45ef4ecc3cSBardia Mahjourfor.j:                                        ; preds = %for.j.preheader, %for.inc25
46ef4ecc3cSBardia Mahjour  %indvars.iv8 = phi i64 [ 0, %for.j.preheader ], [ %indvars.iv.next9, %for.inc25 ]
47ef4ecc3cSBardia Mahjour  %cmp61 = icmp sgt i32 %n, 0
48ef4ecc3cSBardia Mahjour  br i1 %cmp61, label %for.k.preheader, label %for.inc25
49ef4ecc3cSBardia Mahjour
50ef4ecc3cSBardia Mahjourfor.k.preheader:                              ; preds = %for.j
51ef4ecc3cSBardia Mahjour  %wide.trip.count = zext i32 %n to i64
52ef4ecc3cSBardia Mahjour  br label %for.k
53ef4ecc3cSBardia Mahjour
54ef4ecc3cSBardia Mahjourfor.k:                                        ; preds = %for.k.preheader, %for.k
55ef4ecc3cSBardia Mahjour  %indvars.iv = phi i64 [ 0, %for.k.preheader ], [ %indvars.iv.next, %for.k ]
56ef4ecc3cSBardia Mahjour  %6 = mul nuw i64 %0, %1
57ef4ecc3cSBardia Mahjour  %7 = mul nsw i64 %6, %indvars.iv13
58ef4ecc3cSBardia Mahjour  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %7
59ef4ecc3cSBardia Mahjour  %8 = mul nuw nsw i64 %indvars.iv8, %1
60ef4ecc3cSBardia Mahjour  %arrayidx10 = getelementptr inbounds i32, ptr %arrayidx, i64 %8
61ef4ecc3cSBardia Mahjour  %arrayidx12 = getelementptr inbounds i32, ptr %arrayidx10, i64 %indvars.iv
62ef4ecc3cSBardia Mahjour  store i32 1, ptr %arrayidx12, align 4
63ef4ecc3cSBardia Mahjour  %9 = mul nuw i64 %2, %3
64ef4ecc3cSBardia Mahjour  %10 = mul nsw i64 %9, %indvars.iv8
65ef4ecc3cSBardia Mahjour  %arrayidx14 = getelementptr inbounds i32, ptr %B, i64 %10
66ef4ecc3cSBardia Mahjour  %11 = mul nuw nsw i64 %indvars.iv13, %3
67ef4ecc3cSBardia Mahjour  %arrayidx16 = getelementptr inbounds i32, ptr %arrayidx14, i64 %11
68ef4ecc3cSBardia Mahjour  %arrayidx18 = getelementptr inbounds i32, ptr %arrayidx16, i64 %indvars.iv
69ef4ecc3cSBardia Mahjour  store i32 2, ptr %arrayidx18, align 4
70ef4ecc3cSBardia Mahjour  %12 = mul nuw i64 %4, %5
71ef4ecc3cSBardia Mahjour  %13 = mul nsw i64 %12, %indvars.iv8
72ef4ecc3cSBardia Mahjour  %arrayidx20 = getelementptr inbounds i32, ptr %C, i64 %13
73ef4ecc3cSBardia Mahjour  %14 = mul nuw nsw i64 %indvars.iv13, %5
74ef4ecc3cSBardia Mahjour  %arrayidx22 = getelementptr inbounds i32, ptr %arrayidx20, i64 %14
75ef4ecc3cSBardia Mahjour  %arrayidx24 = getelementptr inbounds i32, ptr %arrayidx22, i64 %indvars.iv
76ef4ecc3cSBardia Mahjour  store i32 3, ptr %arrayidx24, align 4
77ef4ecc3cSBardia Mahjour  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
78ef4ecc3cSBardia Mahjour  %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count
79ef4ecc3cSBardia Mahjour  br i1 %exitcond, label %for.k, label %for.inc25.loopexit
80ef4ecc3cSBardia Mahjour
81ef4ecc3cSBardia Mahjourfor.inc25.loopexit:                               ; preds = %for.k
82ef4ecc3cSBardia Mahjour  br label %for.inc25
83ef4ecc3cSBardia Mahjour
84ef4ecc3cSBardia Mahjourfor.inc25:                                        ; preds = %for.inc25.loopexit, %for.j
85ef4ecc3cSBardia Mahjour  %indvars.iv.next9 = add nuw nsw i64 %indvars.iv8, 1
86ef4ecc3cSBardia Mahjour  %exitcond12 = icmp ne i64 %indvars.iv.next9, %wide.trip.count11
87ef4ecc3cSBardia Mahjour  br i1 %exitcond12, label %for.j, label %for.inc28.loopexit
88ef4ecc3cSBardia Mahjour
89ef4ecc3cSBardia Mahjourfor.inc28.loopexit:                               ; preds = %for.inc25
90ef4ecc3cSBardia Mahjour  br label %for.inc28
91ef4ecc3cSBardia Mahjour
92ef4ecc3cSBardia Mahjourfor.inc28:                                        ; preds = %for.inc28.loopexit, %for.i
93ef4ecc3cSBardia Mahjour  %indvars.iv.next14 = add nuw nsw i64 %indvars.iv13, 1
94ef4ecc3cSBardia Mahjour  %exitcond17 = icmp ne i64 %indvars.iv.next14, %wide.trip.count16
95ef4ecc3cSBardia Mahjour  br i1 %exitcond17, label %for.i, label %for.end30.loopexit
96ef4ecc3cSBardia Mahjour
97ef4ecc3cSBardia Mahjourfor.end30.loopexit:                               ; preds = %for.inc28
98ef4ecc3cSBardia Mahjour  br label %for.end30
99ef4ecc3cSBardia Mahjour
100ef4ecc3cSBardia Mahjourfor.end30:                                        ; preds = %for.end30.loopexit, %entry
101ef4ecc3cSBardia Mahjour  ret void
102ef4ecc3cSBardia Mahjour}
103