1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
/*========================== begin_copyright_notice ============================
Copyright (C) 2019-2021 Intel Corporation
SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
//===----------------------------------------------------------------------===//
///
/// Replace specified raytracing intrinsics with implicit args.
///
//===----------------------------------------------------------------------===//
#include "IGC/common/StringMacros.hpp"
#include "RTBuilder.h"
#include "common/LLVMUtils.h"
#include "Compiler/IGCPassSupport.h"
#include "Compiler/CodeGenPublic.h"
#include "AdaptorCommon/ImplicitArgs.hpp"
#include "common/LLVMWarningsPush.hpp"
#include "llvm/IR/InstVisitor.h"
#include <llvm/IR/Function.h>
#include "common/LLVMWarningsPop.hpp"
using namespace IGC;
using namespace llvm;
//////////////////////////////////////////////////////////////////////////
//
// Now that we have implicit args, replace the intrinsics
class RayTracingIntrinsicResolution : public FunctionPass, public InstVisitor<RayTracingIntrinsicResolution>
{
public:
RayTracingIntrinsicResolution();
bool runOnFunction(Function &F) override;
StringRef getPassName() const override
{
return "RayTracingIntrinsicResolution";
}
virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const override
{
AU.addRequired<MetaDataUtilsWrapper>();
AU.addRequired<CodeGenContextWrapper>();
}
void visitCallInst(CallInst &CI);
static char ID;
private:
Argument* getImplicitArg(Function *F, ImplicitArg::ArgType argType);
private:
ImplicitArgs m_implicitArgs;
bool Changed;
CodeGenContext* m_CGCtx = nullptr;
};
#define PASS_FLAG "raytracing-intrinsic-resolution"
#define PASS_DESCRIPTION "replace intrinsics with implicit args"
#define PASS_CFG_ONLY false
#define PASS_ANALYSIS false
IGC_INITIALIZE_PASS_BEGIN(RayTracingIntrinsicResolution, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
IGC_INITIALIZE_PASS_DEPENDENCY(MetaDataUtilsWrapper)
IGC_INITIALIZE_PASS_END(RayTracingIntrinsicResolution, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
Argument* RayTracingIntrinsicResolution::getImplicitArg(
Function *F, ImplicitArg::ArgType argType)
{
return m_implicitArgs.getImplicitArg(*F, argType);
}
RayTracingIntrinsicResolution::RayTracingIntrinsicResolution() : FunctionPass(ID) {
initializeRayTracingIntrinsicResolutionPass(*PassRegistry::getPassRegistry());
}
char RayTracingIntrinsicResolution::ID = 0;
void RayTracingIntrinsicResolution::visitCallInst(CallInst &CI)
{
Value *Arg = nullptr;
Function *F = CI.getFunction();
if (auto *GII = dyn_cast<GenIntrinsicInst>(&CI))
{
switch (GII->getIntrinsicID())
{
case GenISAIntrinsic::GenISA_GlobalBufferPointer:
Arg = getImplicitArg(F, ImplicitArg::RT_GLOBAL_BUFFER_POINTER);
break;
case GenISAIntrinsic::GenISA_LocalBufferPointer:
Arg = getImplicitArg(F, ImplicitArg::RT_LOCAL_BUFFER_POINTER);
break;
case GenISAIntrinsic::GenISA_AsyncStackID:
Arg = getImplicitArg(F, ImplicitArg::RT_STACK_ID);
break;
case GenISAIntrinsic::GenISA_InlinedData:
{
// the global and local pointer are both passed in so the argument
// is a vector of two pointers.
Arg = getImplicitArg(F, ImplicitArg::RT_INLINED_DATA);
IRBuilder<> IRB(&CI);
Arg = IRB.CreateExtractElement(Arg, CI.getOperand(0));
break;
}
default:
break;
}
}
if (!Arg)
return;
IRBuilder<> IRB(&CI);
Arg = IRB.CreateBitCast(Arg, CI.getType());
CI.replaceAllUsesWith(Arg);
CI.eraseFromParent();
Changed = true;
}
bool RayTracingIntrinsicResolution::runOnFunction(Function &F)
{
auto *pMdUtils = getAnalysis<MetaDataUtilsWrapper>().getMetaDataUtils();
m_CGCtx = getAnalysis<CodeGenContextWrapper>().getCodeGenContext();
if (pMdUtils->findFunctionsInfoItem(&F) == pMdUtils->end_FunctionsInfo())
return false;
Changed = false;
m_implicitArgs = ImplicitArgs(
F,
pMdUtils);
visit(F);
return Changed;
}
namespace IGC
{
Pass* createRayTracingIntrinsicResolutionPass()
{
return new RayTracingIntrinsicResolution();
}
}
|