diff --git a/lib/Analysis/LoopAccessAnalysis.cpp b/lib/Analysis/LoopAccessAnalysis.cpp index 35350582b4b..3248b2a2ac6 100644 --- a/lib/Analysis/LoopAccessAnalysis.cpp +++ b/lib/Analysis/LoopAccessAnalysis.cpp @@ -1938,18 +1938,7 @@ void LoopAccessInfo::analyzeLoop(AAResults *AA, LoopInfo *LI, if (blockNeedsPredication(ST->getParent(), TheLoop, DT)) Loc.AATags.TBAA = nullptr; - // SCEV does not look through non-header PHIs inside the loop. Such phis - // can be analyzed by adding separate accesses for each incoming pointer - // value. - auto *PN = dyn_cast(Loc.Ptr); - if (PN && TheLoop->contains(PN->getParent()) && - PN->getParent() != TheLoop->getHeader()) { - for (const Use &Inc : PN->incoming_values()) { - MemoryLocation NewLoc = Loc.getWithNewPtr(Inc); - Accesses.addStore(NewLoc); - } - } else - Accesses.addStore(Loc); + Accesses.addStore(Loc); } } @@ -1993,17 +1982,7 @@ void LoopAccessInfo::analyzeLoop(AAResults *AA, LoopInfo *LI, if (blockNeedsPredication(LD->getParent(), TheLoop, DT)) Loc.AATags.TBAA = nullptr; - // SCEV does not look through non-header PHIs inside the loop. Such phis can - // be analyzed by adding separate accesses for each incoming pointer value. - auto *PN = dyn_cast(Loc.Ptr); - if (PN && TheLoop->contains(PN->getParent()) && - PN->getParent() != TheLoop->getHeader()) { - for (const Use &Inc : PN->incoming_values()) { - MemoryLocation NewLoc = Loc.getWithNewPtr(Inc); - Accesses.addLoad(NewLoc, IsReadOnlyPtr); - } - } else - Accesses.addLoad(Loc, IsReadOnlyPtr); + Accesses.addLoad(Loc, IsReadOnlyPtr); } // If we write (or read-write) to a single destination and there are no diff --git a/test/Analysis/LoopAccessAnalysis/pointer-phis.ll b/test/Analysis/LoopAccessAnalysis/pointer-phis.ll index dcdf6dd6a1f..c803825896e 100644 --- a/test/Analysis/LoopAccessAnalysis/pointer-phis.ll +++ b/test/Analysis/LoopAccessAnalysis/pointer-phis.ll @@ -6,7 +6,7 @@ define i32 @load_with_pointer_phi_no_runtime_checks(%s1* %data) { ; CHECK-LABEL: load_with_pointer_phi_no_runtime_checks ; CHECK-NEXT: loop.header: -; CHECK-NEXT: Memory dependences are safe +; CHECK-NEXT: Report: cannot identify array bounds ; entry: br label %loop.header @@ -41,7 +41,7 @@ exit: ; preds = %loop.latch define i32 @store_with_pointer_phi_no_runtime_checks(%s1* %data) { ; CHECK-LABEL: 'store_with_pointer_phi_no_runtime_checks' ; CHECK-NEXT: loop.header: -; CHECK-NEXT: Memory dependences are safe +; CHECK-NEXT: Report: cannot identify array bounds ; entry: br label %loop.header @@ -76,23 +76,7 @@ exit: ; preds = %loop.latch define i32 @store_with_pointer_phi_runtime_checks(double* %A, double* %B, double* %C) { ; CHECK-LABEL: 'store_with_pointer_phi_runtime_checks' ; CHECK-NEXT: loop.header: -; CHECK-NEXT: Memory dependences are safe with run-time checks -; CHECK: Run-time memory checks: -; CHECK-NEXT: Check 0: -; CHECK-NEXT: Comparing group ([[GROUP_C:.+]]): -; CHECK-NEXT: %gep.2 = getelementptr inbounds double, double* %C, i64 %iv -; CHECK-NEXT: Against group ([[GROUP_B:.+]]): -; CHECK-NEXT: %gep.1 = getelementptr inbounds double, double* %B, i64 %iv -; CHECK-NEXT: Check 1: -; CHECK-NEXT: Comparing group ([[GROUP_C]]): -; CHECK-NEXT: %gep.2 = getelementptr inbounds double, double* %C, i64 %iv -; CHECK-NEXT: Against group ([[GROUP_A:.+]]): -; CHECK-NEXT: %arrayidx = getelementptr inbounds double, double* %A, i64 %iv -; CHECK-NEXT: Check 2: -; CHECK-NEXT: Comparing group ([[GROUP_B]]): -; CHECK-NEXT: %gep.1 = getelementptr inbounds double, double* %B, i64 %iv -; CHECK-NEXT: Against group ([[GROUP_A]]): -; CHECK-NEXT: %arrayidx = getelementptr inbounds double, double* %A, i64 %iv +; CHECK-NEXT: Report: cannot identify array bounds ; entry: br label %loop.header diff --git a/test/Transforms/LoopVectorize/vectorize-pointer-phis.ll b/test/Transforms/LoopVectorize/vectorize-pointer-phis.ll index e3168d5b5d3..53437e3d8c5 100644 --- a/test/Transforms/LoopVectorize/vectorize-pointer-phis.ll +++ b/test/Transforms/LoopVectorize/vectorize-pointer-phis.ll @@ -4,8 +4,7 @@ define i32 @load_with_pointer_phi_no_runtime_checks(%s1* %data) { ; CHECK-LABEL: @load_with_pointer_phi_no_runtime_checks -; CHECK-NOT: memcheck -; CHECK: vector.body: +; CHECK-NOT: vector.body ; entry: br label %loop.header @@ -39,8 +38,7 @@ exit: ; preds = %loop.latch define i32 @store_with_pointer_phi_no_runtime_checks(%s1* %data) { ; CHECK-LABEL: @store_with_pointer_phi_no_runtime_checks -; CHECK-NOT: memcheck -; CHECK: vector.body +; CHECK-NOT: vector.body ; entry: br label %loop.header @@ -74,8 +72,7 @@ exit: ; preds = %loop.latch define i32 @store_with_pointer_phi_runtime_checks(double* %A, double* %B, double* %C) { ; CHECK-LABEL: @store_with_pointer_phi_runtime_checks -; CHECK: memcheck -; CHECK: vector.body +; CHECK-NOT: vector.body ; entry: br label %loop.header