[AST] Don't merge memory locations in AliasSetTracker (#65731)
This changes the AliasSetTracker to track memory locations instead of
pointers in its alias sets. The motivation for this is outlined in an RFC
posted on LLVM discourse:
https://discourse.llvm.org/t/rfc-dont-merge-memory-locations-in-aliassettracker/73336
In the data structures of the AST implementation, I made the choice to
replace the linked list of `PointerRec` entries (that had to go anyway)
with a simple flat vector of `MemoryLocation` objects, but for the
`AliasSet` objects referenced from a lookup table, I retained the
mechanism of a linked list, reference counting, forwarding, etc. The
data structures could be revised in a follow-up change.
GitOrigin-RevId: 656bf13004d62b8f8360d8d496bb1e6e08407c22
diff --git a/lib/Analysis/ScopBuilder.cpp b/lib/Analysis/ScopBuilder.cpp
index 0af0f69..c62cb2a 100644
--- a/lib/Analysis/ScopBuilder.cpp
+++ b/lib/Analysis/ScopBuilder.cpp
@@ -3255,8 +3255,8 @@
if (AS.isMustAlias() || AS.isForwardingAliasSet())
continue;
AliasGroupTy AG;
- for (auto &PR : AS)
- AG.push_back(PtrToAcc[PR.getValue()]);
+ for (const Value *Ptr : AS.getPointers())
+ AG.push_back(PtrToAcc[const_cast<Value *>(Ptr)]);
if (AG.size() < 2)
continue;
AliasGroups.push_back(std::move(AG));
diff --git a/lib/Analysis/ScopDetection.cpp b/lib/Analysis/ScopDetection.cpp
index db1f844..938d3f1 100644
--- a/lib/Analysis/ScopDetection.cpp
+++ b/lib/Analysis/ScopDetection.cpp
@@ -1149,6 +1149,8 @@
// sure the base pointer is not an instruction defined inside the scop.
// However, we can ignore loads that will be hoisted.
+ auto ASPointers = AS.getPointers();
+
InvariantLoadsSetTy VariantLS, InvariantLS;
// In order to detect loads which are dependent on other invariant loads
// as invariant, we use fixed-point iteration method here i.e we iterate
@@ -1158,8 +1160,8 @@
const unsigned int VariantSize = VariantLS.size(),
InvariantSize = InvariantLS.size();
- for (const auto &Ptr : AS) {
- Instruction *Inst = dyn_cast<Instruction>(Ptr.getValue());
+ for (const Value *Ptr : ASPointers) {
+ Instruction *Inst = dyn_cast<Instruction>(const_cast<Value *>(Ptr));
if (Inst && Context.CurRegion.contains(Inst)) {
auto *Load = dyn_cast<LoadInst>(Inst);
if (Load && InvariantLS.count(Load))
diff --git a/lib/Analysis/ScopDetectionDiagnostic.cpp b/lib/Analysis/ScopDetectionDiagnostic.cpp
index 0bac2cf..364e21a 100644
--- a/lib/Analysis/ScopDetectionDiagnostic.cpp
+++ b/lib/Analysis/ScopDetectionDiagnostic.cpp
@@ -638,8 +638,7 @@
ReportAlias::ReportAlias(Instruction *Inst, AliasSet &AS)
: RejectReason(RejectReasonKind::Alias), Inst(Inst) {
- for (const auto &I : AS)
- Pointers.push_back(I.getValue());
+ append_range(Pointers, AS.getPointers());
}
std::string ReportAlias::formatInvalidAlias(std::string Prefix,