Path: blob/main/contrib/llvm-project/llvm/lib/IR/Assumptions.cpp
35234 views
//===- Assumptions.cpp ------ Collection of helpers for assumptions -------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file implements helper functions for accessing assumption infomration9// inside of the "llvm.assume" metadata.10//11//===----------------------------------------------------------------------===//1213#include "llvm/IR/Assumptions.h"14#include "llvm/ADT/SetOperations.h"15#include "llvm/ADT/StringExtras.h"16#include "llvm/IR/Attributes.h"17#include "llvm/IR/Function.h"18#include "llvm/IR/InstrTypes.h"1920using namespace llvm;2122namespace {23bool hasAssumption(const Attribute &A,24const KnownAssumptionString &AssumptionStr) {25if (!A.isValid())26return false;27assert(A.isStringAttribute() && "Expected a string attribute!");2829SmallVector<StringRef, 8> Strings;30A.getValueAsString().split(Strings, ",");3132return llvm::is_contained(Strings, AssumptionStr);33}3435DenseSet<StringRef> getAssumptions(const Attribute &A) {36if (!A.isValid())37return DenseSet<StringRef>();38assert(A.isStringAttribute() && "Expected a string attribute!");3940DenseSet<StringRef> Assumptions;41SmallVector<StringRef, 8> Strings;42A.getValueAsString().split(Strings, ",");4344for (StringRef Str : Strings)45Assumptions.insert(Str);46return Assumptions;47}4849template <typename AttrSite>50bool addAssumptionsImpl(AttrSite &Site,51const DenseSet<StringRef> &Assumptions) {52if (Assumptions.empty())53return false;5455DenseSet<StringRef> CurAssumptions = getAssumptions(Site);5657if (!set_union(CurAssumptions, Assumptions))58return false;5960LLVMContext &Ctx = Site.getContext();61Site.addFnAttr(llvm::Attribute::get(62Ctx, llvm::AssumptionAttrKey,63llvm::join(CurAssumptions.begin(), CurAssumptions.end(), ",")));6465return true;66}67} // namespace6869bool llvm::hasAssumption(const Function &F,70const KnownAssumptionString &AssumptionStr) {71const Attribute &A = F.getFnAttribute(AssumptionAttrKey);72return ::hasAssumption(A, AssumptionStr);73}7475bool llvm::hasAssumption(const CallBase &CB,76const KnownAssumptionString &AssumptionStr) {77if (Function *F = CB.getCalledFunction())78if (hasAssumption(*F, AssumptionStr))79return true;8081const Attribute &A = CB.getFnAttr(AssumptionAttrKey);82return ::hasAssumption(A, AssumptionStr);83}8485DenseSet<StringRef> llvm::getAssumptions(const Function &F) {86const Attribute &A = F.getFnAttribute(AssumptionAttrKey);87return ::getAssumptions(A);88}8990DenseSet<StringRef> llvm::getAssumptions(const CallBase &CB) {91const Attribute &A = CB.getFnAttr(AssumptionAttrKey);92return ::getAssumptions(A);93}9495bool llvm::addAssumptions(Function &F, const DenseSet<StringRef> &Assumptions) {96return ::addAssumptionsImpl(F, Assumptions);97}9899bool llvm::addAssumptions(CallBase &CB,100const DenseSet<StringRef> &Assumptions) {101return ::addAssumptionsImpl(CB, Assumptions);102}103104StringSet<> llvm::KnownAssumptionStrings({105"omp_no_openmp", // OpenMP 5.1106"omp_no_openmp_routines", // OpenMP 5.1107"omp_no_parallelism", // OpenMP 5.1108"ompx_spmd_amenable", // OpenMPOpt extension109"ompx_no_call_asm", // OpenMPOpt extension110});111112113