103 lines · plain
1; RUN: opt < %s -passes='print<loop-cache-cost>' -disable-output 2>&1 | FileCheck %s2 3target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"4target triple = "powerpc64le-unknown-linux-gnu"5 6; CHECK: Loop 'for.j' has cost = 2010000007; CHECK-NEXT: Loop 'for.i' has cost = 1020000008; CHECK-NEXT: Loop 'for.k' has cost = 1200009 10;; Test to make sure when we have multiple conflicting access patterns, the 11;; chosen loop configuration favours the majority of those accesses. 12;; For example this nest should be ordered as j-i-k.13;; for (int i = 0; i < n; i++)14;; for (int j = 0; j < n; j++)15;; for (int k = 0; k < n; k++) {16;; A[i][j][k] = 1;17;; B[j][i][k] = 2;18;; C[j][i][k] = 3;19;; } 20 21define void @foo(i32 noundef signext %n, ptr noalias noundef %A, ptr noalias noundef %B, ptr noalias noundef %C) {22entry:23 %0 = zext i32 %n to i6424 %1 = zext i32 %n to i6425 %2 = zext i32 %n to i6426 %3 = zext i32 %n to i6427 %4 = zext i32 %n to i6428 %5 = zext i32 %n to i6429 %cmp5 = icmp sgt i32 %n, 030 br i1 %cmp5, label %for.i.preheader, label %for.end3031 32for.i.preheader: ; preds = %entry33 %wide.trip.count16 = zext i32 %n to i6434 br label %for.i35 36for.i: ; preds = %for.i.preheader, %for.inc2837 %indvars.iv13 = phi i64 [ 0, %for.i.preheader ], [ %indvars.iv.next14, %for.inc28 ]38 %cmp23 = icmp sgt i32 %n, 039 br i1 %cmp23, label %for.j.preheader, label %for.inc2840 41for.j.preheader: ; preds = %for.i42 %wide.trip.count11 = zext i32 %n to i6443 br label %for.j44 45for.j: ; preds = %for.j.preheader, %for.inc2546 %indvars.iv8 = phi i64 [ 0, %for.j.preheader ], [ %indvars.iv.next9, %for.inc25 ]47 %cmp61 = icmp sgt i32 %n, 048 br i1 %cmp61, label %for.k.preheader, label %for.inc2549 50for.k.preheader: ; preds = %for.j51 %wide.trip.count = zext i32 %n to i6452 br label %for.k53 54for.k: ; preds = %for.k.preheader, %for.k55 %indvars.iv = phi i64 [ 0, %for.k.preheader ], [ %indvars.iv.next, %for.k ]56 %6 = mul nuw i64 %0, %157 %7 = mul nsw i64 %6, %indvars.iv1358 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %759 %8 = mul nuw nsw i64 %indvars.iv8, %160 %arrayidx10 = getelementptr inbounds i32, ptr %arrayidx, i64 %861 %arrayidx12 = getelementptr inbounds i32, ptr %arrayidx10, i64 %indvars.iv62 store i32 1, ptr %arrayidx12, align 463 %9 = mul nuw i64 %2, %364 %10 = mul nsw i64 %9, %indvars.iv865 %arrayidx14 = getelementptr inbounds i32, ptr %B, i64 %1066 %11 = mul nuw nsw i64 %indvars.iv13, %367 %arrayidx16 = getelementptr inbounds i32, ptr %arrayidx14, i64 %1168 %arrayidx18 = getelementptr inbounds i32, ptr %arrayidx16, i64 %indvars.iv69 store i32 2, ptr %arrayidx18, align 470 %12 = mul nuw i64 %4, %571 %13 = mul nsw i64 %12, %indvars.iv872 %arrayidx20 = getelementptr inbounds i32, ptr %C, i64 %1373 %14 = mul nuw nsw i64 %indvars.iv13, %574 %arrayidx22 = getelementptr inbounds i32, ptr %arrayidx20, i64 %1475 %arrayidx24 = getelementptr inbounds i32, ptr %arrayidx22, i64 %indvars.iv76 store i32 3, ptr %arrayidx24, align 477 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 178 %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count79 br i1 %exitcond, label %for.k, label %for.inc25.loopexit80 81for.inc25.loopexit: ; preds = %for.k82 br label %for.inc2583 84for.inc25: ; preds = %for.inc25.loopexit, %for.j85 %indvars.iv.next9 = add nuw nsw i64 %indvars.iv8, 186 %exitcond12 = icmp ne i64 %indvars.iv.next9, %wide.trip.count1187 br i1 %exitcond12, label %for.j, label %for.inc28.loopexit88 89for.inc28.loopexit: ; preds = %for.inc2590 br label %for.inc2891 92for.inc28: ; preds = %for.inc28.loopexit, %for.i93 %indvars.iv.next14 = add nuw nsw i64 %indvars.iv13, 194 %exitcond17 = icmp ne i64 %indvars.iv.next14, %wide.trip.count1695 br i1 %exitcond17, label %for.i, label %for.end30.loopexit96 97for.end30.loopexit: ; preds = %for.inc2898 br label %for.end3099 100for.end30: ; preds = %for.end30.loopexit, %entry101 ret void102}103