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