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