[LoopAccesses] Properly print whether memchecks are needed

Fix oversight in -analyze output.  PtrRtCheck contains the pointers that
need to be checked against each other and not whether memchecks are
necessary.

For instance in the testcase PtrRtCheck has four elements but all
no-alias so no checking is necessary.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234833 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Adam Nemet 2015-04-14 01:12:55 +00:00
parent 15552c46a0
commit 1624f35f2b
2 changed files with 46 additions and 3 deletions

View File

@ -1314,10 +1314,10 @@ LoopAccessInfo::LoopAccessInfo(Loop *L, ScalarEvolution *SE,
void LoopAccessInfo::print(raw_ostream &OS, unsigned Depth) const {
if (CanVecMem) {
if (PtrRtCheck.empty())
OS.indent(Depth) << "Memory dependences are safe\n";
else
if (PtrRtCheck.Need)
OS.indent(Depth) << "Memory dependences are safe with run-time checks\n";
else
OS.indent(Depth) << "Memory dependences are safe\n";
}
OS.indent(Depth) << "Store to invariant address was "

View File

@ -0,0 +1,43 @@
; RUN: opt -basicaa -loop-accesses -analyze < %s | FileCheck %s
; If the arrays don't alias this loop is safe with no memchecks:
; for (i = 0; i < n; i++)
; A[i] = A[i+1] * B[i] * C[i];
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.10.0"
; CHECK: Memory dependences are safe{{$}}
define void @f(i16* noalias %a,
i16* noalias %b,
i16* noalias %c) {
entry:
br label %for.body
for.body: ; preds = %for.body, %entry
%ind = phi i64 [ 0, %entry ], [ %add, %for.body ]
%add = add nuw nsw i64 %ind, 1
%arrayidxA_plus_2 = getelementptr inbounds i16, i16* %a, i64 %add
%loadA_plus_2 = load i16, i16* %arrayidxA_plus_2, align 2
%arrayidxB = getelementptr inbounds i16, i16* %b, i64 %ind
%loadB = load i16, i16* %arrayidxB, align 2
%arrayidxC = getelementptr inbounds i16, i16* %c, i64 %ind
%loadC = load i16, i16* %arrayidxC, align 2
%mul = mul i16 %loadB, %loadA_plus_2
%mul1 = mul i16 %mul, %loadC
%arrayidxA = getelementptr inbounds i16, i16* %a, i64 %ind
store i16 %mul1, i16* %arrayidxA, align 2
%exitcond = icmp eq i64 %add, 20
br i1 %exitcond, label %for.end, label %for.body
for.end: ; preds = %for.body
ret void
}