48
48
#include " llvm/ADT/DenseMap.h"
49
49
#include " llvm/ADT/SetVector.h"
50
50
#include " llvm/ADT/SmallVector.h"
51
+ #include " llvm/CodeGen/InterleavedAccess.h"
51
52
#include " llvm/CodeGen/TargetLowering.h"
52
53
#include " llvm/CodeGen/TargetPassConfig.h"
53
54
#include " llvm/CodeGen/TargetSubtargetInfo.h"
@@ -82,22 +83,14 @@ static cl::opt<bool> LowerInterleavedAccesses(
82
83
83
84
namespace {
84
85
85
- class InterleavedAccess : public FunctionPass {
86
- public:
87
- static char ID;
88
-
89
- InterleavedAccess () : FunctionPass(ID) {
90
- initializeInterleavedAccessPass (*PassRegistry::getPassRegistry ());
91
- }
86
+ class InterleavedAccessImpl {
87
+ friend class InterleavedAccess ;
92
88
93
- StringRef getPassName () const override { return " Interleaved Access Pass" ; }
94
-
95
- bool runOnFunction (Function &F) override ;
96
-
97
- void getAnalysisUsage (AnalysisUsage &AU) const override {
98
- AU.addRequired <DominatorTreeWrapperPass>();
99
- AU.setPreservesCFG ();
100
- }
89
+ public:
90
+ InterleavedAccessImpl () = default ;
91
+ InterleavedAccessImpl (DominatorTree *DT, const TargetLowering *TLI)
92
+ : DT(DT), TLI(TLI), MaxFactor(TLI->getMaxSupportedInterleaveFactor ()) {}
93
+ bool runOnFunction (Function &F);
101
94
102
95
private:
103
96
DominatorTree *DT = nullptr ;
@@ -141,10 +134,60 @@ class InterleavedAccess : public FunctionPass {
141
134
LoadInst *LI);
142
135
};
143
136
137
+ class InterleavedAccess : public FunctionPass {
138
+ InterleavedAccessImpl Impl;
139
+
140
+ public:
141
+ static char ID;
142
+
143
+ InterleavedAccess () : FunctionPass(ID) {
144
+ initializeInterleavedAccessPass (*PassRegistry::getPassRegistry ());
145
+ }
146
+
147
+ StringRef getPassName () const override { return " Interleaved Access Pass" ; }
148
+
149
+ bool runOnFunction (Function &F) override ;
150
+
151
+ void getAnalysisUsage (AnalysisUsage &AU) const override {
152
+ AU.addRequired <DominatorTreeWrapperPass>();
153
+ AU.setPreservesCFG ();
154
+ }
155
+ };
156
+
144
157
} // end anonymous namespace.
145
158
159
+ PreservedAnalyses InterleavedAccessPass::run (Function &F,
160
+ FunctionAnalysisManager &FAM) {
161
+ auto *DT = &FAM.getResult <DominatorTreeAnalysis>(F);
162
+ auto *TLI = TM->getSubtargetImpl (F)->getTargetLowering ();
163
+ InterleavedAccessImpl Impl (DT, TLI);
164
+ bool Changed = Impl.runOnFunction (F);
165
+
166
+ if (!Changed)
167
+ return PreservedAnalyses::all ();
168
+
169
+ PreservedAnalyses PA;
170
+ PA.preserveSet <CFGAnalyses>();
171
+ return PA;
172
+ }
173
+
146
174
char InterleavedAccess::ID = 0 ;
147
175
176
+ bool InterleavedAccess::runOnFunction (Function &F) {
177
+ auto *TPC = getAnalysisIfAvailable<TargetPassConfig>();
178
+ if (!TPC || !LowerInterleavedAccesses)
179
+ return false ;
180
+
181
+ LLVM_DEBUG (dbgs () << " *** " << getPassName () << " : " << F.getName () << " \n " );
182
+
183
+ Impl.DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree ();
184
+ auto &TM = TPC->getTM <TargetMachine>();
185
+ Impl.TLI = TM.getSubtargetImpl (F)->getTargetLowering ();
186
+ Impl.MaxFactor = Impl.TLI ->getMaxSupportedInterleaveFactor ();
187
+
188
+ return Impl.runOnFunction (F);
189
+ }
190
+
148
191
INITIALIZE_PASS_BEGIN (InterleavedAccess, DEBUG_TYPE,
149
192
" Lower interleaved memory accesses to target specific intrinsics" , false ,
150
193
false )
@@ -228,7 +271,7 @@ static bool isReInterleaveMask(ShuffleVectorInst *SVI, unsigned &Factor,
228
271
return false ;
229
272
}
230
273
231
- bool InterleavedAccess ::lowerInterleavedLoad (
274
+ bool InterleavedAccessImpl ::lowerInterleavedLoad (
232
275
LoadInst *LI, SmallVector<Instruction *, 32 > &DeadInsts) {
233
276
if (!LI->isSimple () || isa<ScalableVectorType>(LI->getType ()))
234
277
return false ;
@@ -334,7 +377,7 @@ bool InterleavedAccess::lowerInterleavedLoad(
334
377
return true ;
335
378
}
336
379
337
- bool InterleavedAccess ::replaceBinOpShuffles (
380
+ bool InterleavedAccessImpl ::replaceBinOpShuffles (
338
381
ArrayRef<ShuffleVectorInst *> BinOpShuffles,
339
382
SmallVectorImpl<ShuffleVectorInst *> &Shuffles, LoadInst *LI) {
340
383
for (auto *SVI : BinOpShuffles) {
@@ -367,7 +410,7 @@ bool InterleavedAccess::replaceBinOpShuffles(
367
410
return !BinOpShuffles.empty ();
368
411
}
369
412
370
- bool InterleavedAccess ::tryReplaceExtracts (
413
+ bool InterleavedAccessImpl ::tryReplaceExtracts (
371
414
ArrayRef<ExtractElementInst *> Extracts,
372
415
ArrayRef<ShuffleVectorInst *> Shuffles) {
373
416
// If there aren't any extractelement instructions to modify, there's nothing
@@ -431,7 +474,7 @@ bool InterleavedAccess::tryReplaceExtracts(
431
474
return true ;
432
475
}
433
476
434
- bool InterleavedAccess ::lowerInterleavedStore (
477
+ bool InterleavedAccessImpl ::lowerInterleavedStore (
435
478
StoreInst *SI, SmallVector<Instruction *, 32 > &DeadInsts) {
436
479
if (!SI->isSimple ())
437
480
return false ;
@@ -457,7 +500,7 @@ bool InterleavedAccess::lowerInterleavedStore(
457
500
return true ;
458
501
}
459
502
460
- bool InterleavedAccess ::lowerDeinterleaveIntrinsic (
503
+ bool InterleavedAccessImpl ::lowerDeinterleaveIntrinsic (
461
504
IntrinsicInst *DI, SmallVector<Instruction *, 32 > &DeadInsts) {
462
505
LoadInst *LI = dyn_cast<LoadInst>(DI->getOperand (0 ));
463
506
@@ -476,7 +519,7 @@ bool InterleavedAccess::lowerDeinterleaveIntrinsic(
476
519
return true ;
477
520
}
478
521
479
- bool InterleavedAccess ::lowerInterleaveIntrinsic (
522
+ bool InterleavedAccessImpl ::lowerInterleaveIntrinsic (
480
523
IntrinsicInst *II, SmallVector<Instruction *, 32 > &DeadInsts) {
481
524
if (!II->hasOneUse ())
482
525
return false ;
@@ -498,18 +541,7 @@ bool InterleavedAccess::lowerInterleaveIntrinsic(
498
541
return true ;
499
542
}
500
543
501
- bool InterleavedAccess::runOnFunction (Function &F) {
502
- auto *TPC = getAnalysisIfAvailable<TargetPassConfig>();
503
- if (!TPC || !LowerInterleavedAccesses)
504
- return false ;
505
-
506
- LLVM_DEBUG (dbgs () << " *** " << getPassName () << " : " << F.getName () << " \n " );
507
-
508
- DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree ();
509
- auto &TM = TPC->getTM <TargetMachine>();
510
- TLI = TM.getSubtargetImpl (F)->getTargetLowering ();
511
- MaxFactor = TLI->getMaxSupportedInterleaveFactor ();
512
-
544
+ bool InterleavedAccessImpl::runOnFunction (Function &F) {
513
545
// Holds dead instructions that will be erased later.
514
546
SmallVector<Instruction *, 32 > DeadInsts;
515
547
bool Changed = false ;
0 commit comments