[Attributor] Deduce "noalias" attribute
Summary:
This patch adds very basic deduction for noalias.
Reviewers: jdoerfert, sstefan1
Reviewed By: jdoerfert
Tags: LLVM
Differential Revision: https://reviews.llvm.org/D66207
llvm-svn: 370295
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index 2d386ae..c882f8c 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -1559,6 +1559,12 @@
struct AANoAliasFloating final : AANoAliasImpl {
AANoAliasFloating(const IRPosition &IRP) : AANoAliasImpl(IRP) {}
+ /// See AbstractAttribute::initialize(...).
+ void initialize(Attributor &A) override {
+ // TODO: It isn't sound to initialize as the same with `AANoAliasImpl`
+ // because `noalias` may not be valid in the current position.
+ }
+
/// See AbstractAttribute::updateImpl(...).
ChangeStatus updateImpl(Attributor &A) override {
// TODO: Implement this.
@@ -1572,14 +1578,10 @@
};
/// NoAlias attribute for an argument.
-struct AANoAliasArgument final : AANoAliasImpl {
- AANoAliasArgument(const IRPosition &IRP) : AANoAliasImpl(IRP) {}
-
- /// See AbstractAttribute::updateImpl(...).
- ChangeStatus updateImpl(Attributor &A) override {
- // TODO: Implement this.
- return indicatePessimisticFixpoint();
- }
+struct AANoAliasArgument final
+ : AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl> {
+ AANoAliasArgument(const IRPosition &IRP)
+ : AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl>(IRP) {}
/// See AbstractAttribute::trackStatistics()
void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(noalias) }
@@ -1588,6 +1590,12 @@
struct AANoAliasCallSiteArgument final : AANoAliasImpl {
AANoAliasCallSiteArgument(const IRPosition &IRP) : AANoAliasImpl(IRP) {}
+ /// See AbstractAttribute::initialize(...).
+ void initialize(Attributor &A) override {
+ // TODO: It isn't sound to initialize as the same with `AANoAliasImpl`
+ // because `noalias` may not be valid in the current position.
+ }
+
/// See AbstractAttribute::updateImpl(...).
ChangeStatus updateImpl(Attributor &A) override {
// TODO: Implement this.
@@ -2814,6 +2822,9 @@
// Every argument with pointer type might be marked nonnull.
checkAndRegisterAA<AANonNullArgument>(ArgPos, *this, Whitelist);
+ // Every argument with pointer type might be marked noalias.
+ checkAndRegisterAA<AANoAliasArgument>(ArgPos, *this, Whitelist);
+
// Every argument with pointer type might be marked dereferenceable.
checkAndRegisterAA<AADereferenceableArgument>(ArgPos, *this, Whitelist);
@@ -2879,6 +2890,10 @@
checkAndRegisterAA<AANonNullCallSiteArgument>(CSArgPos, *this,
Whitelist);
+ // Call site argument attribute "no-alias".
+ checkAndRegisterAA<AANoAliasCallSiteArgument>(CSArgPos, *this,
+ Whitelist);
+
// Call site argument attribute "dereferenceable".
checkAndRegisterAA<AADereferenceableCallSiteArgument>(CSArgPos, *this,
Whitelist);