blob: fc7626ff60645fc7d23d31b34855db8d4a3c9311 [file] [edit]
///////////////////////////////////////////////////////////////////////////////
// //
// 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)