LLVM  12.0.0git
AMDGPUFixFunctionBitcasts.cpp
Go to the documentation of this file.
1 //===-- AMDGPUFixFunctionBitcasts.cpp - Fix function bitcasts -------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 /// Promote indirect (bitcast) calls to direct calls when they are statically
11 /// known to be direct. Required when InstCombine is not run (e.g. at OptNone)
12 /// because AMDGPU does not support indirect calls.
13 ///
14 //===----------------------------------------------------------------------===//
15 
16 #include "AMDGPU.h"
17 #include "llvm/IR/InstVisitor.h"
18 #include "llvm/Pass.h"
20 
21 using namespace llvm;
22 
23 #define DEBUG_TYPE "amdgpu-fix-function-bitcasts"
24 
25 namespace {
26 class AMDGPUFixFunctionBitcasts final
27  : public ModulePass,
28  public InstVisitor<AMDGPUFixFunctionBitcasts> {
29 
30  bool runOnModule(Module &M) override;
31 
32  bool Modified;
33 
34 public:
35  void visitCallBase(CallBase &CB) {
36  if (CB.getCalledFunction())
37  return;
38  auto *Callee =
40  if (Callee && isLegalToPromote(CB, Callee)) {
41  promoteCall(CB, Callee);
42  Modified = true;
43  }
44  }
45 
46  static char ID;
47  AMDGPUFixFunctionBitcasts() : ModulePass(ID) {}
48 };
49 } // End anonymous namespace
50 
53 INITIALIZE_PASS(AMDGPUFixFunctionBitcasts, DEBUG_TYPE,
54  "Fix function bitcasts for AMDGPU", false, false)
55 
57  return new AMDGPUFixFunctionBitcasts();
58 }
59 
60 bool AMDGPUFixFunctionBitcasts::runOnModule(Module &M) {
61  Modified = false;
62  visit(M);
63  return Modified;
64 }
#define DEBUG_TYPE
LLVM_NODISCARD std::enable_if_t< !is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type > dyn_cast(const Y &Val)
Definition: Casting.h:334
Base class for instruction visitors.
Definition: InstVisitor.h:79
This class represents lattice values for constants.
Definition: AllocatorList.h:23
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:67
bool isLegalToPromote(const CallBase &CB, Function *Callee, const char **FailureReason=nullptr)
Return true if the given indirect call site can be made to call Callee.
CallBase & promoteCall(CallBase &CB, Function *Callee, CastInst **RetBitCast=nullptr)
Promote the given indirect call site to unconditionally call Callee.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1100
Value * getCalledOperand() const
Definition: InstrTypes.h:1307
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition: Value.cpp:593
ModulePass * createAMDGPUFixFunctionBitcastsPass()
amdgpu Simplify well known AMD library false FunctionCallee Callee
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation.
Definition: InstrTypes.h:1314
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
Definition: Pass.h:224
INITIALIZE_PASS(AMDGPUFixFunctionBitcasts, DEBUG_TYPE, "Fix function bitcasts for AMDGPU", false, false) ModulePass *llvm
char & AMDGPUFixFunctionBitcastsID