94 lines · plain
1; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines2;3; To forward %val, B[j] cannot be reused in bodyC because it is overwritten4; between. Verify that instead the alternative C[j] is used.5;6; for (int j = 0; j < n; j += 1) {7; bodyA:8; double val = B[j];9;10; bodyB:11; B[j] = 0;12; C[j] = val;13;14; bodyC:15; A[j] = val;16; }17;18define void @func(i32 %n, ptr noalias nonnull %A, ptr noalias nonnull %B, ptr noalias nonnull %C) {19entry:20 br label %for21 22for:23 %j = phi i32 [0, %entry], [%j.inc, %inc]24 %j.cmp = icmp slt i32 %j, %n25 br i1 %j.cmp, label %bodyA, label %exit26 27 bodyA:28 %B_idx = getelementptr inbounds double, ptr %B, i32 %j29 %val = load double, ptr %B_idx30 br label %bodyB31 32 bodyB:33 store double 0.0, ptr %B_idx34 %C_idx = getelementptr inbounds double, ptr %C, i32 %j35 store double %val, ptr %C_idx36 br label %bodyC37 38 bodyC:39 %A_idx = getelementptr inbounds double, ptr %A, i32 %j40 store double %val, ptr %A_idx41 br label %inc42 43inc:44 %j.inc = add nuw nsw i32 %j, 145 br label %for46 47exit:48 br label %return49 50return:51 ret void52}53 54 55; CHECK: Statistics {56; CHECK: Known loads forwarded: 257; CHECK: Operand trees forwarded: 258; CHECK: Statements with forwarded operand trees: 259; CHECK: }60 61; CHECK-NEXT: After statements {62; CHECK-NEXT: Stmt_bodyA63; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]64; CHECK-NEXT: [n] -> { Stmt_bodyA[i0] -> MemRef_B[i0] };65; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]66; CHECK-NEXT: [n] -> { Stmt_bodyA[i0] -> MemRef_val[] };67; CHECK-NEXT: Instructions {68; CHECK-NEXT: %val = load double, ptr %B_idx, align 869; CHECK-NEXT: }70; CHECK-NEXT: Stmt_bodyB71; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]72; CHECK-NEXT: ;73; CHECK-NEXT: new: [n] -> { Stmt_bodyB[i0] -> MemRef_B[i0] };74; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]75; CHECK-NEXT: [n] -> { Stmt_bodyB[i0] -> MemRef_B[i0] };76; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]77; CHECK-NEXT: [n] -> { Stmt_bodyB[i0] -> MemRef_C[i0] };78; CHECK-NEXT: Instructions {79; CHECK-NEXT: %val = load double, ptr %B_idx, align 880; CHECK-NEXT: store double 0.000000e+00, ptr %B_idx, align 881; CHECK-NEXT: store double %val, ptr %C_idx, align 882; CHECK-NEXT: }83; CHECK-NEXT: Stmt_bodyC84; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]85; CHECK-NEXT: ;86; CHECK-NEXT: new: [n] -> { Stmt_bodyC[i0] -> MemRef_C[i0] };87; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]88; CHECK-NEXT: [n] -> { Stmt_bodyC[i0] -> MemRef_A[i0] };89; CHECK-NEXT: Instructions {90; CHECK-NEXT: %val = load double, ptr %B_idx, align 891; CHECK-NEXT: store double %val, ptr %A_idx, align 892; CHECK-NEXT: }93; CHECK-NEXT: }94