llvm-project/llvm/lib/Transforms/IPO
Florian Hahn 35b3989a30
[Passes] Run peeling as part of simple/full loop unrolling.
Loop peeling removes conditions from loop bodies that become invariant
after a small number of iterations. When triggered, this leads to fewer
compares and possibly PHIs in loop bodies, enabling further
optimizations. The current cost-model of loop peeling should be quite
conservative/safe, i.e. only peel if a condition in the loop becomes
known after peeling.

For example, see PR47671, where loop peeling enables vectorization by
removing a PHI the vectorizer does not understand. Granted, the
loop-vectorizer could also be taught about constant PHIs, but loop
peeling is likely to enable other optimizations as well.

This has an impact on quite a few benchmarks from
MultiSource/SPEC2000/SPEC2006 on X86 with -O3 -flto, for example

    Same hash: 186 (filtered out)
    Remaining: 51
    Metric: loop-vectorize.LoopsVectorized

    Program                                        base   patch  diff
     test-suite...ve-susan/automotive-susan.test     8.00   9.00 12.5%
     test-suite...nal/skidmarks10/skidmarks.test    35.00  31.00 -11.4%
     test-suite...lications/sqlite3/sqlite3.test    41.00  43.00  4.9%
     test-suite...s/ASC_Sequoia/AMGmk/AMGmk.test    25.00  26.00  4.0%
     test-suite...006/450.soplex/450.soplex.test    88.00  89.00  1.1%
     test-suite...TimberWolfMC/timberwolfmc.test   120.00 119.00 -0.8%
     test-suite.../CINT2006/403.gcc/403.gcc.test   215.00 216.00  0.5%
     test-suite...006/447.dealII/447.dealII.test   957.00 958.00  0.1%
     test-suite...ternal/HMMER/hmmcalibrate.test    75.00  75.00  0.0%

    Same hash: 186 (filtered out)
    Remaining: 51
    Metric: loop-vectorize.LoopsAnalyzed

    Program                                        base    patch   diff
     test-suite...ks/Prolangs-C/agrep/agrep.test   440.00  434.00  -1.4%
     test-suite...nal/skidmarks10/skidmarks.test   312.00  308.00  -1.3%
     test-suite...marks/7zip/7zip-benchmark.test   6399.00 6323.00 -1.2%
     test-suite...lications/minisat/minisat.test   134.00  135.00   0.7%
     test-suite...rks/FreeBench/pifft/pifft.test   295.00  297.00   0.7%
     test-suite...TimberWolfMC/timberwolfmc.test   1879.00 1869.00 -0.5%
     test-suite...pplications/treecc/treecc.test   689.00  691.00   0.3%
     test-suite...T2000/300.twolf/300.twolf.test   1593.00 1597.00  0.3%
     test-suite.../Benchmarks/Bullet/bullet.test   1394.00 1392.00 -0.1%
     test-suite...ications/JM/ldecod/ldecod.test   1431.00 1429.00 -0.1%
     test-suite...6/464.h264ref/464.h264ref.test   2229.00 2230.00  0.0%
     test-suite...lications/sqlite3/sqlite3.test   2590.00 2589.00 -0.0%
     test-suite...ications/JM/lencod/lencod.test   2732.00 2733.00  0.0%
     test-suite...006/453.povray/453.povray.test   3395.00 3394.00 -0.0%

Note the -11% regression in number of loops vectorized for skidmarks. I
suspect this corresponds to the fact that those loops are gone now (see
the reduction in number of loops analyzed by LV).

Reviewed By: lebedev.ri

