1; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-mse -polly-print-scops -disable-output < %s | FileCheck %s 2; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s 3; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-mse -polly-print-scops -pass-remarks-analysis="polly-mse" -disable-output < %s 2>&1| FileCheck %s --check-prefix=MSE 4; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-mse>)" -pass-remarks-analysis="polly-mse" -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE 5; 6; Verify that the expansion of an array with load after store in a same statement is not done. 7; 8; Original source code : 9; 10; #define Ni 2000 11; #define Nj 3000 12; 13; void mse(double A[Ni], double B[Nj], double C[Nj], double D[Nj]) { 14; int i,j; 15; for (i = 0; i < Ni; i++) { 16; for (int j = 0; j<Nj; j++) { 17; B[j] = j; 18; C[j] = B[j]; 19; } 20; } 21; } 22; 23; Check that C is expanded 24; 25; CHECK: i64 MemRef_C_Stmt_for_body4_expanded[10000][10000]; // Element size 8 26; CHECK: new: { Stmt_for_body4[i0, i1] -> MemRef_C_Stmt_for_body4_expanded[i0, i1] }; 27; 28; Check that B is not expanded 29; 30; CHECK-NOT: double MemRef_B_Stmt_for_body4_expanded[10000][10000]; // Element size 8 31; MSE: MemRef_B has read after write to the same element in same statement. The dependences found during analysis may be wrong because Polly is not able to handle such case for now. 32; 33target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 34target triple = "x86_64-unknown-linux-gnu" 35 36define void @mse(double* %A, double* %B, double* %C, double* %D) { 37entry: 38 br label %entry.split 39 40entry.split: ; preds = %entry 41 br label %for.body 42 43for.body: ; preds = %entry.split, %for.inc9 44 %i.02 = phi i32 [ 0, %entry.split ], [ %inc10, %for.inc9 ] 45 br label %for.body4 46 47for.body4: ; preds = %for.body, %for.body4 48 %indvars.iv = phi i64 [ 0, %for.body ], [ %indvars.iv.next, %for.body4 ] 49 %0 = trunc i64 %indvars.iv to i32 50 %conv = sitofp i32 %0 to double 51 %arrayidx = getelementptr inbounds double, double* %B, i64 %indvars.iv 52 store double %conv, double* %arrayidx, align 8 53 %arrayidx6 = getelementptr inbounds double, double* %B, i64 %indvars.iv 54 %1 = bitcast double* %arrayidx6 to i64* 55 %2 = load i64, i64* %1, align 8 56 %arrayidx8 = getelementptr inbounds double, double* %C, i64 %indvars.iv 57 %3 = bitcast double* %arrayidx8 to i64* 58 store i64 %2, i64* %3, align 8 59 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 60 %exitcond = icmp ne i64 %indvars.iv.next, 10000 61 br i1 %exitcond, label %for.body4, label %for.inc9 62 63for.inc9: ; preds = %for.body4 64 %inc10 = add nuw nsw i32 %i.02, 1 65 %exitcond3 = icmp ne i32 %inc10, 10000 66 br i1 %exitcond3, label %for.body, label %for.end11 67 68for.end11: ; preds = %for.inc9 69 ret void 70} 71