| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- ///////////////////////////////////////////////////////////////////////////////
- // //
- // DxilRemoveDiscards.cpp //
- // Copyright (C) Microsoft Corporation. All rights reserved. //
- // This file is distributed under the University of Illinois Open Source //
- // License. See LICENSE.TXT for details. //
- // //
- // Provides a pass to remove all instances of the discard instruction //
- // //
- ///////////////////////////////////////////////////////////////////////////////
- #include "dxc/HLSL/DxilGenerationPass.h"
- #include "dxc/HLSL/DxilOperations.h"
- #include "dxc/HLSL/DxilModule.h"
- #include "llvm/IR/Instructions.h"
- #include "llvm/IR/PassManager.h"
- using namespace llvm;
- using namespace hlsl;
- class DxilRemoveDiscards : public ModulePass {
- public:
- static char ID; // Pass identification, replacement for typeid
- explicit DxilRemoveDiscards() : ModulePass(ID) {}
- const char *getPassName() const override { return "DXIL Remove all discard instructions"; }
- bool runOnModule(Module &M) override;
- };
- bool DxilRemoveDiscards::runOnModule(Module &M)
- {
- // This pass removes all instances of the discard instruction within the shader.
- DxilModule &DM = M.GetOrCreateDxilModule();
- LLVMContext & Ctx = M.getContext();
- OP *HlslOP = DM.GetOP();
- Function * DiscardFunction = HlslOP->GetOpFunc(DXIL::OpCode::Discard, Type::getVoidTy(Ctx));
- auto DiscardFunctionUses = DiscardFunction->uses();
- bool Modified = false;
- for (auto FI = DiscardFunctionUses.begin(); FI != DiscardFunctionUses.end(); ) {
- auto & FunctionUse = *FI++;
- auto FunctionUser = FunctionUse.getUser();
- auto instruction = cast<Instruction>(FunctionUser);
- instruction->eraseFromParent();
- Modified = true;
- }
- return Modified;
- }
- char DxilRemoveDiscards::ID = 0;
- ModulePass *llvm::createDxilRemoveDiscardsPass() {
- return new DxilRemoveDiscards();
- }
- INITIALIZE_PASS(DxilRemoveDiscards, "hlsl-dxil-remove-discards", "HLSL DXIL Remove all discard instructions", false, false)
|