From: Alina Sbirlea Date: Thu, 12 Sep 2019 18:09:47 +0000 (+0000) Subject: [LICM/AST] Check if the AliasAny set is removed from the tracker. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=011a7d058b311165396ade1d0d6a2e8196aaac42;p=llvm [LICM/AST] Check if the AliasAny set is removed from the tracker. Summary: Resolves PR38513. Credit to @bjope for debugging this. Reviewers: hfinkel, uabelho, bjope Subscribers: sanjoy.google, bjope, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67417 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@371752 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/AliasSetTracker.cpp b/lib/Analysis/AliasSetTracker.cpp index a6e5b9fab55..79fbcd464c1 100644 --- a/lib/Analysis/AliasSetTracker.cpp +++ b/lib/Analysis/AliasSetTracker.cpp @@ -119,6 +119,12 @@ void AliasSetTracker::removeAliasSet(AliasSet *AS) { TotalMayAliasSetSize -= AS->size(); AliasSets.erase(AS); + // If we've removed the saturated alias set, set saturated marker back to + // nullptr and ensure this tracker is empty. + if (AS == AliasAnyAS) { + AliasAnyAS = nullptr; + assert(AliasSets.empty() && "Tracker not empty"); + } } void AliasSet::removeFromTracker(AliasSetTracker &AST) { @@ -690,8 +696,10 @@ void AliasSet::print(raw_ostream &OS) const { } void AliasSetTracker::print(raw_ostream &OS) const { - OS << "Alias Set Tracker: " << AliasSets.size() << " alias sets for " - << PointerMap.size() << " pointer values.\n"; + OS << "Alias Set Tracker: " << AliasSets.size(); + if (AliasAnyAS) + OS << " (Saturated)"; + OS << " alias sets for " << PointerMap.size() << " pointer values.\n"; for (const AliasSet &AS : *this) AS.print(OS); OS << "\n"; diff --git a/test/Transforms/LICM/pr38513.ll b/test/Transforms/LICM/pr38513.ll new file mode 100644 index 00000000000..ebc27510602 --- /dev/null +++ b/test/Transforms/LICM/pr38513.ll @@ -0,0 +1,27 @@ +; RUN: opt -enable-mssa-loop-dependency=false -disable-basicaa -alias-set-saturation-threshold=2 -licm -S < %s | FileCheck %s +; REQUIRES: asserts + +; CHECK-LABEL: @f1() +define void @f1() { + %lc1.10 = alloca [3 x i16] + br label %bb1 + +bb1: ; preds = %bb6, %0 + store i16 undef, i16* undef + br label %bb2 + +bb2: ; preds = %bb8, %bb1 + %_tmp18.fca.0.gep = getelementptr inbounds [3 x i16], [3 x i16]* %lc1.10, i32 0, i32 0 + %_tmp18.fca.0.load = load i16, i16* %_tmp18.fca.0.gep + %_tmp18.fca.1.gep = getelementptr inbounds [3 x i16], [3 x i16]* %lc1.10, i32 0, i32 1 + %_tmp18.fca.1.load = load i16, i16* %_tmp18.fca.1.gep + %_tmp18.fca.2.gep = getelementptr inbounds [3 x i16], [3 x i16]* %lc1.10, i32 0, i32 2 + %_tmp18.fca.2.load = load i16, i16* %_tmp18.fca.2.gep + br label %bb8 + +bb8: ; preds = %bb2 + br i1 undef, label %bb2, label %bb6 + +bb6: ; preds = %bb8 + br label %bb1 +}