[ScopBuilder/Simplify] Refactor isEscaping. NFC.
[polly-mirror.git] / test / ScopInfo / pointer-used-as-base-pointer-and-scalar-read.ll
blobc34b3f1f01e04b977b531b7b18e9a89186359fdf
1 ; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
3 ; In this test case we pass a pointer %A into a PHI node and also use this
4 ; pointer as base pointer of an array store. As a result, we get both scalar
5 ; and array memory accesses to A[] and A[0].
7 ; CHECK:      Arrays {
8 ; CHECK-NEXT:     float MemRef_A[*]; // Element size 4
9 ; CHECK-NEXT:     float* MemRef_x__phi; // Element size 8
10 ; CHECK-NEXT:     float* MemRef_C[*]; // Element size 8
11 ; CHECK-NEXT: }
12 ; CHECK:      Arrays (Bounds as pw_affs) {
13 ; CHECK-NEXT:     float MemRef_A[*]; // Element size 4
14 ; CHECK-NEXT:     float* MemRef_x__phi; // Element size 8
15 ; CHECK-NEXT:     float* MemRef_C[*]; // Element size 8
16 ; CHECK-NEXT: }
17 ; CHECK:      Alias Groups (0):
18 ; CHECK-NEXT:     n/a
19 ; CHECK:      Statements {
20 ; CHECK-NEXT:     Stmt_then
21 ; CHECK-NEXT:         Domain :=
22 ; CHECK-NEXT:             [p] -> { Stmt_then[i0] : p = 32 and 0 <= i0 <= 999 };
23 ; CHECK-NEXT:         Schedule :=
24 ; CHECK-NEXT:             [p] -> { Stmt_then[i0] -> [i0, 1] };
25 ; CHECK-NEXT:         MustWriteAccess :=    [Reduction Type: NONE] [Scalar: 0]
26 ; CHECK-NEXT:             [p] -> { Stmt_then[i0] -> MemRef_A[0] };
27 ; CHECK-NEXT:         MustWriteAccess :=    [Reduction Type: NONE] [Scalar: 1]
28 ; CHECK-NEXT:             [p] -> { Stmt_then[i0] -> MemRef_x__phi[] };
29 ; CHECK-NEXT:     Stmt_else
30 ; CHECK-NEXT:         Domain :=
31 ; CHECK-NEXT:             [p] -> { Stmt_else[i0] : 0 <= i0 <= 999 and (p >= 33 or p <= 31) };
32 ; CHECK-NEXT:         Schedule :=
33 ; CHECK-NEXT:             [p] -> { Stmt_else[i0] -> [i0, 0] : p >= 33 or p <= 31 };
34 ; CHECK-NEXT:         MustWriteAccess :=    [Reduction Type: NONE] [Scalar: 0]
35 ; CHECK-NEXT:             [p] -> { Stmt_else[i0] -> MemRef_A[0] };
36 ; CHECK-NEXT:         MustWriteAccess :=    [Reduction Type: NONE] [Scalar: 1]
37 ; CHECK-NEXT:             [p] -> { Stmt_else[i0] -> MemRef_x__phi[] };
38 ; CHECK-NEXT:     Stmt_bb8
39 ; CHECK-NEXT:         Domain :=
40 ; CHECK-NEXT:             [p] -> { Stmt_bb8[i0] : 0 <= i0 <= 999 };
41 ; CHECK-NEXT:         Schedule :=
42 ; CHECK-NEXT:             [p] -> { Stmt_bb8[i0] -> [i0, 2] };
43 ; CHECK-NEXT:         ReadAccess :=    [Reduction Type: NONE] [Scalar: 1]
44 ; CHECK-NEXT:             [p] -> { Stmt_bb8[i0] -> MemRef_x__phi[] };
45 ; CHECK-NEXT:         MustWriteAccess :=    [Reduction Type: NONE] [Scalar: 0]
46 ; CHECK-NEXT:             [p] -> { Stmt_bb8[i0] -> MemRef_C[0] };
47 ; CHECK-NEXT: }
49 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
51 define void @foo(float* noalias %A, float* noalias %B, float ** noalias %C, i32 %p) {
52 bb:
53   br label %bb1
55 bb1:
56   %i.0 = phi i64 [ 0, %bb ], [ %tmp9, %bb8 ]
57   %exitcond = icmp ne i64 %i.0, 1000
58   br i1 %exitcond, label %bb2, label %bb10
60 bb2:
61   %cmp = icmp eq i32 %p, 32
62   br i1 %cmp, label %then, label %else
64 then:
65   store float 3.0, float* %A
66   br label %bb8
68 else:
69   store float 4.0, float* %A
70   br label %bb8
72 bb8:
73   %x = phi float* [%A, %then], [%B, %else]
74   store float* %x, float** %C
75   %tmp9 = add nuw nsw i64 %i.0, 1
76   br label %bb1
78 bb10:
79   ret void