[llvm] 3ce61fb - [NFC] Move a recently added utility into a location to enable reuse
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 14 15:06:22 PDT 2021
Author: Philip Reames
Date: 2021-04-14T15:05:16-07:00
New Revision: 3ce61fb6d697d49db471c7077b88b3b9ec9dec66
URL: https://github.com/llvm/llvm-project/commit/3ce61fb6d697d49db471c7077b88b3b9ec9dec66
DIFF: https://github.com/llvm/llvm-project/commit/3ce61fb6d697d49db471c7077b88b3b9ec9dec66.diff
LOG: [NFC] Move a recently added utility into a location to enable reuse
About to refresh a patch that uses this in FunctionAtrrs, doing the move seperately to control build times.
Added:
Modified:
llvm/include/llvm/Transforms/Utils/Local.h
llvm/lib/Transforms/IPO/InferFunctionAttrs.cpp
llvm/lib/Transforms/Utils/Local.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/Utils/Local.h b/llvm/include/llvm/Transforms/Utils/Local.h
index f7efeeb56fd3..8ab066f0b6a3 100644
--- a/llvm/include/llvm/Transforms/Utils/Local.h
+++ b/llvm/include/llvm/Transforms/Utils/Local.h
@@ -488,6 +488,15 @@ bool canReplaceOperandWithVariable(const Instruction *I, unsigned OpIdx);
/// Invert the given true/false value, possibly reusing an existing copy.
Value *invertCondition(Value *Condition);
+
+//===----------------------------------------------------------------------===//
+// Assorted
+//
+
+/// If we can infer one attribute from another on the declaration of a
+/// function, explicitly materialize the maximal set in the IR.
+bool inferAttributesFromOthers(Function &F);
+
} // end namespace llvm
#endif // LLVM_TRANSFORMS_UTILS_LOCAL_H
diff --git a/llvm/lib/Transforms/IPO/InferFunctionAttrs.cpp b/llvm/lib/Transforms/IPO/InferFunctionAttrs.cpp
index 5c022f0df610..30402f109f30 100644
--- a/llvm/lib/Transforms/IPO/InferFunctionAttrs.cpp
+++ b/llvm/lib/Transforms/IPO/InferFunctionAttrs.cpp
@@ -15,52 +15,21 @@
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/BuildLibCalls.h"
+#include "llvm/Transforms/Utils/Local.h"
using namespace llvm;
#define DEBUG_TYPE "inferattrs"
-/// If we can infer one attribute from another on the declaration of a
-/// function, explicitly materialize the maximal set for readability in the IR.
-/// Doing this also allows our CGSCC inference to avoid needing to duplicate
-/// this logic on all calls to declarations (as declarations aren't explicitly
-/// visited by CGSCC passes in the new pass manager.)
-static bool inferAttributesFromOthers(Function &F) {
- // Note: We explicitly check for attributes rather than using cover functions
- // because some of the cover functions include the logic being implemented.
-
- bool Changed = false;
- // readnone + not convergent implies nosync
- if (!F.hasFnAttribute(Attribute::NoSync) &&
- F.doesNotAccessMemory() && !F.isConvergent()) {
- F.setNoSync();
- Changed = true;
- }
-
- // readonly implies nofree
- if (!F.hasFnAttribute(Attribute::NoFree) && F.onlyReadsMemory()) {
- F.setDoesNotFreeMemory();
- Changed = true;
- }
-
- // willreturn implies mustprogress
- if (!F.hasFnAttribute(Attribute::MustProgress) && F.willReturn()) {
- F.setMustProgress();
- Changed = true;
- }
-
- // TODO: There are a bunch of cases of restrictive memory effects we
- // can infer by inspecting arguments of argmemonly-ish functions.
-
- return Changed;
-}
-
static bool inferAllPrototypeAttributes(
Module &M, function_ref<TargetLibraryInfo &(Function &)> GetTLI) {
bool Changed = false;
for (Function &F : M.functions())
// We only infer things using the prototype and the name; we don't need
- // definitions.
+ // definitions. This ensures libfuncs are annotated and also allows our
+ // CGSCC inference to avoid needing to duplicate the inference from other
+ // attribute logic on all calls to declarations (as declarations aren't
+ // explicitly visited by CGSCC passes in the new pass manager.)
if (F.isDeclaration() && !F.hasOptNone()) {
Changed |= inferLibFuncAttributes(F, GetTLI(F));
Changed |= inferAttributesFromOthers(F);
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index e285f8aa7a20..89e62fb94ec1 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -3392,3 +3392,33 @@ Value *llvm::invertCondition(Value *Condition) {
Inverted->insertBefore(&*Parent->getFirstInsertionPt());
return Inverted;
}
+
+bool llvm::inferAttributesFromOthers(Function &F) {
+ // Note: We explicitly check for attributes rather than using cover functions
+ // because some of the cover functions include the logic being implemented.
+
+ bool Changed = false;
+ // readnone + not convergent implies nosync
+ if (!F.hasFnAttribute(Attribute::NoSync) &&
+ F.doesNotAccessMemory() && !F.isConvergent()) {
+ F.setNoSync();
+ Changed = true;
+ }
+
+ // readonly implies nofree
+ if (!F.hasFnAttribute(Attribute::NoFree) && F.onlyReadsMemory()) {
+ F.setDoesNotFreeMemory();
+ Changed = true;
+ }
+
+ // willreturn implies mustprogress
+ if (!F.hasFnAttribute(Attribute::MustProgress) && F.willReturn()) {
+ F.setMustProgress();
+ Changed = true;
+ }
+
+ // TODO: There are a bunch of cases of restrictive memory effects we
+ // can infer by inspecting arguments of argmemonly-ish functions.
+
+ return Changed;
+}
More information about the llvm-commits
mailing list