[llvm] 30bd665 - [BasicAA] Fix recursive phi MustAlias calculations

David Green via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 2 06:01:55 PDT 2020


Author: David Green
Date: 2020-07-02T14:01:38+01:00
New Revision: 30bd66544d7a1e602dfaf412158d4bd759352e36

URL: https://github.com/llvm/llvm-project/commit/30bd66544d7a1e602dfaf412158d4bd759352e36
DIFF: https://github.com/llvm/llvm-project/commit/30bd66544d7a1e602dfaf412158d4bd759352e36.diff

LOG: [BasicAA] Fix recursive phi MustAlias calculations

With the option -basic-aa-recphi we can detect recursive phis that loop
through constant geps, which allows us to detect more no-alias case for
pointer IV's. If the other phi operand and the other alias value are
MustAlias though, we cannot presume that every element in the loop is
also MustAlias. We need to instead be conservative and return MayAlias.

Differential Revision: https://reviews.llvm.org/D82987

Added: 
    

Modified: 
    llvm/lib/Analysis/BasicAliasAnalysis.cpp
    llvm/test/Analysis/BasicAA/recphi.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
index 658301cc9e0f..86f8932490e6 100644
--- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp
+++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
@@ -1724,6 +1724,10 @@ AliasResult BasicAAResult::aliasPHI(const PHINode *PN, LocationSize PNSize,
   // Other results are not possible.
   if (Alias == MayAlias)
     return MayAlias;
+  // With recursive phis we cannot guarantee that MustAlias/PartialAlias will
+  // remain valid to all elements and needs to conservatively return MayAlias.
+  if (isRecursive && Alias != NoAlias)
+    return MayAlias;
 
   // If all sources of the PHI node NoAlias or MustAlias V2, then returns
   // NoAlias / MustAlias. Otherwise, returns MayAlias.

diff  --git a/llvm/test/Analysis/BasicAA/recphi.ll b/llvm/test/Analysis/BasicAA/recphi.ll
index a8bf47ae2283..130058c74560 100644
--- a/llvm/test/Analysis/BasicAA/recphi.ll
+++ b/llvm/test/Analysis/BasicAA/recphi.ll
@@ -3,9 +3,9 @@
 ; CHECK-LABEL: Function: simple: 5 pointers, 0 call sites
 ; CHECK:         NoAlias:      float* %src1, float* %src2
 ; CHECK:         NoAlias:      float* %phi, float* %src1
-; CHECK:         MustAlias:    float* %phi, float* %src2
+; CHECK:         MayAlias:     float* %phi, float* %src2
 ; CHECK:         NoAlias:      float* %next, float* %src1
-; CHECK:         NoAlias:      float* %next, float* %src2
+; CHECK:         MayAlias:     float* %next, float* %src2
 ; CHECK:         NoAlias:      float* %next, float* %phi
 ; CHECK:         NoAlias:      float* %g, float* %src1
 ; CHECK:         NoAlias:      float* %g, float* %src2
@@ -38,13 +38,13 @@ end:
 ; CHECK:        MustAlias:    [2 x i32]* %tab, i32* %arrayidx1
 ; CHECK:        MustAlias:    i32* %arrayidx1, i8* %0
 ; CHECK:        NoAlias:      i32* %arrayidx, i32* %arrayidx1
-; CHECK:        MustAlias:    [2 x i32]* %tab, i32* %p.addr.05.i
-; CHECK:        MustAlias:    i32* %p.addr.05.i, i8* %0
-; CHECK:        NoAlias:      i32* %arrayidx, i32* %p.addr.05.i
-; CHECK:        MustAlias:    i32* %arrayidx1, i32* %p.addr.05.i
-; CHECK:        PartialAlias: [2 x i32]* %tab, i32* %incdec.ptr.i
+; CHECK:        MayAlias:     [2 x i32]* %tab, i32* %p.addr.05.i
+; CHECK:        MayAlias:     i32* %p.addr.05.i, i8* %0
+; CHECK:        MayAlias:     i32* %arrayidx, i32* %p.addr.05.i
+; CHECK:        MayAlias:     i32* %arrayidx1, i32* %p.addr.05.i
+; CHECK:        MayAlias:     [2 x i32]* %tab, i32* %incdec.ptr.i
 ; CHECK:        NoAlias:      i32* %incdec.ptr.i, i8* %0
-; CHECK:        MustAlias:    i32* %arrayidx, i32* %incdec.ptr.i
+; CHECK:        MayAlias:     i32* %arrayidx, i32* %incdec.ptr.i
 ; CHECK:        NoAlias:      i32* %arrayidx1, i32* %incdec.ptr.i
 ; CHECK:        NoAlias:      i32* %incdec.ptr.i, i32* %p.addr.05.i
 define i32 @notmust() nounwind {


        


More information about the llvm-commits mailing list