1b9c77542SJohannes Doerfert //===- Assumptions.cpp ------ Collection of helpers for assumptions -------===//
2b9c77542SJohannes Doerfert //
3b9c77542SJohannes Doerfert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b9c77542SJohannes Doerfert // See https://llvm.org/LICENSE.txt for license information.
5b9c77542SJohannes Doerfert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b9c77542SJohannes Doerfert //
7b9c77542SJohannes Doerfert //===----------------------------------------------------------------------===//
8b9c77542SJohannes Doerfert //
9b9c77542SJohannes Doerfert //===----------------------------------------------------------------------===//
10b9c77542SJohannes Doerfert 
11b9c77542SJohannes Doerfert #include "llvm/IR/Assumptions.h"
12b9c77542SJohannes Doerfert #include "llvm/IR/Attributes.h"
13b9c77542SJohannes Doerfert #include "llvm/IR/Function.h"
149e2fc0baSJoseph Huber #include "llvm/IR/InstrTypes.h"
15b9c77542SJohannes Doerfert 
16b9c77542SJohannes Doerfert using namespace llvm;
17b9c77542SJohannes Doerfert 
189e2fc0baSJoseph Huber namespace {
199e2fc0baSJoseph Huber bool hasAssumption(const Attribute &A,
20b9c77542SJohannes Doerfert                    const KnownAssumptionString &AssumptionStr) {
21b9c77542SJohannes Doerfert   if (!A.isValid())
22b9c77542SJohannes Doerfert     return false;
23b9c77542SJohannes Doerfert   assert(A.isStringAttribute() && "Expected a string attribute!");
24b9c77542SJohannes Doerfert 
25b9c77542SJohannes Doerfert   SmallVector<StringRef, 8> Strings;
26b9c77542SJohannes Doerfert   A.getValueAsString().split(Strings, ",");
27b9c77542SJohannes Doerfert 
28*81e9c906SKazu Hirata   return llvm::is_contained(Strings, AssumptionStr);
29b9c77542SJohannes Doerfert }
309e2fc0baSJoseph Huber } // namespace
319e2fc0baSJoseph Huber 
329e2fc0baSJoseph Huber bool llvm::hasAssumption(Function &F,
339e2fc0baSJoseph Huber                          const KnownAssumptionString &AssumptionStr) {
349e2fc0baSJoseph Huber   const Attribute &A = F.getFnAttribute(AssumptionAttrKey);
359e2fc0baSJoseph Huber   return ::hasAssumption(A, AssumptionStr);
369e2fc0baSJoseph Huber }
379e2fc0baSJoseph Huber 
389e2fc0baSJoseph Huber bool llvm::hasAssumption(CallBase &CB,
399e2fc0baSJoseph Huber                          const KnownAssumptionString &AssumptionStr) {
409e2fc0baSJoseph Huber   if (Function *F = CB.getCalledFunction())
419e2fc0baSJoseph Huber     if (hasAssumption(*F, AssumptionStr))
429e2fc0baSJoseph Huber       return true;
439e2fc0baSJoseph Huber 
449e2fc0baSJoseph Huber   const Attribute &A = CB.getFnAttr(AssumptionAttrKey);
459e2fc0baSJoseph Huber   return ::hasAssumption(A, AssumptionStr);
469e2fc0baSJoseph Huber }
47b9c77542SJohannes Doerfert 
48b9c77542SJohannes Doerfert StringSet<> llvm::KnownAssumptionStrings({
49b9c77542SJohannes Doerfert     "omp_no_openmp",          // OpenMP 5.1
50b9c77542SJohannes Doerfert     "omp_no_openmp_routines", // OpenMP 5.1
51b9c77542SJohannes Doerfert     "omp_no_parallelism",     // OpenMP 5.1
52514c033dSJohannes Doerfert     "ompx_spmd_amenable",     // OpenMPOpt extension
53b9c77542SJohannes Doerfert });
54