xref: /llvm-project/polly/test/ForwardOpTree/forward_load_memset_before.ll (revision e1f056f692d869708c1898d9d65a69ac5584a0ed)
1; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines
2;
3; Rematerialize a load in the presence of a non-store WRITE access.
4;
5; for (int j = 0; j < n; j += 1) {
6; bodyA:
7;   memset(A, 0, 16);
8;   memset(B, 0, 16);
9;
10; bodyB:
11;   double val = B[j];
12;
13; bodyC:
14;   A[j] = val;
15; }
16;
17
18declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i32, i1)
19
20define void @func(i32 %n, ptr noalias nonnull %A, ptr noalias nonnull %B) {
21entry:
22  br label %for
23
24for:
25  %j = phi i32 [0, %entry], [%j.inc, %inc]
26  %j.cmp = icmp slt i32 %j, %n
27  br i1 %j.cmp, label %bodyA, label %exit
28
29    bodyA:
30      call void @llvm.memset.p0.i64(ptr %A, i8 0, i64 16, i32 1, i1 false)
31      call void @llvm.memset.p0.i64(ptr %B, i8 0, i64 16, i32 1, i1 false)
32      br label %bodyB
33
34    bodyB:
35      %B_idx = getelementptr inbounds double, ptr %B, i32 %j
36      %val = load double, ptr %B_idx
37      br label %bodyC
38
39    bodyC:
40      %A_idx = getelementptr inbounds double, ptr %A, i32 %j
41      store double %val, ptr %A_idx
42      br label %inc
43
44inc:
45  %j.inc = add nuw nsw i32 %j, 1
46  br label %for
47
48exit:
49  br label %return
50
51return:
52  ret void
53}
54
55
56; CHECK: Statistics {
57; CHECK:     Known loads forwarded: 1
58; CHECK:     Operand trees forwarded: 1
59; CHECK:     Statements with forwarded operand trees: 1
60; CHECK: }
61
62; CHECK-NEXT: After statements {
63; CHECK:          Stmt_bodyB
64; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
65; CHECK-NEXT:                 [n] -> { Stmt_bodyB[i0] -> MemRef_B[o0] : 8i0 <= o0 <= 7 + 8i0 };
66; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
67; CHECK-NEXT:                 [n] -> { Stmt_bodyB[i0] -> MemRef_val[] };
68; CHECK-NEXT:             Instructions {
69; CHECK-NEXT:                   %val = load double, ptr %B_idx, align 8
70; CHECK-NEXT:             }
71; CHECK-NEXT:     Stmt_bodyC
72; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
73; CHECK-NEXT:                 ;
74; CHECK-NEXT:            new: [n] -> { Stmt_bodyC[i0] -> MemRef_B[8i0] };
75; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
76; CHECK-NEXT:                 [n] -> { Stmt_bodyC[i0] -> MemRef_A[o0] : 8i0 <= o0 <= 7 + 8i0 };
77; CHECK-NEXT:             Instructions {
78; CHECK-NEXT:                   %val = load double, ptr %B_idx, align 8
79; CHECK-NEXT:                   store double %val, ptr %A_idx, align 8
80; CHECK-NEXT:             }
81; CHECK-NEXT: }
82