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