xref: /llvm-project/polly/test/ForwardOpTree/forward_load_memset_after.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;   double val = B[j];
8;
9; bodyB:
10;   A[j] = val;
11;
12; bodyC:
13;   memset(A, 0, 16);
14;   memset(B, 0, 16);
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      %B_idx = getelementptr inbounds double, ptr %B, i32 %j
31      %val = load double, ptr %B_idx
32      br label %bodyB
33
34    bodyB:
35      %A_idx = getelementptr inbounds double, ptr %A, i32 %j
36      store double %val, ptr %A_idx
37      br label %bodyC
38
39    bodyC:
40      call void @llvm.memset.p0.i64(ptr %A, i8 0, i64 16, i32 1, i1 false)
41      call void @llvm.memset.p0.i64(ptr %B, i8 0, i64 16, i32 1, i1 false)
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