1212#include " llvm/IR/IRBuilder.h"
1313#include " llvm/IR/InstIterator.h"
1414#include " llvm/IR/Instruction.h"
15+ #include " llvm/IR/Module.h"
1516#include " llvm/Pass.h"
1617#include " llvm/Transforms/Utils/BasicBlockUtils.h"
1718#include < functional>
2021
2122using namespace llvm ;
2223
24+ static void removeDeadIntrinsics (Function &F,
25+ SmallVectorImpl<Function *> &ToRemove) {
26+ if (F.isIntrinsic () && F.use_empty ())
27+ ToRemove.push_back (&F);
28+ }
29+
2330static void fixI8TruncUseChain (Instruction &I,
2431 SmallVectorImpl<Instruction *> &ToRemove,
2532 DenseMap<Value *, Value *> &ReplacedValues) {
@@ -146,11 +153,26 @@ class DXILLegalizationPipeline {
146153public:
147154 DXILLegalizationPipeline () { initializeLegalizationPipeline (); }
148155
149- bool runLegalizationPipeline (Function &F) {
156+ bool runLegalizationPipeline (Module &M) {
157+ bool Changes = false ;
158+ SmallVector<Function *> ToRemove;
159+ for (auto &F : make_early_inc_range (M.functions ())) {
160+ Changes |= runFunctionLegalizationPipeline (F);
161+ for (auto &LegalizationFn : ModuleLegalizationPipeline)
162+ LegalizationFn (F, ToRemove);
163+ }
164+
165+ for (Function *F : ToRemove)
166+ F->eraseFromParent ();
167+
168+ return Changes && !ToRemove.empty ();
169+ }
170+
171+ bool runFunctionLegalizationPipeline (Function &F) {
150172 SmallVector<Instruction *> ToRemove;
151173 DenseMap<Value *, Value *> ReplacedValues;
152174 for (auto &I : instructions (F)) {
153- for (auto &LegalizationFn : LegalizationPipeline )
175+ for (auto &LegalizationFn : FunctionLegalizationPipeline )
154176 LegalizationFn (I, ToRemove, ReplacedValues);
155177 }
156178
@@ -164,37 +186,40 @@ class DXILLegalizationPipeline {
164186 SmallVector<
165187 std::function<void (Instruction &, SmallVectorImpl<Instruction *> &,
166188 DenseMap<Value *, Value *> &)>>
167- LegalizationPipeline;
189+ FunctionLegalizationPipeline;
190+ SmallVector<std::function<void (Function &, SmallVectorImpl<Function *> &)>>
191+ ModuleLegalizationPipeline;
168192
169193 void initializeLegalizationPipeline () {
170- LegalizationPipeline.push_back (fixI8TruncUseChain);
171- LegalizationPipeline.push_back (downcastI64toI32InsertExtractElements);
194+ FunctionLegalizationPipeline.push_back (fixI8TruncUseChain);
195+ FunctionLegalizationPipeline.push_back (
196+ downcastI64toI32InsertExtractElements);
197+ ModuleLegalizationPipeline.push_back (removeDeadIntrinsics);
172198 }
173199};
174200
175- class DXILLegalizeLegacy : public FunctionPass {
201+ class DXILLegalizeLegacy : public ModulePass {
176202
177203public:
178- bool runOnFunction (Function &F ) override ;
179- DXILLegalizeLegacy () : FunctionPass (ID) {}
204+ bool runOnModule (Module &M ) override ;
205+ DXILLegalizeLegacy () : ModulePass (ID) {}
180206
181207 static char ID; // Pass identification.
182208};
183209} // namespace
184210
185- PreservedAnalyses DXILLegalizePass::run (Function &F,
186- FunctionAnalysisManager &FAM) {
211+ PreservedAnalyses DXILLegalizePass::run (Module &M, ModuleAnalysisManager &MAM) {
187212 DXILLegalizationPipeline DXLegalize;
188- bool MadeChanges = DXLegalize.runLegalizationPipeline (F );
213+ bool MadeChanges = DXLegalize.runLegalizationPipeline (M );
189214 if (!MadeChanges)
190215 return PreservedAnalyses::all ();
191216 PreservedAnalyses PA;
192217 return PA;
193218}
194219
195- bool DXILLegalizeLegacy::runOnFunction (Function &F ) {
220+ bool DXILLegalizeLegacy::runOnModule (Module &M ) {
196221 DXILLegalizationPipeline DXLegalize;
197- return DXLegalize.runLegalizationPipeline (F );
222+ return DXLegalize.runLegalizationPipeline (M );
198223}
199224
200225char DXILLegalizeLegacy::ID = 0 ;
@@ -204,6 +229,6 @@ INITIALIZE_PASS_BEGIN(DXILLegalizeLegacy, DEBUG_TYPE, "DXIL Legalizer", false,
204229INITIALIZE_PASS_END(DXILLegalizeLegacy, DEBUG_TYPE, " DXIL Legalizer" , false ,
205230 false )
206231
207- FunctionPass *llvm::createDXILLegalizeLegacyPass() {
232+ ModulePass *llvm::createDXILLegalizeLegacyPass() {
208233 return new DXILLegalizeLegacy ();
209234}
0 commit comments