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