mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[Clang][Attr] Introduce the assume
function attribute
The `assume` attribute is a way to provide additional, arbitrary information to the optimizer. For now, assumptions are restricted to strings which will be accumulated for a function and emitted as comma separated string function attribute. The key of the LLVM-IR function attribute is `llvm.assume`. Similar to `llvm.assume` and `__builtin_assume`, the `assume` attribute provides a user defined assumption to the compiler. A follow up patch will introduce an LLVM-core API to query the assumptions attached to a function. We also expect to add more options, e.g., expression arguments, to the `assume` attribute later on. The `omp [begin] asssumes` pragma will leverage this attribute and expose the functionality in the absence of OpenMP. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D91979
This commit is contained in:
parent
e4d8c28959
commit
6230d2a2a4
50
include/llvm/IR/Assumptions.h
Normal file
50
include/llvm/IR/Assumptions.h
Normal file
@ -0,0 +1,50 @@
|
||||
//===--- Assumptions.h - Assumption handling and organization ---*- C++ -*-===//
|
||||
//
|
||||
// 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// String assumptions that are known to optimization passes should be placed in
|
||||
// the KnownAssumptionStrings set. This can be done in various ways, i.a.,
|
||||
// via a static KnownAssumptionString object.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_IR_ASSUMPTIONS_H
|
||||
#define LLVM_IR_ASSUMPTIONS_H
|
||||
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/StringSet.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class Function;
|
||||
|
||||
/// The key we use for assumption attributes.
|
||||
constexpr StringRef AssumptionAttrKey = "llvm.assume";
|
||||
|
||||
/// A set of known assumption strings that are accepted without warning and
|
||||
/// which can be recommended as typo correction.
|
||||
extern StringSet<> KnownAssumptionStrings;
|
||||
|
||||
/// Helper that allows to insert a new assumption string in the known assumption
|
||||
/// set by creating a (static) object.
|
||||
struct KnownAssumptionString {
|
||||
KnownAssumptionString(StringRef AssumptionStr)
|
||||
: AssumptionStr(AssumptionStr) {
|
||||
KnownAssumptionStrings.insert(AssumptionStr);
|
||||
}
|
||||
operator StringRef() const { return AssumptionStr; }
|
||||
|
||||
private:
|
||||
StringRef AssumptionStr;
|
||||
};
|
||||
|
||||
/// Return true if \p F has the assumption \p AssumptionStr attached.
|
||||
bool hasAssumption(Function &F, const KnownAssumptionString &AssumptionStr);
|
||||
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
36
lib/IR/Assumptions.cpp
Normal file
36
lib/IR/Assumptions.cpp
Normal file
@ -0,0 +1,36 @@
|
||||
//===- Assumptions.cpp ------ Collection of helpers for assumptions -------===//
|
||||
//
|
||||
// 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 "llvm/IR/Assumptions.h"
|
||||
#include "llvm/IR/Attributes.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
bool llvm::hasAssumption(Function &F,
|
||||
const KnownAssumptionString &AssumptionStr) {
|
||||
const Attribute &A = F.getFnAttribute(AssumptionAttrKey);
|
||||
if (!A.isValid())
|
||||
return false;
|
||||
assert(A.isStringAttribute() && "Expected a string attribute!");
|
||||
|
||||
SmallVector<StringRef, 8> Strings;
|
||||
A.getValueAsString().split(Strings, ",");
|
||||
|
||||
return llvm::any_of(Strings, [=](StringRef Assumption) {
|
||||
return Assumption == AssumptionStr;
|
||||
});
|
||||
}
|
||||
|
||||
StringSet<> llvm::KnownAssumptionStrings({
|
||||
"omp_no_openmp", // OpenMP 5.1
|
||||
"omp_no_openmp_routines", // OpenMP 5.1
|
||||
"omp_no_parallelism", // OpenMP 5.1
|
||||
});
|
@ -1,6 +1,7 @@
|
||||
add_llvm_component_library(LLVMCore
|
||||
AbstractCallSite.cpp
|
||||
AsmWriter.cpp
|
||||
Assumptions.cpp
|
||||
Attributes.cpp
|
||||
AutoUpgrade.cpp
|
||||
BasicBlock.cpp
|
||||
|
Loading…
x
Reference in New Issue
Block a user