This revision adds a new `AliasAnalysis` class that represents the main alias analysis interface in MLIR. The purpose of this class is not to hold the aliasing logic itself, but to provide an interface into various different alias analysis implementations. As it evolves this should allow for users to plug in specialized alias analysis implementations for their own needs, and have them immediately usable by other analyses and transformations. This revision also adds an initial simple generic alias, LocalAliasAnalysis, that provides support for performing stateless local alias queries between values. This class is similar in scope to LLVM's BasicAA. Differential Revision: https://reviews.llvm.org/D92343
48 lines
1.7 KiB
C++
48 lines
1.7 KiB
C++
//===- AliasAnalysis.cpp - Alias Analysis for MLIR ------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/Analysis/AliasAnalysis.h"
|
|
#include "mlir/Analysis/AliasAnalysis/LocalAliasAnalysis.h"
|
|
|
|
using namespace mlir;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// AliasResult
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// Merge this alias result with `other` and return a new result that
|
|
/// represents the conservative merge of both results.
|
|
AliasResult AliasResult::merge(AliasResult other) const {
|
|
if (kind == other.kind)
|
|
return *this;
|
|
// A mix of PartialAlias and MustAlias is PartialAlias.
|
|
if ((isPartial() && other.isMust()) || (other.isPartial() && isMust()))
|
|
return PartialAlias;
|
|
// Otherwise, don't assume anything.
|
|
return MayAlias;
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// AliasAnalysis
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
AliasAnalysis::AliasAnalysis(Operation *op) {
|
|
addAnalysisImplementation(LocalAliasAnalysis());
|
|
}
|
|
|
|
/// Given the two values, return their aliasing behavior.
|
|
AliasResult AliasAnalysis::alias(Value lhs, Value rhs) {
|
|
// Check each of the alias analysis implemenations for an alias result.
|
|
for (const std::unique_ptr<Concept> &aliasImpl : aliasImpls) {
|
|
AliasResult result = aliasImpl->alias(lhs, rhs);
|
|
if (!result.isMay())
|
|
return result;
|
|
}
|
|
return AliasResult::MayAlias;
|
|
}
|