blob: f3e237cc74d14dde124955cd1a99ecf46fb5abd6 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// //
// HLDeadFunctionElimination.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. //
// //
///////////////////////////////////////////////////////////////////////////////
#include "dxc/DXIL/DxilUtil.h"
#include "dxc/HLSL/DxilGenerationPass.h"
#include "dxc/HLSL/HLModule.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
using namespace llvm;
using namespace hlsl;
namespace {
class HLDeadFunctionElimination : public ModulePass {
public:
static char ID; // Pass identification, replacement for typeid
explicit HLDeadFunctionElimination() : ModulePass(ID) {}
StringRef getPassName() const override {
return "Remove all unused function except entry from HLModule";
}
bool runOnModule(Module &M) override {
if (M.HasHLModule()) {
HLModule &HLM = M.GetHLModule();
bool IsLib = HLM.GetShaderModel()->IsLib();
// Remove unused functions except entry and patch constant func.
// For library profile, only remove unused external functions.
Function *EntryFunc = HLM.GetEntryFunction();
Function *PatchConstantFunc = HLM.GetPatchConstantFunction();
bool bChanged = false;
while (dxilutil::RemoveUnusedFunctions(M, EntryFunc, PatchConstantFunc,
IsLib))
bChanged = true;
return bChanged;
}
return false;
}
};
} // namespace
char HLDeadFunctionElimination::ID = 0;
ModulePass *llvm::createHLDeadFunctionEliminationPass() {
return new HLDeadFunctionElimination();
}
INITIALIZE_PASS(HLDeadFunctionElimination, "hl-dfe",
"Remove all unused function except entry from HLModule", false,
false)