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"
14*9e2fc0baSJoseph Huber #include "llvm/IR/InstrTypes.h"
15b9c77542SJohannes Doerfert 
16b9c77542SJohannes Doerfert using namespace llvm;
17b9c77542SJohannes Doerfert 
18*9e2fc0baSJoseph Huber namespace {
19*9e2fc0baSJoseph 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 
28b9c77542SJohannes Doerfert   return llvm::any_of(Strings, [=](StringRef Assumption) {
29b9c77542SJohannes Doerfert     return Assumption == AssumptionStr;
30b9c77542SJohannes Doerfert   });
31b9c77542SJohannes Doerfert }
32*9e2fc0baSJoseph Huber } // namespace
33*9e2fc0baSJoseph Huber 
34*9e2fc0baSJoseph Huber bool llvm::hasAssumption(Function &F,
35*9e2fc0baSJoseph Huber                          const KnownAssumptionString &AssumptionStr) {
36*9e2fc0baSJoseph Huber   const Attribute &A = F.getFnAttribute(AssumptionAttrKey);
37*9e2fc0baSJoseph Huber   return ::hasAssumption(A, AssumptionStr);
38*9e2fc0baSJoseph Huber }
39*9e2fc0baSJoseph Huber 
40*9e2fc0baSJoseph Huber bool llvm::hasAssumption(CallBase &CB,
41*9e2fc0baSJoseph Huber                          const KnownAssumptionString &AssumptionStr) {
42*9e2fc0baSJoseph Huber   if (Function *F = CB.getCalledFunction())
43*9e2fc0baSJoseph Huber     if (hasAssumption(*F, AssumptionStr))
44*9e2fc0baSJoseph Huber       return true;
45*9e2fc0baSJoseph Huber 
46*9e2fc0baSJoseph Huber   const Attribute &A = CB.getFnAttr(AssumptionAttrKey);
47*9e2fc0baSJoseph Huber   return ::hasAssumption(A, AssumptionStr);
48*9e2fc0baSJoseph Huber }
49b9c77542SJohannes Doerfert 
50b9c77542SJohannes Doerfert StringSet<> llvm::KnownAssumptionStrings({
51b9c77542SJohannes Doerfert     "omp_no_openmp",          // OpenMP 5.1
52b9c77542SJohannes Doerfert     "omp_no_openmp_routines", // OpenMP 5.1
53b9c77542SJohannes Doerfert     "omp_no_parallelism",     // OpenMP 5.1
54514c033dSJohannes Doerfert     "ompx_spmd_amenable",     // OpenMPOpt extension
55b9c77542SJohannes Doerfert });
56