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