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