[AA] Updates for D95543.
authordfukalov <daniil.fukalov@amd.com>
Tue, 13 Apr 2021 17:00:12 +0000 (20:00 +0300)
committerdfukalov <daniil.fukalov@amd.com>
Thu, 15 Apr 2021 09:22:03 +0000 (12:22 +0300)
Addressing latter comments in D95543:
- `AliasResult::Result` renamed to `AliasResult::Kind`
- Offset printing added for `PartialAlias` case in `-aa-eval`
- Removed VisitedPhiBBs check from BasicAA'

Reviewed By: nikic

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

llvm/include/llvm/Analysis/AliasAnalysis.h
llvm/lib/Analysis/AliasAnalysis.cpp
llvm/lib/Analysis/AliasAnalysisEvaluator.cpp
llvm/lib/Analysis/BasicAliasAnalysis.cpp
llvm/test/Analysis/BasicAA/gep-modulo.ll
llvm/test/Analysis/BasicAA/invariant_group.ll
llvm/test/Analysis/BasicAA/recphi.ll

index 1341e78..79e9907 100644 (file)
@@ -90,7 +90,7 @@ private:
   signed int Offset : OffsetBits;
 
 public:
-  enum Result : uint8_t {
+  enum Kind : uint8_t {
     /// The two locations do not alias at all.
     ///
     /// This value is arranged to convert to false, while all other values
@@ -109,10 +109,10 @@ public:
                 "Not enough bit field size for the enum!");
 
   explicit AliasResult() = delete;
-  constexpr AliasResult(const Result &Alias)
+  constexpr AliasResult(const Kind &Alias)
       : Alias(Alias), HasOffset(false), Offset(0) {}
 
-  operator Result() const { return static_cast<Result>(Alias); }
+  operator Kind() const { return static_cast<Kind>(Alias); }
 
   constexpr bool hasOffset() const { return HasOffset; }
   constexpr int32_t getOffset() const {
@@ -127,7 +127,7 @@ public:
   }
 
   /// Helper for processing AliasResult for swapped memory location pairs.
-  void swap(bool DoSwap) {
+  void swap(bool DoSwap = true) {
     if (DoSwap && hasOffset())
       setOffset(-getOffset());
   }
index c739897..910103b 100644 (file)
@@ -460,6 +460,8 @@ raw_ostream &llvm::operator<<(raw_ostream &OS, AliasResult AR) {
     break;
   case AliasResult::PartialAlias:
     OS << "PartialAlias";
+    if (AR.hasOffset())
+      OS << " (off " << AR.getOffset() << ")";
     break;
   }
   return OS;
index 27c1727..0c097b2 100644 (file)
@@ -51,8 +51,11 @@ static void PrintResults(AliasResult AR, bool P, const Value *V1,
       V2->printAsOperand(os2, true, M);
     }
 
-    if (o2 < o1)
+    if (o2 < o1) {
       std::swap(o1, o2);
+      // Change offset sign for the local AR, for printing only.
+      AR.swap();
+    }
     errs() << "  " << AR << ":\t" << o1 << ", " << o2 << "\n";
   }
 }
