xref: /llvm-project/polly/test/ForwardOpTree/forward_load_differentarray.ll (revision e1f056f692d869708c1898d9d65a69ac5584a0ed)
1*e1f056f6Srahulana-quic; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines
270af4f57SMichael Kruse;
3235726eeSMichael Kruse; To forward %val, B[j] cannot be reused in bodyC because it is overwritten
4235726eeSMichael Kruse; between. Verify that instead the alternative C[j] is used.
5235726eeSMichael Kruse;
6235726eeSMichael Kruse; for (int j = 0; j < n; j += 1) {
7235726eeSMichael Kruse; bodyA:
8235726eeSMichael Kruse;   double val = B[j];
9235726eeSMichael Kruse;
10235726eeSMichael Kruse; bodyB:
11235726eeSMichael Kruse;   B[j] = 0;
12235726eeSMichael Kruse;   C[j] = val;
13235726eeSMichael Kruse;
14235726eeSMichael Kruse; bodyC:
15235726eeSMichael Kruse;   A[j] = val;
16235726eeSMichael Kruse; }
17235726eeSMichael Kruse;
18b332499aSNikita Popovdefine void @func(i32 %n, ptr noalias nonnull %A, ptr noalias nonnull %B, ptr noalias nonnull %C) {
1970af4f57SMichael Kruseentry:
2070af4f57SMichael Kruse  br label %for
2170af4f57SMichael Kruse
2270af4f57SMichael Krusefor:
2370af4f57SMichael Kruse  %j = phi i32 [0, %entry], [%j.inc, %inc]
2470af4f57SMichael Kruse  %j.cmp = icmp slt i32 %j, %n
2570af4f57SMichael Kruse  br i1 %j.cmp, label %bodyA, label %exit
2670af4f57SMichael Kruse
2770af4f57SMichael Kruse    bodyA:
28b332499aSNikita Popov      %B_idx = getelementptr inbounds double, ptr %B, i32 %j
29b332499aSNikita Popov      %val = load double, ptr %B_idx
3070af4f57SMichael Kruse      br label %bodyB
3170af4f57SMichael Kruse
3270af4f57SMichael Kruse    bodyB:
33b332499aSNikita Popov      store double 0.0, ptr %B_idx
34b332499aSNikita Popov      %C_idx = getelementptr inbounds double, ptr %C, i32 %j
35b332499aSNikita Popov      store double %val, ptr %C_idx
3670af4f57SMichael Kruse      br label %bodyC
3770af4f57SMichael Kruse
3870af4f57SMichael Kruse    bodyC:
39b332499aSNikita Popov      %A_idx = getelementptr inbounds double, ptr %A, i32 %j
40b332499aSNikita Popov      store double %val, ptr %A_idx
4170af4f57SMichael Kruse      br label %inc
4270af4f57SMichael Kruse
4370af4f57SMichael Kruseinc:
4470af4f57SMichael Kruse  %j.inc = add nuw nsw i32 %j, 1
4570af4f57SMichael Kruse  br label %for
4670af4f57SMichael Kruse
4770af4f57SMichael Kruseexit:
4870af4f57SMichael Kruse  br label %return
4970af4f57SMichael Kruse
5070af4f57SMichael Krusereturn:
5170af4f57SMichael Kruse  ret void
5270af4f57SMichael Kruse}
5370af4f57SMichael Kruse
5470af4f57SMichael Kruse
5570af4f57SMichael Kruse; CHECK: Statistics {
5670af4f57SMichael Kruse; CHECK:     Known loads forwarded: 2
5770af4f57SMichael Kruse; CHECK:     Operand trees forwarded: 2
5870af4f57SMichael Kruse; CHECK:     Statements with forwarded operand trees: 2
5970af4f57SMichael Kruse; CHECK: }
6070af4f57SMichael Kruse
6170af4f57SMichael Kruse; CHECK-NEXT: After statements {
6270af4f57SMichael Kruse; CHECK-NEXT:     Stmt_bodyA
6370af4f57SMichael Kruse; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
6470af4f57SMichael Kruse; CHECK-NEXT:                 [n] -> { Stmt_bodyA[i0] -> MemRef_B[i0] };
6570af4f57SMichael Kruse; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
6670af4f57SMichael Kruse; CHECK-NEXT:                 [n] -> { Stmt_bodyA[i0] -> MemRef_val[] };
6770af4f57SMichael Kruse; CHECK-NEXT:             Instructions {
68b332499aSNikita Popov; CHECK-NEXT:                   %val = load double, ptr %B_idx, align 8
6970af4f57SMichael Kruse; CHECK-NEXT:             }
7070af4f57SMichael Kruse; CHECK-NEXT:     Stmt_bodyB
7170af4f57SMichael Kruse; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
7200fd43b3SPhilip Pfaffe; CHECK-NEXT:                 ;
7370af4f57SMichael Kruse; CHECK-NEXT:            new: [n] -> { Stmt_bodyB[i0] -> MemRef_B[i0] };
7470af4f57SMichael Kruse; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
7570af4f57SMichael Kruse; CHECK-NEXT:                 [n] -> { Stmt_bodyB[i0] -> MemRef_B[i0] };
7670af4f57SMichael Kruse; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
7770af4f57SMichael Kruse; CHECK-NEXT:                 [n] -> { Stmt_bodyB[i0] -> MemRef_C[i0] };
7870af4f57SMichael Kruse; CHECK-NEXT:             Instructions {
79b332499aSNikita Popov; CHECK-NEXT:                   %val = load double, ptr %B_idx, align 8
80b332499aSNikita Popov; CHECK-NEXT:                   store double 0.000000e+00, ptr %B_idx, align 8
81b332499aSNikita Popov; CHECK-NEXT:                   store double %val, ptr %C_idx, align 8
8270af4f57SMichael Kruse; CHECK-NEXT:             }
8370af4f57SMichael Kruse; CHECK-NEXT:     Stmt_bodyC
8470af4f57SMichael Kruse; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
8500fd43b3SPhilip Pfaffe; CHECK-NEXT:                 ;
8670af4f57SMichael Kruse; CHECK-NEXT:            new: [n] -> { Stmt_bodyC[i0] -> MemRef_C[i0] };
8770af4f57SMichael Kruse; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
8870af4f57SMichael Kruse; CHECK-NEXT:                 [n] -> { Stmt_bodyC[i0] -> MemRef_A[i0] };
8970af4f57SMichael Kruse; CHECK-NEXT:             Instructions {
90b332499aSNikita Popov; CHECK-NEXT:                   %val = load double, ptr %B_idx, align 8
91b332499aSNikita Popov; CHECK-NEXT:                   store double %val, ptr %A_idx, align 8
9270af4f57SMichael Kruse; CHECK-NEXT:             }
9370af4f57SMichael Kruse; CHECK-NEXT: }
94