blob: 2aff69ef4dcbd1ad39b2d0961a9372209f7a226b [file] [edit]
// Copyright 2022 The Clspv Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "llvm/ADT/UniqueVector.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
#ifndef _CLSPV_LIB_SHARE_MODULE_SCOPE_VARIABLES_PASS_H
#define _CLSPV_LIB_SHARE_MODULE_SCOPE_VARIABLES_PASS_H
namespace clspv {
struct ShareModuleScopeVariablesPass
: llvm::OptionalPassInfoMixin<ShareModuleScopeVariablesPass> {
llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &);
typedef llvm::DenseMap<llvm::Function *, llvm::UniqueVector<llvm::Function *>>
EntryPointMap;
private:
// Maps functions to entry points that can call them including themselves.
void MapEntryPoints(llvm::Module &M);
// Traces the callable functions from |function| and maps them to
// |entry_point|.
void TraceFunction(llvm::Function *function, llvm::Function *entry_point);
// Attempts to share module scope variables. Returns true if any variables are
// shared. Shares variables of the same type that are used by
// non-intersecting sets of kernels.
bool ShareModuleScopeVariables(llvm::Module &M);
// Collects the entry points that can reach |value| into |user_entry_points|.
void CollectUserEntryPoints(
llvm::Value *value,
llvm::UniqueVector<llvm::Function *> *user_entry_points);
// Returns true if there is an intersection between the |user_functions| and
// |other_entry_points|.
bool HasSharedEntryPoints(
const llvm::DenseSet<llvm::Function *> &user_functions,
const llvm::UniqueVector<llvm::Function *> &other_entry_points);
EntryPointMap function_to_entry_points_;
};
} // namespace clspv
#endif // _CLSPV_LIB_SHARE_MODULE_SCOPE_VARIABLES_PASS_H