1212#include " llvm/IR/IRBuilder.h"
1313#include " llvm/IR/InstIterator.h"
1414#include " llvm/IR/Instruction.h"
15- #include " llvm/IR/Module.h"
1615#include " llvm/Pass.h"
1716#include " llvm/Transforms/Utils/BasicBlockUtils.h"
1817#include < functional>
2120
2221using namespace llvm ;
2322
24- static void removeDeadIntrinsics (Function &F,
25- SmallVectorImpl<Function *> &ToRemove) {
26- if (F.isIntrinsic () && F.use_empty ())
27- ToRemove.push_back (&F);
28- }
29-
3023static void fixI8TruncUseChain (Instruction &I,
3124 SmallVectorImpl<Instruction *> &ToRemove,
3225 DenseMap<Value *, Value *> &ReplacedValues) {
@@ -153,26 +146,11 @@ class DXILLegalizationPipeline {
153146public:
154147 DXILLegalizationPipeline () { initializeLegalizationPipeline (); }
155148
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) {
149+ bool runLegalizationPipeline (Function &F) {
172150 SmallVector<Instruction *> ToRemove;
173151 DenseMap<Value *, Value *> ReplacedValues;
174152 for (auto &I : instructions (F)) {
175- for (auto &LegalizationFn : FunctionLegalizationPipeline )
153+ for (auto &LegalizationFn : LegalizationPipeline )
176154 LegalizationFn (I, ToRemove, ReplacedValues);
177155 }
178156
@@ -186,40 +164,37 @@ class DXILLegalizationPipeline {
186164 SmallVector<
187165 std::function<void (Instruction &, SmallVectorImpl<Instruction *> &,
188166 DenseMap<Value *, Value *> &)>>
189- FunctionLegalizationPipeline;
190- SmallVector<std::function<void (Function &, SmallVectorImpl<Function *> &)>>
191- ModuleLegalizationPipeline;
167+ LegalizationPipeline;
192168
193169 void initializeLegalizationPipeline () {
194- FunctionLegalizationPipeline.push_back (fixI8TruncUseChain);
195- FunctionLegalizationPipeline.push_back (
196- downcastI64toI32InsertExtractElements);
197- ModuleLegalizationPipeline.push_back (removeDeadIntrinsics);
170+ LegalizationPipeline.push_back (fixI8TruncUseChain);
171+ LegalizationPipeline.push_back (downcastI64toI32InsertExtractElements);
198172 }
199173};
200174
201- class DXILLegalizeLegacy : public ModulePass {
175+ class DXILLegalizeLegacy : public FunctionPass {
202176
203177public:
204- bool runOnModule (Module &M ) override ;
205- DXILLegalizeLegacy () : ModulePass (ID) {}
178+ bool runOnFunction (Function &F ) override ;
179+ DXILLegalizeLegacy () : FunctionPass (ID) {}
206180
207181 static char ID; // Pass identification.
208182};
209183} // namespace
210184
211- PreservedAnalyses DXILLegalizePass::run (Module &M, ModuleAnalysisManager &MAM) {
185+ PreservedAnalyses DXILLegalizePass::run (Function &F,
186+ FunctionAnalysisManager &FAM) {
212187 DXILLegalizationPipeline DXLegalize;
213- bool MadeChanges = DXLegalize.runLegalizationPipeline (M );
188+ bool MadeChanges = DXLegalize.runLegalizationPipeline (F );
214189 if (!MadeChanges)
215190 return PreservedAnalyses::all ();
216191 PreservedAnalyses PA;
217192 return PA;
218193}
219194
220- bool DXILLegalizeLegacy::runOnModule (Module &M ) {
195+ bool DXILLegalizeLegacy::runOnFunction (Function &F ) {
221196 DXILLegalizationPipeline DXLegalize;
222- return DXLegalize.runLegalizationPipeline (M );
197+ return DXLegalize.runLegalizationPipeline (F );
223198}
224199
225200char DXILLegalizeLegacy::ID = 0 ;
@@ -229,6 +204,6 @@ INITIALIZE_PASS_BEGIN(DXILLegalizeLegacy, DEBUG_TYPE, "DXIL Legalizer", false,
229204INITIALIZE_PASS_END(DXILLegalizeLegacy, DEBUG_TYPE, " DXIL Legalizer" , false ,
230205 false )
231206
232- ModulePass *llvm::createDXILLegalizeLegacyPass() {
207+ FunctionPass *llvm::createDXILLegalizeLegacyPass() {
233208 return new DXILLegalizeLegacy ();
234209}
0 commit comments