index 4fe7d66..963fb1a 100644 (file)
@@ -1111,8 +1111,8 @@ AliasResult BasicAAResult::aliasGEP(
         // Conservatively drop processing if a phi was visited and/or offset is
         // too big.
         AliasResult AR = AliasResult::PartialAlias;
-        if (VisitedPhiBBs.empty() && VRightSize.hasValue() &&
-            Off.ule(INT32_MAX) && (Off + VRightSize.getValue()).ule(LSize)) {
+        if (VRightSize.hasValue() && Off.ule(INT32_MAX) &&
+            (Off + VRightSize.getValue()).ule(LSize)) {
           // Memory referenced by right pointer is nested. Save the offset in
           // cache. Note that originally offset estimated as GEP1-V2, but
           // AliasResult contains the shift that represents GEP1+Offset=V2.
index 27af5ad..acdbaef 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: opt -basic-aa -aa-eval -print-all-alias-modref-info %s 2>&1 | FileCheck %s
+; RUN: opt -basic-aa -aa-eval -print-all-alias-modref-info -disable-output %s 2>&1 | FileCheck %s
 
 target datalayout = "p:64:64:64"
 
@@ -6,7 +6,7 @@ target datalayout = "p:64:64:64"
 define void @may_overflow_mul_add_i8([16 x i8]* %ptr, i8 %idx) {
 ; CHECK-LABEL: Function: may_overflow_mul_add_i8: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.6
+; CHECK-NEXT:    PartialAlias (off 6): [16 x i8]* %ptr, i8* %gep.6
 ; CHECK-NEXT:    MayAlias:  i8* %gep.6, i8* %gep.idx
 ;
   %mul = mul i8 %idx, 5
@@ -21,7 +21,7 @@ define void @may_overflow_mul_add_i8([16 x i8]* %ptr, i8 %idx) {
 define void @nuw_nsw_mul_add_i8([16 x i8]* %ptr, i8 %idx) {
 ; CHECK-LABEL: Function: nuw_nsw_mul_add_i8: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias: [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.6
+; CHECK-NEXT:    PartialAlias (off 6): [16 x i8]* %ptr, i8* %gep.6
 ; CHECK-NEXT:    NoAlias:  i8* %gep.6, i8* %gep.idx
 ;
   %mul = mul nuw nsw i8 %idx, 5
@@ -37,7 +37,7 @@ define void @nuw_nsw_mul_add_i8([16 x i8]* %ptr, i8 %idx) {
 define void @may_overflow_mul_sub_i8([16 x i8]* %ptr, i8 %idx) {
 ; CHECK-LABEL: Function: may_overflow_mul_sub_i8: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    MayAlias:  i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul i8 %idx, 5
@@ -52,7 +52,7 @@ define void @may_overflow_mul_sub_i8([16 x i8]* %ptr, i8 %idx) {
 define void @nuw_nsw_mul_sub_i8([16 x i8]* %ptr, i8 %idx) {
 ; CHECK-LABEL: Function: nuw_nsw_mul_sub_i8: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    NoAlias:  i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul nuw nsw i8 %idx, 5
@@ -69,7 +69,7 @@ define void @nuw_nsw_mul_sub_i8([16 x i8]* %ptr, i8 %idx) {
 define void @may_overflow_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
 ; CHECK-LABEL: Function: may_overflow_mul_sub_i64: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    NoAlias:  i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul i64 %idx, 5
@@ -84,7 +84,7 @@ define void @may_overflow_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
 define void @nuw_nsw_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
 ; CHECK-LABEL: Function: nuw_nsw_mul_sub_i64: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    NoAlias:  i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul nuw nsw i64 %idx, 5
@@ -99,7 +99,7 @@ define void @nuw_nsw_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
 define void @only_nsw_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
 ; CHECK-LABEL: Function: only_nsw_mul_sub_i64: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    NoAlias:  i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul nsw i64 %idx, 5
@@ -114,7 +114,7 @@ define void @only_nsw_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
 define void @only_nuw_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
 ; CHECK-LABEL: Function: only_nuw_mul_sub_i64: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    NoAlias:  i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul nuw i64 %idx, 5
@@ -129,7 +129,7 @@ define void @only_nuw_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
 define void @may_overflow_mul_pow2_sub_i64([16 x i8]* %ptr, i64 %idx) {
 ; CHECK-LABEL: Function: may_overflow_mul_pow2_sub_i64: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    NoAlias:  i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul i64 %idx, 8
@@ -145,7 +145,7 @@ define void @may_overflow_mul_pow2_sub_i64([16 x i8]* %ptr, i64 %idx) {
 define void @mul_pow2_sub_nsw_nuw_i64([16 x i8]* %ptr, i64 %idx) {
 ; CHECK-LABEL: Function: mul_pow2_sub_nsw_nuw_i64: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    NoAlias:  i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul i64 %idx, 8
@@ -160,7 +160,7 @@ define void @mul_pow2_sub_nsw_nuw_i64([16 x i8]* %ptr, i64 %idx) {
 define void @may_overflow_shl_sub_i64([16 x i8]* %ptr, i64 %idx) {
 ; CHECK-LABEL: Function: may_overflow_shl_sub_i64: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    MayAlias:  i8* %gep.3, i8* %gep.idx
 ;
   %mul = shl i64 %idx, 2
@@ -175,7 +175,7 @@ define void @may_overflow_shl_sub_i64([16 x i8]* %ptr, i64 %idx) {
 define void @shl_sub_nsw_nuw_i64([16 x i8]* %ptr, i64 %idx) {
 ; CHECK-LABEL: Function: shl_sub_nsw_nuw_i64: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias: [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    NoAlias:  i8* %gep.3, i8* %gep.idx
 ;
   %mul = shl i64 %idx, 3
@@ -191,7 +191,7 @@ define void @shl_sub_nsw_nuw_i64([16 x i8]* %ptr, i64 %idx) {
 define void @may_overflow_i32_sext([16 x i8]* %ptr, i32 %idx) {
 ; CHECK-LABEL: Function: may_overflow_i32_sext: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias:  [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3):  [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    MayAlias:     i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul i32 %idx, 678152731
@@ -207,7 +207,7 @@ define void @may_overflow_i32_sext([16 x i8]* %ptr, i32 %idx) {
 define void @nuw_nsw_i32_sext([16 x i8]* %ptr, i32 %idx) {
 ; CHECK-LABEL: Function: nuw_nsw_i32_sext: 3 pointers, 0 call sites
 ; CHECK-NEXT:    NoAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias:  [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3):  [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    NoAlias:      i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul nuw nsw i32 %idx, 678152731
@@ -224,7 +224,7 @@ define void @nuw_nsw_i32_sext([16 x i8]* %ptr, i32 %idx) {
 define void @may_overflow_i32_zext([16 x i8]* %ptr, i32 %idx) {
 ; CHECK-LABEL: Function: may_overflow_i32_zext: 3 pointers, 0 call sites
 ; CHECK-NEXT:    MayAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias:  [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3):  [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    MayAlias:     i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul i32 %idx, 678152731
@@ -240,7 +240,7 @@ define void @may_overflow_i32_zext([16 x i8]* %ptr, i32 %idx) {
 define void @nuw_nsw_i32_zext([16 x i8]* %ptr, i32 %idx) {
 ; CHECK-LABEL: Function: nuw_nsw_i32_zext: 3 pointers, 0 call sites
 ; CHECK-NEXT:    NoAlias:  [16 x i8]* %ptr, i8* %gep.idx
-; CHECK-NEXT:    PartialAlias:  [16 x i8]* %ptr, i8* %gep.3
+; CHECK-NEXT:    PartialAlias (off 3):  [16 x i8]* %ptr, i8* %gep.3
 ; CHECK-NEXT:    NoAlias:      i8* %gep.3, i8* %gep.idx
 ;
   %mul = mul nuw nsw i32 %idx, 678152731
index 204c77d..f09a02a 100644 (file)
 ; CHECK-GVN: testLaunderInvariantGroupIsNotEscapeSource
 define i8 @testLaunderInvariantGroupIsNotEscapeSource() {
 ; CHECK-DAG: MustAlias: %struct.A* %a, i8* %a.bitcast
-; CHECK-DAG: PartialAlias: %struct.A* %a, i8* %n
+; CHECK-DAG: PartialAlias (off {{[0-9]+}}): %struct.A* %a, i8* %n
 ; CHECK-DAG: NoAlias: i8* %a.bitcast, i8* %n
 ; CHECK-DAG: MustAlias: %struct.A* %a, i8* %a.laundered
 ; CHECK-DAG: MustAlias: i8* %a.bitcast, i8* %a.laundered
 ; CHECK-DAG: NoAlias: i8* %a.laundered, i8* %n
-; CHECK-DAG: PartialAlias: %struct.A* %a, i8* %n.laundered
+; CHECK-DAG: PartialAlias (off {{[0-9]+}}): %struct.A* %a, i8* %n.laundered
 ; CHECK-DAG: NoAlias: i8* %a.bitcast, i8* %n.laundered
 ; CHECK-DAG: MustAlias: i8* %n, i8* %n.laundered
 ; CHECK-DAG: NoAlias: i8* %a.laundered, i8* %n.laundered
index adb55ec..8ab50db 100644 (file)
@@ -34,7 +34,7 @@ end:
 
 ; CHECK-LABEL: Function: notmust: 6 pointers, 0 call sites
 ; CHECK:        MustAlias:    [2 x i32]* %tab, i8* %0
-; CHECK:        PartialAlias: [2 x i32]* %tab, i32* %arrayidx
+; CHECK:        PartialAlias (off 4): [2 x i32]* %tab, i32* %arrayidx
 ; CHECK:        NoAlias:      i32* %arrayidx, i8* %0
 ; CHECK:        MustAlias:    [2 x i32]* %tab, i32* %arrayidx1
 ; CHECK:        MustAlias:    i32* %arrayidx1, i8* %0
@@ -89,7 +89,7 @@ if.end: ; preds = %f.exit
 ; CHECK:         MustAlias:    [10 x i32]* %tab, i8* %0
 ; CHECK:         MustAlias:    [10 x i32]* %tab, i32* %arrayidx
 ; CHECK:         MustAlias:    i32* %arrayidx, i8* %0
-; CHECK:         PartialAlias: [10 x i32]* %tab, i32* %arrayidx1
+; CHECK:         PartialAlias (off 36): [10 x i32]* %tab, i32* %arrayidx1
 ; CHECK:         NoAlias:      i32* %arrayidx1, i8* %0
 ; CHECK:         NoAlias:      i32* %arrayidx, i32* %arrayidx1
 ; CHECK:         MayAlias:     [10 x i32]* %tab, i32* %p.addr.05.i
@@ -141,7 +141,7 @@ if.end: ; preds = %f.exit
 ; CHECK-LABEL: Function: negative: 6 pointers, 1 call sites
 ; CHECK:         NoAlias:      [3 x i16]* %int_arr.10, i16** %argv.6.par
 ; CHECK:         NoAlias:      i16* %_tmp1, i16** %argv.6.par
-; CHECK:         PartialAlias: [3 x i16]* %int_arr.10, i16* %_tmp1
+; CHECK:         PartialAlias (off 4): [3 x i16]* %int_arr.10, i16* %_tmp1
 ; CHECK:         NoAlias:      i16* %ls1.9.0, i16** %argv.6.par
 ; CHECK:         MayAlias:     [3 x i16]* %int_arr.10, i16* %ls1.9.0
 ; CHECK:         MayAlias:     i16* %_tmp1, i16* %ls1.9.0
@@ -150,7 +150,7 @@ if.end: ; preds = %f.exit
 ; CHECK:         MayAlias:     i16* %_tmp1, i16* %_tmp7
 ; CHECK:         NoAlias:      i16* %_tmp7, i16* %ls1.9.0
 ; CHECK:         NoAlias:      i16* %_tmp11, i16** %argv.6.par
-; CHECK:         PartialAlias: [3 x i16]* %int_arr.10, i16* %_tmp11
+; CHECK:         PartialAlias (off 2): [3 x i16]* %int_arr.10, i16* %_tmp11
 ; CHECK:         NoAlias:      i16* %_tmp1, i16* %_tmp11
 ; CHECK:         MayAlias:     i16* %_tmp11, i16* %ls1.9.0
 ; CHECK:         MayAlias:     i16* %_tmp11, i16* %_tmp7