12
12
#include " llvm/IR/IRBuilder.h"
13
13
#include " llvm/IR/InstIterator.h"
14
14
#include " llvm/IR/Instruction.h"
15
+ #include " llvm/IR/Module.h"
15
16
#include " llvm/Pass.h"
16
17
#include " llvm/Transforms/Utils/BasicBlockUtils.h"
17
18
#include < functional>
20
21
21
22
using namespace llvm ;
22
23
24
+ static void removeDeadIntrinsics (Function &F,
25
+ SmallVectorImpl<Function *> &ToRemove) {
26
+ if (F.isIntrinsic () && F.use_empty ())
27
+ ToRemove.push_back (&F);
28
+ }
29
+
23
30
static void fixI8TruncUseChain (Instruction &I,
24
31
SmallVectorImpl<Instruction *> &ToRemove,
25
32
DenseMap<Value *, Value *> &ReplacedValues) {
@@ -146,11 +153,26 @@ class DXILLegalizationPipeline {
146
153
public:
147
154
DXILLegalizationPipeline () { initializeLegalizationPipeline (); }
148
155
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) {
150
172
SmallVector<Instruction *> ToRemove;
151
173
DenseMap<Value *, Value *> ReplacedValues;
152
174
for (auto &I : instructions (F)) {
153
- for (auto &LegalizationFn : LegalizationPipeline )
175
+ for (auto &LegalizationFn : FunctionLegalizationPipeline )
154
176
LegalizationFn (I, ToRemove, ReplacedValues);
155
177
}
156
178
@@ -164,37 +186,40 @@ class DXILLegalizationPipeline {
164
186
SmallVector<
165
187
std::function<void (Instruction &, SmallVectorImpl<Instruction *> &,
166
188
DenseMap<Value *, Value *> &)>>
167
- LegalizationPipeline;
189
+ FunctionLegalizationPipeline;
190
+ SmallVector<std::function<void (Function &, SmallVectorImpl<Function *> &)>>
191
+ ModuleLegalizationPipeline;
168
192
169
193
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);
172
198
}
173
199
};
174
200
175
- class DXILLegalizeLegacy : public FunctionPass {
201
+ class DXILLegalizeLegacy : public ModulePass {
176
202
177
203
public:
178
- bool runOnFunction (Function &F ) override ;
179
- DXILLegalizeLegacy () : FunctionPass (ID) {}
204
+ bool runOnModule (Module &M ) override ;
205
+ DXILLegalizeLegacy () : ModulePass (ID) {}
180
206
181
207
static char ID; // Pass identification.
182
208
};
183
209
} // namespace
184
210
185
- PreservedAnalyses DXILLegalizePass::run (Function &F,
186
- FunctionAnalysisManager &FAM) {
211
+ PreservedAnalyses DXILLegalizePass::run (Module &M, ModuleAnalysisManager &MAM) {
187
212
DXILLegalizationPipeline DXLegalize;
188
- bool MadeChanges = DXLegalize.runLegalizationPipeline (F );
213
+ bool MadeChanges = DXLegalize.runLegalizationPipeline (M );
189
214
if (!MadeChanges)
190
215
return PreservedAnalyses::all ();
191
216
PreservedAnalyses PA;
192
217
return PA;
193
218
}
194
219
195
- bool DXILLegalizeLegacy::runOnFunction (Function &F ) {
220
+ bool DXILLegalizeLegacy::runOnModule (Module &M ) {
196
221
DXILLegalizationPipeline DXLegalize;
197
- return DXLegalize.runLegalizationPipeline (F );
222
+ return DXLegalize.runLegalizationPipeline (M );
198
223
}
199
224
200
225
char DXILLegalizeLegacy::ID = 0 ;
@@ -204,6 +229,6 @@ INITIALIZE_PASS_BEGIN(DXILLegalizeLegacy, DEBUG_TYPE, "DXIL Legalizer", false,
204
229
INITIALIZE_PASS_END(DXILLegalizeLegacy, DEBUG_TYPE, " DXIL Legalizer" , false ,
205
230
false )
206
231
207
- FunctionPass *llvm::createDXILLegalizeLegacyPass() {
232
+ ModulePass *llvm::createDXILLegalizeLegacyPass() {
208
233
return new DXILLegalizeLegacy ();
209
234
}
0 commit comments