16749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni/*
26749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * Copyright 2016, The Android Open Source Project
36749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni *
46749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * Licensed under the Apache License, Version 2.0 (the "License");
56749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * you may not use this file except in compliance with the License.
66749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * You may obtain a copy of the License at
76749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni *
86749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni *     http://www.apache.org/licenses/LICENSE-2.0
96749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni *
106749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * Unless required by applicable law or agreed to in writing, software
116749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * distributed under the License is distributed on an "AS IS" BASIS,
126749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * See the License for the specific language governing permissions and
146749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * limitations under the License.
156749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni */
166749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
176749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni#include "InlinePreparationPass.h"
186749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
196749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni#include "llvm/IR/Module.h"
206749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni#include "llvm/Pass.h"
216749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni#include "llvm/Support/Debug.h"
22b83f1f4d77c7624b9e8dc11beec8f796ff841918I-Jui (Ray) Sung#include "llvm/Support/raw_ostream.h"
236749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
24eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni#include "Context.h"
25c7b3a43821ccf0f2b13840246e1895744799cf6bYang Ni
266749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni#define DEBUG_TYPE "rs2spirv-inline"
276749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
286749f541c20e86f5deb6fd421ed5849ef43c275cYang Niusing namespace llvm;
296749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
306749f541c20e86f5deb6fd421ed5849ef43c275cYang Ninamespace rs2spirv {
316749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
326749f541c20e86f5deb6fd421ed5849ef43c275cYang Ninamespace {
336749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
346749f541c20e86f5deb6fd421ed5849ef43c275cYang Niclass InlinePreparationPass : public ModulePass {
356749f541c20e86f5deb6fd421ed5849ef43c275cYang Nipublic:
366749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni  static char ID;
37eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  explicit InlinePreparationPass() : ModulePass(ID) {}
386749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
396749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni  const char *getPassName() const override { return "InlinePreparationPass"; }
406749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
416749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni  bool runOnModule(Module &M) override {
426749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni    DEBUG(dbgs() << "InlinePreparationPass\n");
436749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
44eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni    rs2spirv::Context &Ctxt = rs2spirv::Context::getInstance();
456749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
466749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni    for (auto &F : M.functions()) {
47eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni      if (F.isDeclaration()) {
486749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni        continue;
49eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni      }
506749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
51eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni      if (Ctxt.isForEachKernel(F.getName())) {
526749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni        continue; // Skip kernels.
53eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni      }
546749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
556749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni      F.addFnAttr(Attribute::AlwaysInline);
566749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni      F.setLinkage(GlobalValue::InternalLinkage);
57eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
58eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni      DEBUG(dbgs() << "Marked as alwaysinline:\t" << F.getName() << '\n');
596749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni    }
606749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
61eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni    // Returns true, because this pass modifies the Module.
626749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni    return true;
636749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni  }
646749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni};
65eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
667974fc03e11f3a8dd40f794f3b33b4889483090cRahul Chaudhry} // namespace
676749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
686749f541c20e86f5deb6fd421ed5849ef43c275cYang Nichar InlinePreparationPass::ID = 0;
696749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
70eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang NiModulePass *createInlinePreparationPass() {
71eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  return new InlinePreparationPass();
726749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni}
736749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni
746749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni} // namespace rs2spirv
75