xref: /llvm-project/polly/test/ForwardOpTree/forward_from_region.ll (revision e1f056f692d869708c1898d9d65a69ac5584a0ed)
1; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines
2;
3; Move instructions from region statements.
4;
5; for (int j = 0; j < n; j += 1) {
6; bodyA:
7;   double val = 21.0 + 21.0;
8;   if (cond)
9;
10; bodyA_true:
11;     A[0] = 42;
12;
13; bodyB:
14;     A[0] = val;
15; }
16;
17define void @func(i32 %n, ptr noalias nonnull %A) {
18entry:
19  br label %for
20
21for:
22  %j = phi i32 [0, %entry], [%j.inc, %inc]
23  %j.cmp = icmp slt i32 %j, %n
24  br i1 %j.cmp, label %bodyA, label %exit
25
26    bodyA:
27      %val = fadd double 21.0, 21.0
28      %cond = fcmp oeq double 21.0, 21.0
29      br i1 %cond, label %bodyA_true, label %bodyB
30
31    bodyA_true:
32      store double 42.0, ptr %A
33      br label %bodyB
34
35    bodyB:
36      store double %val, ptr %A
37      br label %bodyB_exit
38
39    bodyB_exit:
40      br label %inc
41
42inc:
43  %j.inc = add nuw nsw i32 %j, 1
44  br label %for
45
46exit:
47  br label %return
48
49return:
50  ret void
51}
52
53; CHECK:      Statistics {
54; CHECK:     Instructions copied: 1
55; CHECK:     Known loads forwarded: 0
56; CHECK:     Read-only accesses copied: 0
57; CHECK:     Operand trees forwarded: 1
58; CHECK:     Statements with forwarded operand trees: 1
59; CHECK: }
60; CHECK: After statements {
61; CHECK:     Stmt_bodyA__TO__bodyB
62; CHECK:             MayWriteAccess :=	[Reduction Type: NONE] [Scalar: 0]
63; CHECK:                 [n] -> { Stmt_bodyA__TO__bodyB[i0] -> MemRef_A[0] };
64; CHECK:             MustWriteAccess :=	[Reduction Type: NONE] [Scalar: 1]
65; CHECK:                 [n] -> { Stmt_bodyA__TO__bodyB[i0] -> MemRef_val[] };
66; CHECK:             Instructions {
67; CHECK:                   %val = fadd double 2.100000e+01, 2.100000e+01
68; CHECK:                   %cond = fcmp oeq double 2.100000e+01, 2.100000e+01
69; CHECK:             }
70; CHECK:     Stmt_bodyB
71; CHECK:             MustWriteAccess :=	[Reduction Type: NONE] [Scalar: 0]
72; CHECK:                 [n] -> { Stmt_bodyB[i0] -> MemRef_A[0] };
73; CHECK:             Instructions {
74; CHECK:                   %val = fadd double 2.100000e+01, 2.100000e+01
75; CHECK:                   store double %val, ptr %A, align 8
76; CHECK:             }
77; CHECK: }
78
79