1c428a3d2SCongzhe Cao; RUN: opt < %s -passes='print<loop-cache-cost>' -disable-output 2>&1 | FileCheck %s 2c428a3d2SCongzhe Cao 3c428a3d2SCongzhe Caotarget datalayout = "e-m:e-i64:64-n32:64" 4c428a3d2SCongzhe Caotarget triple = "powerpc64le-unknown-linux-gnu" 5c428a3d2SCongzhe Cao 6c428a3d2SCongzhe Cao; Check delinearization in loop cache analysis can handle fixed-size arrays. 7c428a3d2SCongzhe Cao; The IR is copied from llvm/test/Analysis/DependenceAnalysis/SimpleSIVNoValidityCheckFixedSize.ll 8c428a3d2SCongzhe Cao 93d6fe7acSCongzhe Cao; CHECK: Loop 'for.body' has cost = 4186116 10*67025946SRouzbeh; CHECK-NEXT: Loop 'for.body4' has cost = 130944 11c428a3d2SCongzhe Cao 12c428a3d2SCongzhe Cao;; #define N 1024 13c428a3d2SCongzhe Cao;; #define M 2048 14c428a3d2SCongzhe Cao;; void t1(int a[N][M]) { 15c428a3d2SCongzhe Cao;; for (int i = 0; i < N-1; ++i) 16c428a3d2SCongzhe Cao;; for (int j = 2; j < M; ++j) 17c428a3d2SCongzhe Cao;; a[i][j] = a[i+1][j-2]; 18c428a3d2SCongzhe Cao;; } 19c428a3d2SCongzhe Cao 201aee1e1fSNikita Popovdefine void @t1(ptr %a) { 21c428a3d2SCongzhe Caoentry: 22c428a3d2SCongzhe Cao br label %for.body 23c428a3d2SCongzhe Cao 24c428a3d2SCongzhe Caofor.body: ; preds = %entry, %for.inc11 25c428a3d2SCongzhe Cao %indvars.iv4 = phi i64 [ 0, %entry ], [ %indvars.iv.next5, %for.inc11 ] 26c428a3d2SCongzhe Cao br label %for.body4 27c428a3d2SCongzhe Cao 28c428a3d2SCongzhe Caofor.body4: ; preds = %for.body, %for.body4 29c428a3d2SCongzhe Cao %indvars.iv = phi i64 [ 2, %for.body ], [ %indvars.iv.next, %for.body4 ] 30c428a3d2SCongzhe Cao %0 = add nuw nsw i64 %indvars.iv4, 1 31c428a3d2SCongzhe Cao %1 = add nsw i64 %indvars.iv, -2 321aee1e1fSNikita Popov %arrayidx6 = getelementptr inbounds [2048 x i32], ptr %a, i64 %0, i64 %1 331aee1e1fSNikita Popov %2 = load i32, ptr %arrayidx6, align 4 341aee1e1fSNikita Popov %a_gep = getelementptr inbounds [2048 x i32], ptr %a, i64 0 351aee1e1fSNikita Popov %arrayidx10 = getelementptr inbounds [2048 x i32], ptr %a_gep, i64 %indvars.iv4, i64 %indvars.iv 361aee1e1fSNikita Popov store i32 %2, ptr %arrayidx10, align 4 37c428a3d2SCongzhe Cao %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 38c428a3d2SCongzhe Cao %exitcond = icmp ne i64 %indvars.iv.next, 2048 39c428a3d2SCongzhe Cao br i1 %exitcond, label %for.body4, label %for.inc11 40c428a3d2SCongzhe Cao 41c428a3d2SCongzhe Caofor.inc11: ; preds = %for.body4 42c428a3d2SCongzhe Cao %indvars.iv.next5 = add nuw nsw i64 %indvars.iv4, 1 43c428a3d2SCongzhe Cao %exitcond7 = icmp ne i64 %indvars.iv.next5, 1023 44c428a3d2SCongzhe Cao br i1 %exitcond7, label %for.body, label %for.end13 45c428a3d2SCongzhe Cao 46c428a3d2SCongzhe Caofor.end13: ; preds = %for.inc11 47c428a3d2SCongzhe Cao ret void 48c428a3d2SCongzhe Cao} 49c428a3d2SCongzhe Cao 50c428a3d2SCongzhe Cao 513d6fe7acSCongzhe Cao; CHECK: Loop 'for.body' has cost = 4186116 52*67025946SRouzbeh; CHECK-NEXT: Loop 'for.body4' has cost = 130944 53c428a3d2SCongzhe Cao 541aee1e1fSNikita Popovdefine void @t2(ptr %a) { 55c428a3d2SCongzhe Caoentry: 56c428a3d2SCongzhe Cao br label %for.body 57c428a3d2SCongzhe Cao 58c428a3d2SCongzhe Caofor.body: ; preds = %entry, %for.inc11 59c428a3d2SCongzhe Cao %indvars.iv4 = phi i64 [ 0, %entry ], [ %indvars.iv.next5, %for.inc11 ] 60c428a3d2SCongzhe Cao br label %for.body4 61c428a3d2SCongzhe Cao 62c428a3d2SCongzhe Caofor.body4: ; preds = %for.body, %for.body4 63c428a3d2SCongzhe Cao %indvars.iv = phi i64 [ 2, %for.body ], [ %indvars.iv.next, %for.body4 ] 64c428a3d2SCongzhe Cao %0 = add nuw nsw i64 %indvars.iv4, 1 65c428a3d2SCongzhe Cao %1 = add nsw i64 %indvars.iv, -2 661aee1e1fSNikita Popov %arrayidx6 = getelementptr inbounds [2048 x i32], ptr %a, i64 %0, i64 %1 671aee1e1fSNikita Popov %2 = load i32, ptr %arrayidx6, align 4 681aee1e1fSNikita Popov %call = call ptr @func_with_returned_arg(ptr returned %a) 691aee1e1fSNikita Popov %arrayidx10 = getelementptr inbounds [2048 x i32], ptr %call, i64 %indvars.iv4, i64 %indvars.iv 701aee1e1fSNikita Popov store i32 %2, ptr %arrayidx10, align 4 71c428a3d2SCongzhe Cao %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 72c428a3d2SCongzhe Cao %exitcond = icmp ne i64 %indvars.iv.next, 2048 73c428a3d2SCongzhe Cao br i1 %exitcond, label %for.body4, label %for.inc11 74c428a3d2SCongzhe Cao 75c428a3d2SCongzhe Caofor.inc11: ; preds = %for.body4 76c428a3d2SCongzhe Cao %indvars.iv.next5 = add nuw nsw i64 %indvars.iv4, 1 77c428a3d2SCongzhe Cao %exitcond7 = icmp ne i64 %indvars.iv.next5, 1023 78c428a3d2SCongzhe Cao br i1 %exitcond7, label %for.body, label %for.end13 79c428a3d2SCongzhe Cao 80c428a3d2SCongzhe Caofor.end13: ; preds = %for.inc11 81c428a3d2SCongzhe Cao ret void 82c428a3d2SCongzhe Cao} 83c428a3d2SCongzhe Cao 841aee1e1fSNikita Popovdeclare ptr @func_with_returned_arg(ptr returned %arg) 85c428a3d2SCongzhe Cao 86ef4ecc3cSBardia Mahjour; CHECK: Loop 'for.body' has cost = 2112128815104000000 8780ab16d0SCongzhe Cao; CHECK-NEXT: Loop 'for.body4' has cost = 16762927104000000 8880ab16d0SCongzhe Cao; CHECK-NEXT: Loop 'for.body8' has cost = 130960368000000 8980ab16d0SCongzhe Cao; CHECK-NEXT: Loop 'for.body12' has cost = 1047682944000 90*67025946SRouzbeh; CHECK-NEXT: Loop 'for.body16' has cost = 32772096000 91c428a3d2SCongzhe Cao 92ef4ecc3cSBardia Mahjour;; #define N 128 93c428a3d2SCongzhe Cao;; #define M 2048 94c428a3d2SCongzhe Cao;; void t3(int a[][N][N][N][M]) { 95c428a3d2SCongzhe Cao;; for (int i1 = 0; i1 < N-1; ++i1) 96c428a3d2SCongzhe Cao;; for (int i2 = 2; i2 < N; ++i2) 97c428a3d2SCongzhe Cao;; for (int i3 = 0; i3 < N; ++i3) 98c428a3d2SCongzhe Cao;; for (int i4 = 3; i4 < N; ++i4) 99c428a3d2SCongzhe Cao;; for (int i5 = 0; i5 < M-2; ++i5) 100c428a3d2SCongzhe Cao;; a[i1][i2][i3][i4][i5] = a[i1+1][i2-2][i3][i4-3][i5+2]; 101c428a3d2SCongzhe Cao;; } 102c428a3d2SCongzhe Cao 1031aee1e1fSNikita Popovdefine void @t3(ptr %a) { 104c428a3d2SCongzhe Caoentry: 105c428a3d2SCongzhe Cao br label %for.body 106c428a3d2SCongzhe Cao 107c428a3d2SCongzhe Caofor.body: ; preds = %entry, %for.inc46 108c428a3d2SCongzhe Cao %indvars.iv18 = phi i64 [ 0, %entry ], [ %indvars.iv.next19, %for.inc46 ] 109c428a3d2SCongzhe Cao br label %for.body4 110c428a3d2SCongzhe Cao 111c428a3d2SCongzhe Caofor.body4: ; preds = %for.body, %for.inc43 112c428a3d2SCongzhe Cao %indvars.iv14 = phi i64 [ 2, %for.body ], [ %indvars.iv.next15, %for.inc43 ] 113c428a3d2SCongzhe Cao br label %for.body8 114c428a3d2SCongzhe Cao 115c428a3d2SCongzhe Caofor.body8: ; preds = %for.body4, %for.inc40 116c428a3d2SCongzhe Cao %indvars.iv11 = phi i64 [ 0, %for.body4 ], [ %indvars.iv.next12, %for.inc40 ] 117c428a3d2SCongzhe Cao br label %for.body12 118c428a3d2SCongzhe Cao 119c428a3d2SCongzhe Caofor.body12: ; preds = %for.body8, %for.inc37 120c428a3d2SCongzhe Cao %indvars.iv7 = phi i64 [ 3, %for.body8 ], [ %indvars.iv.next8, %for.inc37 ] 121c428a3d2SCongzhe Cao br label %for.body16 122c428a3d2SCongzhe Cao 123c428a3d2SCongzhe Caofor.body16: ; preds = %for.body12, %for.body16 124c428a3d2SCongzhe Cao %indvars.iv = phi i64 [ 0, %for.body12 ], [ %indvars.iv.next, %for.body16 ] 125c428a3d2SCongzhe Cao %0 = add nuw nsw i64 %indvars.iv18, 1 126c428a3d2SCongzhe Cao %1 = add nsw i64 %indvars.iv14, -2 127c428a3d2SCongzhe Cao %2 = add nsw i64 %indvars.iv7, -3 128c428a3d2SCongzhe Cao %3 = add nuw nsw i64 %indvars.iv, 2 1291aee1e1fSNikita Popov %arrayidx26 = getelementptr inbounds [128 x [128 x [128 x [2048 x i32]]]], ptr %a, i64 %0, i64 %1, i64 %indvars.iv11, i64 %2, i64 %3 1301aee1e1fSNikita Popov %4 = load i32, ptr %arrayidx26, align 4 1311aee1e1fSNikita Popov %arrayidx36 = getelementptr inbounds [128 x [128 x [128 x [2048 x i32]]]], ptr %a, i64 %indvars.iv18, i64 %indvars.iv14, i64 %indvars.iv11, i64 %indvars.iv7, i64 %indvars.iv 1321aee1e1fSNikita Popov store i32 %4, ptr %arrayidx36, align 4 133c428a3d2SCongzhe Cao %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 134c428a3d2SCongzhe Cao %exitcond = icmp ne i64 %indvars.iv.next, 2046 135c428a3d2SCongzhe Cao br i1 %exitcond, label %for.body16, label %for.inc37 136c428a3d2SCongzhe Cao 137c428a3d2SCongzhe Caofor.inc37: ; preds = %for.body16 138c428a3d2SCongzhe Cao %indvars.iv.next8 = add nuw nsw i64 %indvars.iv7, 1 139ef4ecc3cSBardia Mahjour %exitcond10 = icmp ne i64 %indvars.iv.next8, 128 140c428a3d2SCongzhe Cao br i1 %exitcond10, label %for.body12, label %for.inc40 141c428a3d2SCongzhe Cao 142c428a3d2SCongzhe Caofor.inc40: ; preds = %for.inc37 143c428a3d2SCongzhe Cao %indvars.iv.next12 = add nuw nsw i64 %indvars.iv11, 1 144ef4ecc3cSBardia Mahjour %exitcond13 = icmp ne i64 %indvars.iv.next12, 128 145c428a3d2SCongzhe Cao br i1 %exitcond13, label %for.body8, label %for.inc43 146c428a3d2SCongzhe Cao 147c428a3d2SCongzhe Caofor.inc43: ; preds = %for.inc40 148c428a3d2SCongzhe Cao %indvars.iv.next15 = add nuw nsw i64 %indvars.iv14, 1 149ef4ecc3cSBardia Mahjour %exitcond17 = icmp ne i64 %indvars.iv.next15, 128 150c428a3d2SCongzhe Cao br i1 %exitcond17, label %for.body4, label %for.inc46 151c428a3d2SCongzhe Cao 152c428a3d2SCongzhe Caofor.inc46: ; preds = %for.inc43 153c428a3d2SCongzhe Cao %indvars.iv.next19 = add nuw nsw i64 %indvars.iv18, 1 154ef4ecc3cSBardia Mahjour %exitcond21 = icmp ne i64 %indvars.iv.next19, 127 155c428a3d2SCongzhe Cao br i1 %exitcond21, label %for.body, label %for.end48 156c428a3d2SCongzhe Cao 157c428a3d2SCongzhe Caofor.end48: ; preds = %for.inc46 158c428a3d2SCongzhe Cao ret void 159c428a3d2SCongzhe Cao} 160