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
|
/*========================== begin_copyright_notice ============================
Copyright (C) 2019-2021 Intel Corporation
SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
//===----------------------------------------------------------------------===//
///
/// Pass inserting a message to retire the stackID at the end of all raygen
/// shaders. This needs to be done before creating the continuation shaders
///
//===----------------------------------------------------------------------===//
#include "RayTracingInterface.h"
#include "RTBuilder.h"
#include "common/LLVMUtils.h"
#include "Compiler/IGCPassSupport.h"
using namespace IGC;
using namespace llvm;
class RetireStackIDPass : public FunctionPass
{
public:
RetireStackIDPass() : FunctionPass(ID) {}
bool runOnFunction(Function &F) override;
llvm::StringRef getPassName() const override
{
return "RetireStackIDPass";
}
virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const override
{
AU.addRequired<CodeGenContextWrapper>();
}
static char ID;
};
char RetireStackIDPass::ID = 0;
bool RetireStackIDPass::runOnFunction(Function &F)
{
auto* pCtx = getAnalysis<CodeGenContextWrapper>().getCodeGenContext();
ModuleMetaData* modMD = pCtx->getModuleMetaData();
auto functionMD = modMD->FuncMD.find(&F);
if(functionMD == modMD->FuncMD.end())
{
return false;
}
// Only retire stack IDs when exiting raygen shaders
if(functionMD->second.functionType != FunctionTypeMD::KernelFunction)
{
return false;
}
for (auto &BB : F)
{
ReturnInst *RI = dyn_cast<ReturnInst>(BB.getTerminator());
if (!RI)
continue;
RTBuilder builder(RI, *pCtx);
builder.CreateStackIDRelease();
}
return true;
}
namespace IGC
{
Pass* CreateStackIDRetirement()
{
return new RetireStackIDPass();
}
}
|