Differential Revision: https://reviews.llvm.org/D88471
2021-01-26 13:52:30 +00: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 [llvm] Use pop_back_val (NFC) 2021-01-23 10:56:33 -08:00
Attributor.cpp [llvm] Remove redundant string initialization (NFC) 2021-01-12 21:43:46 -08:00
AttributorAttributes.cpp [llvm] Remove redundant return and continue statements (NFC) 2021-01-14 20:30:34 -08: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 [IR] Replace all uses of CallBase::getCalledValue() with getCalledOperand(). 2020-04-27 22:17:03 -07:00
ConstantMerge.cpp [Alignment][NFC] migrate DataLayout::getPreferredAlignment 2020-06-29 11:24:36 +00:00
CrossDSOCFI.cpp
DeadArgumentElimination.cpp Revert "[ObjC][ARC] Annotate calls with attributes instead of emitting retainRV" 2021-01-25 13:53:38 -08:00
ElimAvailExtern.cpp
ExtractGV.cpp
ForceFunctionAttrs.cpp Revert "[IR] add fn attr for no_stack_protector; prevent inlining on mismatch" 2020-11-17 17:27:14 -08:00
FunctionAttrs.cpp [FunctionAttrs] Infer willreturn for functions without loops 2021-01-21 20:29:33 +01:00
FunctionImport.cpp [ThinLTO] Default -enable-import-metadata to false 2020-12-31 10:04:21 -08:00
GlobalDCE.cpp
GlobalOpt.cpp [Transforms] Use llvm::append_range (NFC) 2021-01-20 21:35:54 -08:00
GlobalSplit.cpp
HotColdSplitting.cpp [HotColdSplit] Reflect full cost of parameters in split penalty 2020-12-18 17:06:17 -08:00
IPO.cpp [IRSim][IROutliner] Adding the extraction basics for the IROutliner. 2020-12-17 11:27:26 -06:00
IROutliner.cpp [NFC][InstructionCost] Use InstructionCost in lib/Transforms/IPO/IROutliner.cpp 2021-01-20 08:33:59 +00:00
InferFunctionAttrs.cpp
InlineSimple.cpp Revert "Revert "[llvm][NFC] Cleanup uses of std::function in Inlining-related APIs"" 2020-05-15 12:29:16 -07:00
Inliner.cpp [InlineAdvisor] Allow replay of inline decisions for the CGSCC inliner from optimization remarks 2021-01-25 15:38:57 -08:00
Internalize.cpp
LoopExtractor.cpp [LoopExtract][NewPM] Port -loop-extract to NPM 2020-10-13 22:55:42 -07:00
LowerTypeTests.cpp [Transforms] Use llvm::append_range (NFC) 2020-12-27 09:57:29 -08:00
MergeFunctions.cpp Migrate deprecated DebugLoc::get to DILocation::get 2020-12-11 12:45:22 -08:00
OpenMPOpt.cpp [llvm] Use the default value of drop_begin (NFC) 2021-01-18 10:16:36 -08:00
PartialInlining.cpp [PartialInliner]: Handle code regions in a switch stmt cases 2020-11-02 14:32:45 -05:00
PassManagerBuilder.cpp [Passes] Run peeling as part of simple/full loop unrolling. 2021-01-26 13:52:30 +00:00
PruneEH.cpp [PruneEH][NFC] Use CallGraphUpdater in PruneEH 2020-09-14 14:43:19 -07:00
SCCP.cpp
SampleContextTracker.cpp [IPO] Fix operator precedence warning. NFCI. 2020-12-07 18:23:54 +00:00
SampleProfile.cpp [InlineAdvisor] Allow replay of inline decisions for the CGSCC inliner from optimization remarks 2021-01-25 15:38:57 -08:00
SampleProfileProbe.cpp [CSSPGO] Consume pseudo-probe-based AutoFDO profile 2020-12-16 15:57:18 -08:00
StripDeadPrototypes.cpp
StripSymbols.cpp [NewPM] Port strip* passes to NPM 2020-09-15 18:25:12 -07:00
SyntheticCountsPropagation.cpp [CallGraph] Add support for callback call sites 2020-07-01 13:44:11 -07:00
ThinLTOBitcodeWriter.cpp [Transforms] Use llvm::append_range (NFC) 2021-01-20 21:35:54 -08:00
WholeProgramDevirt.cpp [Transforms] Use llvm::append_range (NFC) 2021-01-20 21:35:54 -08:00