1343171Sdim//===-- AMDGPUFixFunctionBitcasts.cpp - Fix function bitcasts -------------===//
2343171Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6343171Sdim//
7343171Sdim//===----------------------------------------------------------------------===//
8343171Sdim///
9343171Sdim/// \file
10343171Sdim/// Promote indirect (bitcast) calls to direct calls when they are statically
11343171Sdim/// known to be direct. Required when InstCombine is not run (e.g. at OptNone)
12343171Sdim/// because AMDGPU does not support indirect calls.
13343171Sdim///
14343171Sdim//===----------------------------------------------------------------------===//
15343171Sdim
16343171Sdim#include "AMDGPU.h"
17343171Sdim#include "llvm/IR/InstVisitor.h"
18343171Sdim#include "llvm/Transforms/Utils/CallPromotionUtils.h"
19343171Sdim
20343171Sdimusing namespace llvm;
21343171Sdim
22343171Sdim#define DEBUG_TYPE "amdgpu-fix-function-bitcasts"
23343171Sdim
24343171Sdimnamespace {
25343171Sdimclass AMDGPUFixFunctionBitcasts final
26343171Sdim    : public ModulePass,
27343171Sdim      public InstVisitor<AMDGPUFixFunctionBitcasts> {
28343171Sdim
29343171Sdim  bool runOnModule(Module &M) override;
30343171Sdim
31343171Sdim  bool Modified;
32343171Sdim
33343171Sdimpublic:
34343171Sdim  void visitCallSite(CallSite CS) {
35343171Sdim    if (CS.getCalledFunction())
36343171Sdim      return;
37343171Sdim    auto Callee = dyn_cast<Function>(CS.getCalledValue()->stripPointerCasts());
38343171Sdim    if (Callee && isLegalToPromote(CS, Callee)) {
39343171Sdim      promoteCall(CS, Callee);
40343171Sdim      Modified = true;
41343171Sdim    }
42343171Sdim  }
43343171Sdim
44343171Sdim  static char ID;
45343171Sdim  AMDGPUFixFunctionBitcasts() : ModulePass(ID) {}
46343171Sdim};
47343171Sdim} // End anonymous namespace
48343171Sdim
49343171Sdimchar AMDGPUFixFunctionBitcasts::ID = 0;
50343171Sdimchar &llvm::AMDGPUFixFunctionBitcastsID = AMDGPUFixFunctionBitcasts::ID;
51343171SdimINITIALIZE_PASS(AMDGPUFixFunctionBitcasts, DEBUG_TYPE,
52343171Sdim                "Fix function bitcasts for AMDGPU", false, false)
53343171Sdim
54343171SdimModulePass *llvm::createAMDGPUFixFunctionBitcastsPass() {
55343171Sdim  return new AMDGPUFixFunctionBitcasts();
56343171Sdim}
57343171Sdim
58343171Sdimbool AMDGPUFixFunctionBitcasts::runOnModule(Module &M) {
59343171Sdim  Modified = false;
60343171Sdim  visit(M);
61343171Sdim  return Modified;
62343171Sdim}
63