|  | //===-- AMDGPUFixFunctionBitcasts.cpp - Fix function bitcasts -------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | /// | 
|  | /// \file | 
|  | /// Promote indirect (bitcast) calls to direct calls when they are statically | 
|  | /// known to be direct. Required when InstCombine is not run (e.g. at OptNone) | 
|  | /// because AMDGPU does not support indirect calls. | 
|  | /// | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "AMDGPU.h" | 
|  | #include "llvm/IR/InstVisitor.h" | 
|  | #include "llvm/Transforms/Utils/CallPromotionUtils.h" | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | #define DEBUG_TYPE "amdgpu-fix-function-bitcasts" | 
|  |  | 
|  | namespace { | 
|  | class AMDGPUFixFunctionBitcasts final | 
|  | : public ModulePass, | 
|  | public InstVisitor<AMDGPUFixFunctionBitcasts> { | 
|  |  | 
|  | bool runOnModule(Module &M) override; | 
|  |  | 
|  | bool Modified; | 
|  |  | 
|  | public: | 
|  | void visitCallSite(CallSite CS) { | 
|  | if (CS.getCalledFunction()) | 
|  | return; | 
|  | auto Callee = dyn_cast<Function>(CS.getCalledValue()->stripPointerCasts()); | 
|  | if (Callee && isLegalToPromote(CS, Callee)) { | 
|  | promoteCall(CS, Callee); | 
|  | Modified = true; | 
|  | } | 
|  | } | 
|  |  | 
|  | static char ID; | 
|  | AMDGPUFixFunctionBitcasts() : ModulePass(ID) {} | 
|  | }; | 
|  | } // End anonymous namespace | 
|  |  | 
|  | char AMDGPUFixFunctionBitcasts::ID = 0; | 
|  | char &llvm::AMDGPUFixFunctionBitcastsID = AMDGPUFixFunctionBitcasts::ID; | 
|  | INITIALIZE_PASS(AMDGPUFixFunctionBitcasts, DEBUG_TYPE, | 
|  | "Fix function bitcasts for AMDGPU", false, false) | 
|  |  | 
|  | ModulePass *llvm::createAMDGPUFixFunctionBitcastsPass() { | 
|  | return new AMDGPUFixFunctionBitcasts(); | 
|  | } | 
|  |  | 
|  | bool AMDGPUFixFunctionBitcasts::runOnModule(Module &M) { | 
|  | Modified = false; | 
|  | visit(M); | 
|  | return Modified; | 
|  | } |