xref: /llvm-project/llvm/test/Analysis/LoopCacheAnalysis/PowerPC/compute-cost.ll (revision 670259466b238176ac302c8dedf806d2b2be7e0c)
1edb2fc6dSNikita Popov; RUN: opt < %s -passes='print<loop-cache-cost>' -disable-output 2>&1 | FileCheck %s
2f897d087SRachel Craik
3f897d087SRachel Craiktarget datalayout = "e-m:e-i64:64-n32:64"
4f897d087SRachel Craiktarget triple = "powerpc64le-unknown-linux-gnu"
5f897d087SRachel Craik
6f897d087SRachel Craik; Check IndexedReference::computeRefCost can handle type differences between
7f897d087SRachel Craik; Stride and TripCount
8f897d087SRachel Craik
9f897d087SRachel Craik; CHECK: Loop 'for.cond' has cost = 64
10f897d087SRachel Craik
111aee1e1fSNikita Popov%struct._Handleitem = type { ptr }
12f897d087SRachel Craik
131aee1e1fSNikita Popovdefine void @handle_to_ptr(ptr %blocks) {
14f897d087SRachel Craik; Preheader:
15f897d087SRachel Craikentry:
16f897d087SRachel Craik  br label %for.cond
17f897d087SRachel Craik
18f897d087SRachel Craik; Loop:
19f897d087SRachel Craikfor.cond:                                         ; preds = %for.body, %entry
20f897d087SRachel Craik  %i.0 = phi i32 [ 1, %entry ], [ %inc, %for.body ]
21f897d087SRachel Craik  %cmp = icmp ult i32 %i.0, 1024
22f897d087SRachel Craik  br i1 %cmp, label %for.body, label %for.end
23f897d087SRachel Craik
24f897d087SRachel Craikfor.body:                                         ; preds = %for.cond
25f897d087SRachel Craik  %idxprom = zext i32 %i.0 to i64
261aee1e1fSNikita Popov  %arrayidx = getelementptr inbounds ptr, ptr %blocks, i64 %idxprom
271aee1e1fSNikita Popov  store ptr null, ptr %arrayidx, align 8
28f897d087SRachel Craik  %inc = add nuw nsw i32 %i.0, 1
29f897d087SRachel Craik  br label %for.cond
30f897d087SRachel Craik
31f897d087SRachel Craik; Exit blocks
32f897d087SRachel Craikfor.end:                                          ; preds = %for.cond
33f897d087SRachel Craik  ret void
341f554200SRachel Craik}
35f897d087SRachel Craik
3605ccde80SCongzhe Cao; Check IndexedReference::computeRefCost can handle type differences between
3705ccde80SCongzhe Cao; Coeff and ElemSize.
381f554200SRachel Craik
3905ccde80SCongzhe Cao; CHECK: Loop 'for.cond' has cost = 100000000
4005ccde80SCongzhe Cao; CHECK: Loop 'for.cond1' has cost = 1000000
41*67025946SRouzbeh; CHECK: Loop 'for.cond5' has cost = 40000
4205ccde80SCongzhe Cao
4305ccde80SCongzhe Cao@data = external dso_local global [2 x [4 x [18 x i32]]], align 1
4405ccde80SCongzhe Cao
4505ccde80SCongzhe Caodefine dso_local void @handle_to_ptr_2(i1 %b0, i1 %b1, i1 %b2) {
4605ccde80SCongzhe Caoentry:
4705ccde80SCongzhe Cao  br label %for.cond
4805ccde80SCongzhe Cao
4905ccde80SCongzhe Caofor.cond:
5005ccde80SCongzhe Cao  %i.0 = phi i16 [ 0, %entry ], [ %inc18, %for.inc17 ]
5105ccde80SCongzhe Cao  %idxprom = zext i16 %i.0 to i32
5205ccde80SCongzhe Cao  br i1 %b2, label %for.end19, label %for.cond1
5305ccde80SCongzhe Cao
5405ccde80SCongzhe Caofor.cond1:
5505ccde80SCongzhe Cao  %j.0 = phi i16 [ %inc15, %for.inc14 ], [ 0, %for.cond ]
5605ccde80SCongzhe Cao  br i1 %b1, label %for.inc17, label %for.cond5.preheader
5705ccde80SCongzhe Cao
5805ccde80SCongzhe Caofor.cond5.preheader:
5905ccde80SCongzhe Cao  %idxprom10 = zext i16 %j.0 to i32
6005ccde80SCongzhe Cao  br label %for.cond5
6105ccde80SCongzhe Cao
6205ccde80SCongzhe Caofor.cond5:
6305ccde80SCongzhe Cao  %k.0 = phi i16 [ %inc, %for.inc ], [ 0, %for.cond5.preheader ]
6405ccde80SCongzhe Cao  br i1 %b0, label %for.inc14, label %for.inc
6505ccde80SCongzhe Cao
6605ccde80SCongzhe Caofor.inc:
6705ccde80SCongzhe Cao  %idxprom12 = zext i16 %k.0 to i32
6805ccde80SCongzhe Cao  %arrayidx13 = getelementptr inbounds [2 x [4 x [18 x i32]]], ptr @data, i32 0, i32 %idxprom, i32 %idxprom10, i32 %idxprom12
6905ccde80SCongzhe Cao  store i32 7, ptr %arrayidx13, align 1
7005ccde80SCongzhe Cao  %inc = add nuw nsw i16 %k.0, 1
7105ccde80SCongzhe Cao  br label %for.cond5
7205ccde80SCongzhe Cao
7305ccde80SCongzhe Caofor.inc14:
7405ccde80SCongzhe Cao  %inc15 = add nuw nsw i16 %j.0, 1
7505ccde80SCongzhe Cao  br label %for.cond1
7605ccde80SCongzhe Cao
7705ccde80SCongzhe Caofor.inc17:
7805ccde80SCongzhe Cao  %inc18 = add nuw nsw i16 %i.0, 1
7905ccde80SCongzhe Cao  br label %for.cond
8005ccde80SCongzhe Cao
8105ccde80SCongzhe Caofor.end19:
8205ccde80SCongzhe Cao  ret void
8305ccde80SCongzhe Cao}
841f554200SRachel Craik
851f554200SRachel Craik; Check IndexedReference::computeRefCost can handle negative stride
861f554200SRachel Craik
871f554200SRachel Craik; CHECK: Loop 'for.neg.cond' has cost = 64
881f554200SRachel Craik
891aee1e1fSNikita Popovdefine void @handle_to_ptr_neg_stride(ptr %blocks) {
901f554200SRachel Craik; Preheader:
911f554200SRachel Craikentry:
921f554200SRachel Craik  br label %for.neg.cond
931f554200SRachel Craik
941f554200SRachel Craik; Loop:
951f554200SRachel Craikfor.neg.cond:                                         ; preds = %for.neg.body, %entry
961f554200SRachel Craik  %i.0 = phi i32 [ 1023, %entry ], [ %dec, %for.neg.body ]
971f554200SRachel Craik  %cmp = icmp sgt i32 %i.0, 0
981f554200SRachel Craik  br i1 %cmp, label %for.neg.body, label %for.neg.end
991f554200SRachel Craik
1001f554200SRachel Craikfor.neg.body:                                         ; preds = %for.neg.cond
1011f554200SRachel Craik  %idxprom = zext i32 %i.0 to i64
1021aee1e1fSNikita Popov  %arrayidx = getelementptr inbounds ptr, ptr %blocks, i64 %idxprom
1031aee1e1fSNikita Popov  store ptr null, ptr %arrayidx, align 8
1041f554200SRachel Craik  %dec = add nsw i32 %i.0, -1
1051f554200SRachel Craik  br label %for.neg.cond
1061f554200SRachel Craik
1071f554200SRachel Craik; Exit blocks
1081f554200SRachel Craikfor.neg.end:                                          ; preds = %for.neg.cond
1091f554200SRachel Craik  ret void
1101f554200SRachel Craik}
1111f554200SRachel Craik
1121f554200SRachel Craik
1131f554200SRachel Craik
1141f554200SRachel Craik;   for (int i = 40960; i > 0; i--)
1151f554200SRachel Craik;     B[i] = B[40960 - i];
1161f554200SRachel Craik
1171f554200SRachel Craik; FIXME: Currently negative access functions are treated the same as positive
1181f554200SRachel Craik; access functions. When this is fixed this testcase should have a cost
1191f554200SRachel Craik; approximately 2x higher.
1201f554200SRachel Craik
121*67025946SRouzbeh; CHECK: Loop 'for.cond2' has cost = 2561
1221aee1e1fSNikita Popovdefine void @Test2(ptr %B) {
1231f554200SRachel Craikentry:
1241f554200SRachel Craik  br label %for.cond2
1251f554200SRachel Craik
1261f554200SRachel Craikfor.cond2:                                         ; preds = %for.body, %entry
1271f554200SRachel Craik  %i.0 = phi i32 [ 40960, %entry ], [ %dec, %for.body ]
1281f554200SRachel Craik  %cmp = icmp sgt i32 %i.0, 0
1291f554200SRachel Craik  br i1 %cmp, label %for.body, label %for.end
1301f554200SRachel Craik
1311f554200SRachel Craikfor.body:                                         ; preds = %for.cond
1321f554200SRachel Craik  %sub = sub nsw i32 40960, %i.0
1331f554200SRachel Craik  %idxprom = sext i32 %sub to i64
1341aee1e1fSNikita Popov  %arrayidx = getelementptr inbounds double, ptr %B, i64 %idxprom
1351aee1e1fSNikita Popov  %0 = load double, ptr %arrayidx, align 8
1361f554200SRachel Craik  %idxprom1 = sext i32 %i.0 to i64
1371aee1e1fSNikita Popov  %arrayidx2 = getelementptr inbounds double, ptr %B, i64 %idxprom1
1381aee1e1fSNikita Popov  store double %0, ptr %arrayidx2, align 8
1391f554200SRachel Craik  %dec = add nsw i32 %i.0, -1
1401f554200SRachel Craik  br label %for.cond2
1411f554200SRachel Craik
1421f554200SRachel Craikfor.end:                                          ; preds = %for.cond
1431f554200SRachel Craik  ret void
1441f554200SRachel Craik}
1451f554200SRachel Craik
1461f554200SRachel Craik
1471f554200SRachel Craik
1481f554200SRachel Craik;   for (i = 40960; i > 0; i--)
1491f554200SRachel Craik;     C[i] = C[i];
1501f554200SRachel Craik
151*67025946SRouzbeh; CHECK: Loop 'for.cond3' has cost = 2561
1521aee1e1fSNikita Popovdefine void @Test3(ptr %C) {
1531f554200SRachel Craikentry:
1541f554200SRachel Craik  br label %for.cond3
1551f554200SRachel Craik
1561f554200SRachel Craikfor.cond3:                                         ; preds = %for.body, %entry
1571f554200SRachel Craik  %i.0 = phi i32 [ 40960, %entry ], [ %dec, %for.body ]
1581f554200SRachel Craik  %cmp = icmp sgt i32 %i.0, 0
1591f554200SRachel Craik  br i1 %cmp, label %for.body, label %for.end
1601f554200SRachel Craik
1611f554200SRachel Craikfor.body:                                         ; preds = %for.cond
1621f554200SRachel Craik  %idxprom = sext i32 %i.0 to i64
1631aee1e1fSNikita Popov  %arrayidx = getelementptr inbounds ptr, ptr %C, i64 %idxprom
1641aee1e1fSNikita Popov  %0 = load ptr, ptr %arrayidx, align 8
1651f554200SRachel Craik  %idxprom1 = sext i32 %i.0 to i64
1661aee1e1fSNikita Popov  %arrayidx2 = getelementptr inbounds ptr, ptr %C, i64 %idxprom1
1671aee1e1fSNikita Popov  store ptr %0, ptr %arrayidx2, align 8
1681f554200SRachel Craik  %dec = add nsw i32 %i.0, -1
1691f554200SRachel Craik  br label %for.cond3
1701f554200SRachel Craik
1711f554200SRachel Craikfor.end:                                          ; preds = %for.cond
1721f554200SRachel Craik  ret void
1731f554200SRachel Craik}
1741f554200SRachel Craik
1751f554200SRachel Craik
1761f554200SRachel Craik
1771f554200SRachel Craik;  for (i = 0; i < 40960; i++)
1781f554200SRachel Craik;     D[i] = D[i];
1791f554200SRachel Craik
180*67025946SRouzbeh; CHECK: Loop 'for.cond4' has cost = 2561
1811aee1e1fSNikita Popovdefine void @Test4(ptr %D) {
1821f554200SRachel Craikentry:
1831f554200SRachel Craik  br label %for.cond4
1841f554200SRachel Craik
1851f554200SRachel Craikfor.cond4:                                         ; preds = %for.body, %entry
1861f554200SRachel Craik  %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
1871f554200SRachel Craik  %cmp = icmp slt i32 %i.0, 40960
1881f554200SRachel Craik  br i1 %cmp, label %for.body, label %for.end
1891f554200SRachel Craik
1901f554200SRachel Craikfor.body:                                         ; preds = %for.cond
1911f554200SRachel Craik  %idxprom = sext i32 %i.0 to i64
1921aee1e1fSNikita Popov  %arrayidx = getelementptr inbounds ptr, ptr %D, i64 %idxprom
1931aee1e1fSNikita Popov  %0 = load ptr, ptr %arrayidx, align 8
1941f554200SRachel Craik  %idxprom1 = sext i32 %i.0 to i64
1951aee1e1fSNikita Popov  %arrayidx2 = getelementptr inbounds ptr, ptr %D, i64 %idxprom1
1961aee1e1fSNikita Popov  store ptr %0, ptr %arrayidx2, align 8
1971f554200SRachel Craik  %inc = add nsw i32 %i.0, 1
1981f554200SRachel Craik  br label %for.cond4
1991f554200SRachel Craik
2001f554200SRachel Craikfor.end:                                          ; preds = %for.cond
2011f554200SRachel Craik  ret void
202f897d087SRachel Craik}
203