35
35
#include < llvm/Passes/PassPlugin.h>
36
36
37
37
// NewPM needs to manually include all the pass headers
38
+ #include < llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h>
38
39
#include < llvm/Transforms/IPO/AlwaysInliner.h>
39
40
#include < llvm/Transforms/IPO/Annotation2Metadata.h>
40
41
#include < llvm/Transforms/IPO/ConstantMerge.h>
46
47
#include < llvm/Transforms/Instrumentation/ThreadSanitizer.h>
47
48
#include < llvm/Transforms/Scalar/ADCE.h>
48
49
#include < llvm/Transforms/Scalar/AnnotationRemarks.h>
50
+ #include < llvm/Transforms/Scalar/BDCE.h>
49
51
#include < llvm/Transforms/Scalar/CorrelatedValuePropagation.h>
50
52
#include < llvm/Transforms/Scalar/DCE.h>
51
53
#include < llvm/Transforms/Scalar/DeadStoreElimination.h>
75
77
#include < llvm/Transforms/Scalar/SimpleLoopUnswitch.h>
76
78
#include < llvm/Transforms/Scalar/SimplifyCFG.h>
77
79
#include < llvm/Transforms/Scalar/WarnMissedTransforms.h>
80
+ #include < llvm/Transforms/Utils/LibCallsShrinkWrap.h>
78
81
#include < llvm/Transforms/Utils/InjectTLIMappings.h>
82
+ #include < llvm/Transforms/Utils/RelLookupTableConverter.h>
79
83
#include < llvm/Transforms/Vectorize/LoopVectorize.h>
80
84
#include < llvm/Transforms/Vectorize/SLPVectorizer.h>
81
85
#include < llvm/Transforms/Vectorize/VectorCombine.h>
@@ -209,10 +213,10 @@ namespace {
209
213
.convertSwitchRangeToICmp (true )
210
214
.convertSwitchToLookupTable (true )
211
215
.forwardSwitchCondToPhi (true )
216
+ .needCanonicalLoops (false )
212
217
// These mess with loop rotation, so only do them after that
213
218
.hoistCommonInsts (true )
214
- // Causes an SRET assertion error in late-gc-lowering
215
- // .sinkCommonInsts(true)
219
+ .sinkCommonInsts (true )
216
220
;
217
221
}
218
222
#if JL_LLVM_VERSION < 150000
@@ -357,7 +361,7 @@ static void buildEarlySimplificationPipeline(ModulePassManager &MPM, PassBuilder
357
361
if (O.getSpeedupLevel () >= 1 ) {
358
362
#if JL_LLVM_VERSION >= 160000
359
363
// TODO check the LLVM 15 default.
360
- FPM.addPass (SROAPass (SROAOptions::PreserveCFG ));
364
+ FPM.addPass (SROAPass (SROAOptions::ModifyCFG ));
361
365
#else
362
366
FPM.addPass (SROAPass ());
363
367
#endif
@@ -397,20 +401,23 @@ static void buildEarlyOptimizerPipeline(ModulePassManager &MPM, PassBuilder *PB,
397
401
if (O.getSpeedupLevel () >= 2 ) {
398
402
#if JL_LLVM_VERSION >= 160000
399
403
// TODO check the LLVM 15 default.
400
- FPM.addPass (SROAPass (SROAOptions::PreserveCFG ));
404
+ FPM.addPass (SROAPass (SROAOptions::ModifyCFG ));
401
405
#else
402
406
FPM.addPass (SROAPass ());
403
407
#endif
404
408
// SROA can duplicate PHI nodes which can block LowerSIMD
405
- FPM.addPass (InstCombinePass ());
409
+ FPM.addPass (EarlyCSEPass ());
406
410
FPM.addPass (JumpThreadingPass ());
407
411
FPM.addPass (CorrelatedValuePropagationPass ());
412
+ FPM.addPass (InstCombinePass ());
413
+ FPM.addPass (AggressiveInstCombinePass ());
414
+ FPM.addPass (LibCallsShrinkWrapPass ());
415
+
408
416
FPM.addPass (ReassociatePass ());
409
- FPM.addPass (EarlyCSEPass ());
410
417
JULIA_PASS (FPM.addPass (AllocOptPass ()));
411
418
} else { // if (O.getSpeedupLevel() >= 1) (exactly)
412
- FPM.addPass (InstCombinePass ());
413
419
FPM.addPass (EarlyCSEPass ());
420
+ FPM.addPass (InstCombinePass ());
414
421
}
415
422
invokePeepholeEPCallbacks (FPM, PB, O);
416
423
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (FPM)));
@@ -472,16 +479,18 @@ static void buildScalarOptimizerPipeline(FunctionPassManager &FPM, PassBuilder *
472
479
JULIA_PASS (FPM.addPass (AllocOptPass ()));
473
480
#if JL_LLVM_VERSION >= 160000
474
481
// TODO check the LLVM 15 default.
475
- FPM.addPass (SROAPass (SROAOptions::PreserveCFG ));
482
+ FPM.addPass (SROAPass (SROAOptions::ModifyCFG ));
476
483
#else
477
484
FPM.addPass (SROAPass ());
478
485
#endif
486
+ FPM.addPass (VectorCombinePass (/* TryEarlyFoldsOnly=*/ true ));
479
487
FPM.addPass (InstSimplifyPass ());
480
488
FPM.addPass (GVNPass ());
481
489
FPM.addPass (MemCpyOptPass ());
482
490
FPM.addPass (SCCPPass ());
491
+ FPM.addPass (BDCEPass ());
483
492
FPM.addPass (CorrelatedValuePropagationPass ());
484
- FPM.addPass (DCEPass ());
493
+ FPM.addPass (ADCEPass ());
485
494
FPM.addPass (IRCEPass ());
486
495
FPM.addPass (InstCombinePass ());
487
496
FPM.addPass (JumpThreadingPass ());
@@ -496,11 +505,12 @@ static void buildScalarOptimizerPipeline(FunctionPassManager &FPM, PassBuilder *
496
505
JULIA_PASS (FPM.addPass (AllocOptPass ()));
497
506
{
498
507
LoopPassManager LPM;
499
- LPM.addPass (LoopDeletionPass ( ));
500
- LPM.addPass (LoopInstSimplifyPass ());
501
- FPM.addPass (createFunctionToLoopPassAdaptor (std::move (LPM)));
508
+ LPM.addPass (LICMPass ( LICMOptions () ));
509
+ LPM.addPass (JuliaLICMPass ());
510
+ FPM.addPass (createFunctionToLoopPassAdaptor (std::move (LPM), /* UseMemorySSA = */ true ));
502
511
}
503
- FPM.addPass (LoopDistributePass ());
512
+ FPM.addPass (SimplifyCFGPass (aggressiveSimplifyCFGOptions ()));
513
+ FPM.addPass (InstCombinePass ());
504
514
}
505
515
invokeScalarOptimizerCallbacks (FPM, PB, O);
506
516
FPM.addPass (AfterScalarOptimizationMarkerPass ());
@@ -509,6 +519,13 @@ static void buildScalarOptimizerPipeline(FunctionPassManager &FPM, PassBuilder *
509
519
static void buildVectorPipeline (FunctionPassManager &FPM, PassBuilder *PB, OptimizationLevel O, const OptimizationOptions &options) JL_NOTSAFEPOINT {
510
520
FPM.addPass (BeforeVectorizationMarkerPass ());
511
521
// TODO look into loop vectorize options
522
+ // Rerotate loops that might have been unrotated in the simplification
523
+ LoopPassManager LPM;
524
+ LPM.addPass (LoopRotatePass ());
525
+ LPM.addPass (LoopDeletionPass ());
526
+ FPM.addPass (createFunctionToLoopPassAdaptor (
527
+ std::move (LPM), /* UseMemorySSA=*/ false , /* UseBlockFrequencyInfo=*/ false ));
528
+ FPM.addPass (LoopDistributePass ());
512
529
FPM.addPass (InjectTLIMappings ());
513
530
FPM.addPass (LoopVectorizePass ());
514
531
FPM.addPass (LoopLoadEliminationPass ());
@@ -517,11 +534,13 @@ static void buildVectorPipeline(FunctionPassManager &FPM, PassBuilder *PB, Optim
517
534
FPM.addPass (SLPVectorizerPass ());
518
535
invokeVectorizerCallbacks (FPM, PB, O);
519
536
FPM.addPass (VectorCombinePass ());
520
- FPM.addPass (ADCEPass ());
537
+ FPM.addPass (InstCombinePass ());
521
538
// TODO add BDCEPass here?
522
539
// This unroll will unroll vectorized loops
523
540
// as well as loops that we tried but failed to vectorize
524
541
FPM.addPass (LoopUnrollPass (LoopUnrollOptions (O.getSpeedupLevel (), /* OnlyWhenForced = */ false , /* ForgetSCEV = */ false )));
542
+ FPM.addPass (SROAPass (SROAOptions::PreserveCFG));
543
+ FPM.addPass (createFunctionToLoopPassAdaptor (LICMPass (LICMOptions ()), /* UseMemorySSA=*/ true , /* UseBlockFrequencyInfo=*/ false ));
525
544
FPM.addPass (AfterVectorizationMarkerPass ());
526
545
}
527
546
0 commit comments