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