1; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-print-delicm -disable-output < %s | FileCheck -match-full-lines %s
2; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-delicm>)" -disable-output < %s | FileCheck -match-full-lines %s
3;
4; Check that PHI mapping works even in presence of a memset whose'
5; zero value is used.
6;
7declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1)
8
9define void @func(i8* noalias nonnull %A) {
10entry:
11  br label %outer.for
12
13outer.for:
14  %j = phi i32 [0, %entry], [%j.inc, %outer.inc]
15  %j.cmp = icmp slt i32 %j, 2
16  br i1 %j.cmp, label %bodyA, label %outer.exit
17
18
19    bodyA:
20      %A_idx = getelementptr inbounds i8, i8* %A, i32 %j
21      %cond = icmp eq i32 21, 21
22      br i1 %cond, label %bodyB, label %bodyC
23
24    bodyB:
25      call void @llvm.memset.p0i8.i64(i8* %A_idx, i8 0, i64 1, i32 1, i1 false)
26      br label %bodyC
27
28    bodyC:
29      %phi = phi i8 [1, %bodyA], [0, %bodyB]
30      %a = load i8, i8* %A_idx
31      store i8 %phi, i8* %A_idx
32      br label %outer.inc
33
34
35outer.inc:
36  %j.inc = add nuw nsw i32 %j, 1
37  br label %outer.for
38
39outer.exit:
40  br label %return
41
42return:
43  ret void
44}
45
46
47; CHECK: Statistics {
48; CHECK:     Compatible overwrites: 1
49; CHECK:     Overwrites mapped to:  1
50; CHECK:     PHI scalars mapped:    1
51; CHECK: }
52
53; CHECK:      After accesses {
54; CHECK-NEXT:     Stmt_bodyA
55; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
56; CHECK-NEXT:                 { Stmt_bodyA[i0] -> MemRef_phi__phi[] };
57; CHECK-NEXT:            new: { Stmt_bodyA[i0] -> MemRef_A[o0] : false };
58; CHECK-NEXT:     Stmt_bodyB
59; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
60; CHECK-NEXT:                 { Stmt_bodyB[i0] -> MemRef_A[i0] };
61; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
62; CHECK-NEXT:                 { Stmt_bodyB[i0] -> MemRef_phi__phi[] };
63; CHECK-NEXT:            new: { Stmt_bodyB[i0] -> MemRef_A[i0] };
64; CHECK-NEXT:     Stmt_bodyC
65; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 1]
66; CHECK-NEXT:                 { Stmt_bodyC[i0] -> MemRef_phi__phi[] };
67; CHECK-NEXT:            new: { Stmt_bodyC[i0] -> MemRef_A[i0] };
68; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
69; CHECK-NEXT:                 { Stmt_bodyC[i0] -> MemRef_A[i0] };
70; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
71; CHECK-NEXT:                 { Stmt_bodyC[i0] -> MemRef_A[i0] };
72; CHECK-NEXT: }
73