24
24
25
25
#include " codegen_shared.h"
26
26
#include " julia.h"
27
+ #include " passes.h"
27
28
28
29
#define DEBUG_TYPE " propagate_julia_addrspaces"
29
30
@@ -40,16 +41,13 @@ using namespace llvm;
40
41
optimizations.
41
42
*/
42
43
43
- struct PropagateJuliaAddrspaces : public FunctionPass , public InstVisitor <PropagateJuliaAddrspaces> {
44
- static char ID;
44
+ struct PropagateJuliaAddrspacesVisitor : public InstVisitor <PropagateJuliaAddrspacesVisitor> {
45
45
DenseMap<Value *, Value *> LiftingMap;
46
46
SmallPtrSet<Value *, 4 > Visited;
47
47
std::vector<Instruction *> ToDelete;
48
48
std::vector<std::pair<Instruction *, Instruction *>> ToInsert;
49
- PropagateJuliaAddrspaces () : FunctionPass(ID) {};
50
49
51
50
public:
52
- bool runOnFunction (Function &F) override ;
53
51
Value *LiftPointer (Value *V, Type *LocTy = nullptr , Instruction *InsertPt=nullptr );
54
52
void visitMemop (Instruction &I, Type *T, unsigned OpIndex);
55
53
void visitLoadInst (LoadInst &LI);
@@ -63,19 +61,6 @@ struct PropagateJuliaAddrspaces : public FunctionPass, public InstVisitor<Propag
63
61
void PoisonValues (std::vector<Value *> &Worklist);
64
62
};
65
63
66
- bool PropagateJuliaAddrspaces::runOnFunction (Function &F) {
67
- visit (F);
68
- for (auto it : ToInsert)
69
- it.first ->insertBefore (it.second );
70
- for (Instruction *I : ToDelete)
71
- I->eraseFromParent ();
72
- ToInsert.clear ();
73
- ToDelete.clear ();
74
- LiftingMap.clear ();
75
- Visited.clear ();
76
- return true ;
77
- }
78
-
79
64
static unsigned getValueAddrSpace (Value *V) {
80
65
return cast<PointerType>(V->getType ())->getAddressSpace ();
81
66
}
@@ -84,7 +69,7 @@ static bool isSpecialAS(unsigned AS) {
84
69
return AddressSpace::FirstSpecial <= AS && AS <= AddressSpace::LastSpecial;
85
70
}
86
71
87
- void PropagateJuliaAddrspaces ::PoisonValues (std::vector<Value *> &Worklist) {
72
+ void PropagateJuliaAddrspacesVisitor ::PoisonValues (std::vector<Value *> &Worklist) {
88
73
while (!Worklist.empty ()) {
89
74
Value *CurrentV = Worklist.back ();
90
75
Worklist.pop_back ();
@@ -97,7 +82,7 @@ void PropagateJuliaAddrspaces::PoisonValues(std::vector<Value *> &Worklist) {
97
82
}
98
83
}
99
84
100
- Value *PropagateJuliaAddrspaces ::LiftPointer (Value *V, Type *LocTy, Instruction *InsertPt) {
85
+ Value *PropagateJuliaAddrspacesVisitor ::LiftPointer (Value *V, Type *LocTy, Instruction *InsertPt) {
101
86
SmallVector<Value *, 4 > Stack;
102
87
std::vector<Value *> Worklist;
103
88
std::set<Value *> LocalVisited;
@@ -232,7 +217,7 @@ Value *PropagateJuliaAddrspaces::LiftPointer(Value *V, Type *LocTy, Instruction
232
217
return CollapseCastsAndLift (V, InsertPt);
233
218
}
234
219
235
- void PropagateJuliaAddrspaces ::visitMemop (Instruction &I, Type *T, unsigned OpIndex) {
220
+ void PropagateJuliaAddrspacesVisitor ::visitMemop (Instruction &I, Type *T, unsigned OpIndex) {
236
221
Value *Original = I.getOperand (OpIndex);
237
222
unsigned AS = Original->getType ()->getPointerAddressSpace ();
238
223
if (!isSpecialAS (AS))
@@ -243,23 +228,23 @@ void PropagateJuliaAddrspaces::visitMemop(Instruction &I, Type *T, unsigned OpIn
243
228
I.setOperand (OpIndex, Replacement);
244
229
}
245
230
246
- void PropagateJuliaAddrspaces ::visitLoadInst (LoadInst &LI) {
231
+ void PropagateJuliaAddrspacesVisitor ::visitLoadInst (LoadInst &LI) {
247
232
visitMemop (LI, LI.getType (), LoadInst::getPointerOperandIndex ());
248
233
}
249
234
250
- void PropagateJuliaAddrspaces ::visitStoreInst (StoreInst &SI) {
235
+ void PropagateJuliaAddrspacesVisitor ::visitStoreInst (StoreInst &SI) {
251
236
visitMemop (SI, SI.getValueOperand ()->getType (), StoreInst::getPointerOperandIndex ());
252
237
}
253
238
254
- void PropagateJuliaAddrspaces ::visitAtomicCmpXchgInst (AtomicCmpXchgInst &SI) {
239
+ void PropagateJuliaAddrspacesVisitor ::visitAtomicCmpXchgInst (AtomicCmpXchgInst &SI) {
255
240
visitMemop (SI, SI.getNewValOperand ()->getType (), AtomicCmpXchgInst::getPointerOperandIndex ());
256
241
}
257
242
258
- void PropagateJuliaAddrspaces ::visitAtomicRMWInst (AtomicRMWInst &SI) {
243
+ void PropagateJuliaAddrspacesVisitor ::visitAtomicRMWInst (AtomicRMWInst &SI) {
259
244
visitMemop (SI, SI.getType (), AtomicRMWInst::getPointerOperandIndex ());
260
245
}
261
246
262
- void PropagateJuliaAddrspaces ::visitMemSetInst (MemSetInst &MI) {
247
+ void PropagateJuliaAddrspacesVisitor ::visitMemSetInst (MemSetInst &MI) {
263
248
unsigned AS = MI.getDestAddressSpace ();
264
249
if (!isSpecialAS (AS))
265
250
return ;
@@ -272,7 +257,7 @@ void PropagateJuliaAddrspaces::visitMemSetInst(MemSetInst &MI) {
272
257
MI.setArgOperand (0 , Replacement);
273
258
}
274
259
275
- void PropagateJuliaAddrspaces ::visitMemTransferInst (MemTransferInst &MTI) {
260
+ void PropagateJuliaAddrspacesVisitor ::visitMemTransferInst (MemTransferInst &MTI) {
276
261
unsigned DestAS = MTI.getDestAddressSpace ();
277
262
unsigned SrcAS = MTI.getSourceAddressSpace ();
278
263
if (!isSpecialAS (DestAS) && !isSpecialAS (SrcAS))
@@ -299,11 +284,42 @@ void PropagateJuliaAddrspaces::visitMemTransferInst(MemTransferInst &MTI) {
299
284
MTI.setArgOperand (1 , Src);
300
285
}
301
286
302
- char PropagateJuliaAddrspaces::ID = 0 ;
303
- static RegisterPass<PropagateJuliaAddrspaces> X (" PropagateJuliaAddrspaces" , " Propagate (non-)rootedness information" , false , false );
287
+ bool propagateJuliaAddrspaces (Function &F) {
288
+ PropagateJuliaAddrspacesVisitor visitor;
289
+ visitor.visit (F);
290
+ for (auto it : visitor.ToInsert )
291
+ it.first ->insertBefore (it.second );
292
+ for (Instruction *I : visitor.ToDelete )
293
+ I->eraseFromParent ();
294
+ visitor.ToInsert .clear ();
295
+ visitor.ToDelete .clear ();
296
+ visitor.LiftingMap .clear ();
297
+ visitor.Visited .clear ();
298
+ return true ;
299
+ }
300
+
301
+ struct PropagateJuliaAddrspacesLegacy : FunctionPass {
302
+ static char ID;
303
+
304
+ PropagateJuliaAddrspacesLegacy () : FunctionPass(ID) {}
305
+ bool runOnFunction (Function &F) override {
306
+ return propagateJuliaAddrspaces (F);
307
+ }
308
+ };
309
+
310
+ char PropagateJuliaAddrspacesLegacy::ID = 0 ;
311
+ static RegisterPass<PropagateJuliaAddrspacesLegacy> X (" PropagateJuliaAddrspaces" , " Propagate (non-)rootedness information" , false , false );
304
312
305
313
Pass *createPropagateJuliaAddrspaces () {
306
- return new PropagateJuliaAddrspaces ();
314
+ return new PropagateJuliaAddrspacesLegacy ();
315
+ }
316
+
317
+ PreservedAnalyses PropagateJuliaAddrspacesPass::run (Function &F, FunctionAnalysisManager &AM) {
318
+ if (propagateJuliaAddrspaces (F)) {
319
+ return PreservedAnalyses::allInSet<CFGAnalyses>();
320
+ } else {
321
+ return PreservedAnalyses::all ();
322
+ }
307
323
}
308
324
309
325
extern " C" JL_DLLEXPORT void LLVMExtraAddPropagateJuliaAddrspaces_impl (LLVMPassManagerRef PM)
0 commit comments