brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 24b008c Raw
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