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