xref: /llvm-project/polly/test/ForwardOpTree/forward_reusue.ll (revision e1f056f692d869708c1898d9d65a69ac5584a0ed)
1; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines
2;
3; Move operand tree without duplicating values used multiple times.
4;
5define void @func(i32 %n, ptr noalias nonnull %A) {
6entry:
7  br label %for
8
9for:
10  %j = phi i32 [0, %entry], [%j.inc, %inc]
11  %j.cmp = icmp slt i32 %j, %n
12  br i1 %j.cmp, label %bodyA, label %exit
13
14    bodyA:
15      %val1 = fadd double 12.5, 12.5
16      %val2 = fadd double %val1, %val1
17      %val3 = fadd double %val2, %val2
18      %val4 = fadd double %val3, %val3
19      %val5 = fadd double %val4, %val4
20      br label %bodyB
21
22    bodyB:
23      store double %val5, ptr %A
24      br label %inc
25
26inc:
27  %j.inc = add nuw nsw i32 %j, 1
28  br label %for
29
30exit:
31  br label %return
32
33return:
34  ret void
35}
36
37
38; CHECK: Statistics {
39; CHECK:     Instructions copied: 5
40; CHECK:     Operand trees forwarded: 1
41; CHECK: }
42
43; CHECK:      After statements {
44; CHECK-NEXT:     Stmt_bodyA
45; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
46; CHECK-NEXT:                 [n] -> { Stmt_bodyA[i0] -> MemRef_val5[] };
47; CHECK-NEXT:             Instructions {
48; CHECK-NEXT:                   %val1 = fadd double 1.250000e+01, 1.250000e+01
49; CHECK-NEXT:                   %val2 = fadd double %val1, %val1
50; CHECK-NEXT:                   %val3 = fadd double %val2, %val2
51; CHECK-NEXT:                   %val4 = fadd double %val3, %val3
52; CHECK-NEXT:                   %val5 = fadd double %val4, %val4
53; CHECK-NEXT:             }
54; CHECK-NEXT:     Stmt_bodyB
55; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
56; CHECK-NEXT:                 [n] -> { Stmt_bodyB[i0] -> MemRef_A[0] };
57; CHECK-NEXT:             Instructions {
58; CHECK-NEXT:                   %val1 = fadd double 1.250000e+01, 1.250000e+01
59; CHECK-NEXT:                   %val2 = fadd double %val1, %val1
60; CHECK-NEXT:                   %val3 = fadd double %val2, %val2
61; CHECK-NEXT:                   %val4 = fadd double %val3, %val3
62; CHECK-NEXT:                   %val5 = fadd double %val4, %val4
63; CHECK-NEXT:                   store double %val5, ptr %A, align 8
64; CHECK-NEXT:             }
65; CHECK-NEXT: }
66