86 lines · plain
1; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=true '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines -check-prefixes=STATS,MODEL2; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=false '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines -check-prefixes=STATS,NOMODEL3;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 %for17 18for:19 %j = phi i32 [0, %entry], [%j.inc, %inc]20 %j.cmp = icmp slt i32 %j, %n21 br i1 %j.cmp, label %bodyA, label %exit22 23 bodyA:24 %val = fadd double %arg, 21.025 br label %bodyB26 27 bodyB:28 store double %val, ptr %A29 br label %inc30 31inc:32 %j.inc = add nuw nsw i32 %j, 133 br label %for34 35exit:36 br label %return37 38return:39 ret void40}41 42 43; STATS: Statistics {44; STATS: Instructions copied: 145; MODEL: Read-only accesses copied: 146; NOMODEL: Read-only accesses copied: 047; STATS: Operand trees forwarded: 148; STATS: Statements with forwarded operand trees: 149; STATS: }50 51; MODEL: After statements {52; MODEL-NEXT: Stmt_bodyA53; 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+0159; MODEL-NEXT: }60; MODEL-NEXT: Stmt_bodyB61; 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+0167; MODEL-NEXT: store double %val, ptr %A, align 868; MODEL-NEXT: }69; MODEL-NEXT: }70 71; NOMODEL: After statements {72; NOMODEL-NEXT: Stmt_bodyA73; 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+0177; NOMODEL-NEXT: }78; NOMODEL-NEXT: Stmt_bodyB79; 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+0183; NOMODEL-NEXT: store double %val, ptr %A, align 884; NOMODEL-NEXT: }85; NOMODEL-NEXT: }86