1 /*========================== begin_copyright_notice ============================
2
3 Copyright (C) 2017-2021 Intel Corporation
4
5 SPDX-License-Identifier: MIT
6
7 ============================= end_copyright_notice ===========================*/
8
9 #include "Compiler/Optimizer/OpenCLPasses/WGFuncs/WGFuncResolution.hpp"
10 #include "Compiler/IGCPassSupport.h"
11
12 #include "common/LLVMWarningsPush.hpp"
13 #include <llvm/IR/Module.h>
14 #include "common/LLVMWarningsPop.hpp"
15 #include "GenISAIntrinsics/GenIntrinsics.h"
16
17 using namespace llvm;
18 using namespace IGC;
19
20 // Register pass to igc-opt
21 #define PASS_FLAG "igc-wg-resolution"
22 #define PASS_DESCRIPTION "Resolve WG built-in"
23 #define PASS_CFG_ONLY false
24 #define PASS_ANALYSIS false
25 IGC_INITIALIZE_PASS_BEGIN(WGFuncResolution, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
26 IGC_INITIALIZE_PASS_END(WGFuncResolution, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
27
28 char WGFuncResolution::ID = 0;
29
WGFuncResolution()30 WGFuncResolution::WGFuncResolution() : ModulePass(ID)
31 {
32 initializeWGFuncResolutionPass(*PassRegistry::getPassRegistry());
33 }
34
runOnModule(Module & M)35 bool WGFuncResolution::runOnModule(Module& M)
36 {
37 m_changed = false;
38 m_pModule = &M;
39
40 visit(M);
41
42 return m_changed;
43 }
44
visitCallInst(CallInst & callInst)45 void WGFuncResolution::visitCallInst(CallInst& callInst)
46 {
47 Function* pCalledFunc = callInst.getCalledFunction();
48 if (!pCalledFunc)
49 {
50 // Indirect call
51 return;
52 }
53 StringRef funcName = pCalledFunc->getName();
54 if (funcName.startswith("__builtin_IB_work_group_any"))
55 {
56 SmallVector<Value*, 1> args;
57
58 args.push_back(callInst.getOperand(0));
59
60 Function* isaIntrinFunc = GenISAIntrinsic::getDeclaration(m_pModule, GenISAIntrinsic::GenISA_WorkGroupAny);
61 CallInst* isaIntrinCall = CallInst::Create(isaIntrinFunc, args, callInst.getName(), &callInst);
62
63 isaIntrinCall->setDebugLoc(callInst.getDebugLoc());
64
65 callInst.replaceAllUsesWith(isaIntrinCall);
66 callInst.eraseFromParent();
67 m_changed = true;
68 }
69 }
70