llvm-project/llvm/lib/Transforms/IPO
Florian Hahn ed9df5bd2f
[Passes] Run sinking/hoisting in SimplifyCFG earlier.
Hoisting and sinking instructions out of conditional blocks enables
additional vectorization by:

1. Executing memory accesses unconditionally.
2. Reducing the number of instructions that need predication.

After disabling early hoisting / sinking, we miss out on a few
vectorization opportunities. One of those is causing a ~10% performance
regression in one of the Geekbench benchmarks on AArch64.

This patch tires to recover the regression by running hoisting/sinking
as part of a SimplifyCFG run after LoopRotate and before LoopVectorize.

Note that in the legacy pass-manager, we run LoopRotate just before
vectorization again and there's no SimplifyCFG run in between, so the
sinking/hoisting may impact the later run on LoopRotate. But the impact
should be limited and the benefit of hosting/sinking at this stage
should outweigh the risk of not rotating.

Compile-time impact looks slightly positive for most cases.
http://llvm-compile-time-tracker.com/compare.php?from=2ea7fb7b1c045a7d60fcccf3df3ebb26aa3699e5&to=e58b4a763c691da651f25996aad619cb3d946faf&stat=instructions

NewPM-O3: geomean -0.19%
NewPM-ReleaseThinLTO: geoman -0.54%
NewPM-ReleaseLTO-g: geomean -0.03%

With a few benchmarks seeing a notable increase, but also some
improvements.

Alternative to D101290.

Reviewed By: lebedev.ri

Differential Revision: https://reviews.llvm.org/D101468
2021-04-30 12:23:57 +01:00
..
AlwaysInliner.cpp [coroutine] should disable inline before calling coro split 2020-12-08 08:53:08 -08:00
Annotation2Metadata.cpp Add pass to add !annotate metadata from @llvm.global.annotations. 2020-11-16 14:57:11 +00:00
ArgumentPromotion.cpp Revert "[ArgPromotion] Copy additional metadata for loads." 2021-03-26 21:34:54 +01:00
Attributor.cpp [ADT] Make TrackingStatistic's ctor constexpr 2021-04-28 12:00:17 +02:00
AttributorAttributes.cpp [NFC][ConstantRange] Add 'icmp' helper method 2021-04-10 19:38:55 +03:00
BarrierNoopPass.cpp
BlockExtractor.cpp [BlockExtract][NewPM] Port -extract-blocks to NPM 2020-10-21 12:51:11 -07:00
CMakeLists.txt [IRSim][IROutliner] Adding the extraction basics for the IROutliner. 2020-12-17 11:27:26 -06:00
CalledValuePropagation.cpp
ConstantMerge.cpp [ConstantMerge] Don't merge thread_local constants with non-thread_local constants 2021-04-28 23:44:20 +01:00
CrossDSOCFI.cpp
DeadArgumentElimination.cpp [DAE] Adjust param/arg attributes when changing parameter to undef 2021-03-25 14:53:22 -07:00
ElimAvailExtern.cpp
ExtractGV.cpp [Transforms] Use range-based for loops (NFC) 2021-02-08 22:33:53 -08:00
ForceFunctionAttrs.cpp [IR] Add vscale_range IR function attribute 2021-03-22 12:05:06 +00:00
FunctionAttrs.cpp [FuncAttrs] Don't infer willreturn for nonexact definitions 2021-04-21 21:26:09 +02:00
FunctionImport.cpp [FunctionImport] Delete unneeded setLive. NFC 2021-03-06 14:09:54 -08:00
GlobalDCE.cpp
GlobalOpt.cpp [GlobalOpt] Don't replace alias with aliasee if aliasee is interposable 2021-04-22 13:12:34 -07:00
GlobalSplit.cpp
HotColdSplitting.cpp [Transforms/IPO] Use range-based for loops (NFC) 2021-02-03 20:41:20 -08:00
IPO.cpp [OpenMP] Add OpenMPOpt as a Module pass 2021-04-20 12:28:58 -04:00
IROutliner.cpp IROutliner.cpp - fix Wdocumentation warning. NFCI. 2021-02-05 11:38:09 +00:00
InferFunctionAttrs.cpp [inferattrs] Don't infer lib func attributes for nobuiltin functions 2021-04-16 15:36:15 -07:00
InlineSimple.cpp
Inliner.cpp [Inliner] Make ModuleInlinerWrapperPass return PreservedAnalyses::all() 2021-04-26 17:22:35 -07:00
Internalize.cpp collectUsedGlobalVariables: migrate SmallPtrSetImpl overload to SmallVecImpl overload after D97128 2021-02-23 16:09:06 -08:00
LoopExtractor.cpp [LoopExtract][NewPM] Port -loop-extract to NPM 2020-10-13 22:55:42 -07:00
LowerTypeTests.cpp Use AssumeInst in a few more places [nfc] 2021-04-06 13:18:53 -07:00
MergeFunctions.cpp [Transforms/IPO] Use range-based for loops (NFC) 2021-02-03 20:41:20 -08:00
OpenMPOpt.cpp [OpenMP] Simplify offloading parallel call codegen 2021-04-21 18:46:07 -07:00
PartialInlining.cpp NFC: Migrate PartialInlining to work on InstructionCost 2021-03-30 11:59:45 +01:00
PassManagerBuilder.cpp [Passes] Run sinking/hoisting in SimplifyCFG earlier. 2021-04-30 12:23:57 +01:00
PruneEH.cpp [PruneEH][NFC] Use CallGraphUpdater in PruneEH 2020-09-14 14:43:19 -07:00
SCCP.cpp Add a missing file header comment, NFC. 2021-03-26 15:34:04 -07:00
SampleContextTracker.cpp [CSSPGO] Top-down processing order based on full profile. 2021-03-30 10:42:22 -07:00
SampleProfile.cpp [CSSPGO] Fix incorrect prorating indirect call distribution factor that leads to target count loss. 2021-04-23 11:09:22 -07:00
SampleProfileProbe.cpp [CSSPGO] Unblocking optimizations by dangling pseudo probes. 2021-03-03 22:44:42 -08:00
StripDeadPrototypes.cpp
StripSymbols.cpp [Transforms] Use range-based for loops (NFC) 2021-02-08 22:33:53 -08:00
SyntheticCountsPropagation.cpp
ThinLTOBitcodeWriter.cpp [ThinLTO] Copy UnnamedAddr when spliting module. 2021-04-19 14:04:58 -07:00
WholeProgramDevirt.cpp [SystemZ][z/OS][Windows] Add new OF_TextWithCRLF flag and use this flag instead of OF_Text 2021-04-06 07:23:31 -04:00