brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · 51a7d54 Raw
151 lines · plain
1; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-invariant-load-hoisting=true -polly-allow-nonaffine-loops=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST2; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-invariant-load-hoisting=true -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALL3;4; Negative test for INNERMOST.5; At the moment we will optimistically assume A[i] in the conditional before the inner6; loop might be invariant and expand the SCoP from the loop to include the conditional. However,7; during SCoP generation we will realize that A[i] is in not always invariant.8;9; Possible solutions could be:10;   - Do not optimistically assume it to be invariant (as before this commit), however we would loose11;     a lot of invariant cases due to possible aliasing.12;   - Reduce the size of the SCoP if an assumed invariant access is in fact not invariant instead of13;     rejecting the whole region.14;15; INNERMOST:         Function: f16; INNERMOST-NEXT:    Region: %bb4---%bb317; INNERMOST-NEXT:    Max Loop Depth:  118; INNERMOST-NEXT:    Invariant Accesses: {19; INNERMOST-NEXT:            ReadAccess :=	[Reduction Type: NONE] [Scalar: 0]20; INNERMOST-NEXT:                [tmp6, N, p_2] -> { Stmt_bb4[] -> MemRef_A[p_2] };21; INNERMOST-NEXT:            Execution Context: [tmp6, N, p_2] -> { : (tmp6 > 0 and p_2 >= N) or (tmp6 < 0 and p_2 >= N) or tmp6 = 0 }22; INNERMOST-NEXT:    }23; INNERMOST-NEXT:    Context:24; INNERMOST-NEXT:    [tmp6, N, p_2] -> {  : -2147483648 <= tmp6 <= 2147483647 and -2147483648 <= N <= 2147483647 and 0 <= p_2 <= 1024 }25; INNERMOST-NEXT:    Assumed Context:26; INNERMOST-NEXT:    [tmp6, N, p_2] -> {  :  }27; INNERMOST-NEXT:    Invalid Context:28; INNERMOST-NEXT:    [tmp6, N, p_2] -> {  : p_2 < N and (tmp6 < 0 or tmp6 > 0) }29; INNERMOST:         p0: %tmp630; INNERMOST-NEXT:    p1: %N31; INNERMOST-NEXT:    p2: {0,+,1}<nuw><nsw><%bb3>32; INNERMOST-NEXT:    Arrays {33; INNERMOST-NEXT:        i32 MemRef_A[*]; // Element size 434; INNERMOST-NEXT:        i64 MemRef_indvars_iv_next2; // Element size 835; INNERMOST-NEXT:    }36; INNERMOST-NEXT:    Arrays (Bounds as pw_affs) {37; INNERMOST-NEXT:        i32 MemRef_A[*]; // Element size 438; INNERMOST-NEXT:        i64 MemRef_indvars_iv_next2; // Element size 839; INNERMOST-NEXT:    }40; INNERMOST-NEXT:    Alias Groups (0):41; INNERMOST-NEXT:        n/a42; INNERMOST-NEXT:    Statements {43; INNERMOST-NEXT:    	Stmt_bb1144; INNERMOST-NEXT:            Domain :=45; INNERMOST-NEXT:                [tmp6, N, p_2] -> { Stmt_bb11[i0] : 0 <= i0 < N and (tmp6 < 0 or tmp6 > 0) };46; INNERMOST-NEXT:            Schedule :=47; INNERMOST-NEXT:                [tmp6, N, p_2] -> { Stmt_bb11[i0] -> [0, i0] : tmp6 < 0 or tmp6 > 0 };48; INNERMOST-NEXT:            ReadAccess :=	[Reduction Type: +] [Scalar: 0]49; INNERMOST-NEXT:                [tmp6, N, p_2] -> { Stmt_bb11[i0] -> MemRef_A[i0] };50; INNERMOST-NEXT:            MustWriteAccess :=	[Reduction Type: +] [Scalar: 0]51; INNERMOST-NEXT:                [tmp6, N, p_2] -> { Stmt_bb11[i0] -> MemRef_A[i0] };52; INNERMOST-NEXT:    	Stmt_bb1853; INNERMOST-NEXT:            Domain :=54; INNERMOST-NEXT:                [tmp6, N, p_2] -> { Stmt_bb18[] };55; INNERMOST-NEXT:            Schedule :=56; INNERMOST-NEXT:                [tmp6, N, p_2] -> { Stmt_bb18[] -> [1, 0] };57; INNERMOST-NEXT:            MustWriteAccess :=	[Reduction Type: NONE] [Scalar: 1]58; INNERMOST-NEXT:                [tmp6, N, p_2] -> { Stmt_bb18[] -> MemRef_indvars_iv_next2[] };59; INNERMOST-NEXT:    }60;61; ALL:      Function: f62; ALL-NEXT: Region: %bb3---%bb1963; ALL-NEXT: Max Loop Depth:  164; ALL-NEXT: Invariant Accesses: {65; ALL-NEXT: }66; ALL-NEXT: Context:67; ALL-NEXT: {  :  }68; ALL-NEXT: Assumed Context:69; ALL-NEXT: {  :  }70; ALL-NEXT: Invalid Context:71; ALL-NEXT: {  : false }72; ALL:      Arrays {73; ALL-NEXT:     i32 MemRef_A[*]; // Element size 474; ALL-NEXT: }75; ALL-NEXT: Arrays (Bounds as pw_affs) {76; ALL-NEXT:     i32 MemRef_A[*]; // Element size 477; ALL-NEXT: }78; ALL-NEXT: Alias Groups (0):79; ALL-NEXT:     n/a80; ALL-NEXT: Statements {81; ALL-NEXT:     Stmt_bb4__TO__bb1782; ALL-NEXT:         Domain :=83; ALL-NEXT:             { Stmt_bb4__TO__bb17[i0] : 0 <= i0 <= 1023 };84; ALL-NEXT:         Schedule :=85; ALL-NEXT:             { Stmt_bb4__TO__bb17[i0] -> [i0] };86; ALL-NEXT:         ReadAccess :=    [Reduction Type: NONE] [Scalar: 0]87; ALL-NEXT:             { Stmt_bb4__TO__bb17[i0] -> MemRef_A[i0] };88; ALL-NEXT:         ReadAccess :=    [Reduction Type: NONE] [Scalar: 0]89; ALL-NEXT:             { Stmt_bb4__TO__bb17[i0] -> MemRef_A[o0] : 0 <= o0 <= 2147483647 };90; ALL-NEXT:         MayWriteAccess :=    [Reduction Type: NONE] [Scalar: 0]91; ALL-NEXT:             { Stmt_bb4__TO__bb17[i0] -> MemRef_A[o0] : 0 <= o0 <= 2147483647 };92; ALL-NEXT: }93;94;    void f(int *A, int N) {95;      for (int i = 0; i < 1024; i++)96;        if (A[i])97;          for (int j = 0; j < N; j++)98;            A[j]++;99;    }100;101target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"102 103define void @f(ptr %A, i32 %N) {104bb:105  %tmp = sext i32 %N to i64106  br label %bb3107 108bb3:                                              ; preds = %bb18, %bb109  %indvars.iv1 = phi i64 [ %indvars.iv.next2, %bb18 ], [ 0, %bb ]110  %exitcond = icmp ne i64 %indvars.iv1, 1024111  br i1 %exitcond, label %bb4, label %bb19112 113bb4:                                              ; preds = %bb3114  %tmp5 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv1115  %tmp6 = load i32, ptr %tmp5, align 4116  %tmp7 = icmp eq i32 %tmp6, 0117  br i1 %tmp7, label %bb17, label %bb8118 119bb8:                                              ; preds = %bb4120  br label %bb9121 122bb9:                                              ; preds = %bb15, %bb8123  %indvars.iv = phi i64 [ %indvars.iv.next, %bb15 ], [ 0, %bb8 ]124  %tmp10 = icmp slt i64 %indvars.iv, %tmp125  br i1 %tmp10, label %bb11, label %bb16126 127bb11:                                             ; preds = %bb9128  %tmp12 = getelementptr inbounds i32, ptr %A, i64 %indvars.iv129  %tmp13 = load i32, ptr %tmp12, align 4130  %tmp14 = add nsw i32 %tmp13, 1131  store i32 %tmp14, ptr %tmp12, align 4132  br label %bb15133 134bb15:                                             ; preds = %bb11135  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1136  br label %bb9137 138bb16:                                             ; preds = %bb9139  br label %bb17140 141bb17:                                             ; preds = %bb4, %bb16142  br label %bb18143 144bb18:                                             ; preds = %bb17145  %indvars.iv.next2 = add nuw nsw i64 %indvars.iv1, 1146  br label %bb3147 148bb19:                                             ; preds = %bb3149  ret void150}151