mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Implement retain, release code motion.
Iterative data flow retain sinking and release hoisting. This allows us to sink retains and hoist releases across harmless loops. which is an improvement on the SILCodeMotion retain sinking and release hoisting. It also separates the duty of moving retain and release with the duty of eliminating them in ASO. This should eventually replace RR code motion in SILcodemotion and insertion point in ARCsequence opts (ASO). This is the performance difference i get with retain sinking and release hoisting. After disabling retain release code motion in ASO and SILCodeMotion. we can start to take those code out once this lands. I see that we go from 24.5% of time spent in SILOptimizations w.r.t. the whole stdlib compilation to 25.1%. Improvement is better (i.e. retain sinking and hoisting releases result in performance gain). <details open> <summary>Regression (7)</summary> TEST | OLD_MIN | NEW_MIN | DELTA (%) | SPEEDUP --- | --- | --- | --- | --- SetIsSubsetOf | 441 | 510 | +15.7% | **0.86x** SetIntersect | 1041 | 1197 | +15.0% | **0.87x** BenchLangCallingCFunction | 184 | 211 | +14.7% | **0.87x** Sim2DArray | 326 | 372 | +14.1% | **0.88x** SetIsSubsetOf_OfObjects | 498 | 567 | +13.9% | **0.88x** GeekbenchGEMM | 945 | 1022 | +8.2% | **0.92x** COWTree | 3839 | 4181 | +8.9% | **0.92x(?)** </details> <details > <summary>Improvement (31)</summary> TEST | OLD_MIN | NEW_MIN | DELTA (%) | SPEEDUP --- | --- | --- | --- | --- ObjectiveCBridgeFromNSDictionaryAnyObjectToString | 174526 | 165392 | -5.2% | **1.06x** RGBHistogram | 3128 | 2957 | -5.5% | **1.06x** ObjectiveCBridgeToNSDictionary | 16510 | 15494 | -6.2% | **1.07x** LuhnAlgoLazy | 2294 | 2120 | -7.6% | **1.08x** DictionarySwapOfObjects | 6477 | 5994 | -7.5% | **1.08x** StringRemoveDupes | 1610 | 1485 | -7.8% | **1.08x** ObjectiveCBridgeFromNSSetAnyObjectToString | 159358 | 147824 | -7.2% | **1.08x** ObjectiveCBridgeToNSSet | 16191 | 14924 | -7.8% | **1.08x** DictionaryHashableClass | 1839 | 1704 | -7.3% | **1.08x** DictionaryLiteral | 2906 | 2678 | -7.8% | **1.09x(?)** StringUtilsUnderscoreCase | 10031 | 9187 | -8.4% | **1.09x** LuhnAlgoEager | 2320 | 2113 | -8.9% | **1.10x** ObjectiveCBridgeFromNSSetAnyObjectToStringForced | 99553 | 90348 | -9.2% | **1.10x** RIPEMD | 3327 | 3009 | -9.6% | **1.11x** Combos | 595 | 538 | -9.6% | **1.11x** Roman | 10 | 9 | -10.0% | **1.11x** StringUtilsCamelCase | 10783 | 9646 | -10.5% | **1.12x** SetIntersect_OfObjects | 2511 | 2182 | -13.1% | **1.15x** SwiftStructuresTrie | 28331 | 24339 | -14.1% | **1.16x** Dictionary2OfObjects | 3748 | 3115 | -16.9% | **1.20x** DictionaryOfObjects | 2473 | 2050 | -17.1% | **1.21x** Dictionary | 894 | 737 | -17.6% | **1.21x** Dictionary2 | 2268 | 1859 | -18.0% | **1.22x** StringIteration | 8027 | 6344 | -21.0% | **1.27x** Phonebook | 8207 | 6436 | -21.6% | **1.28x** BenchLangArray | 119 | 91 | -23.5% | **1.31x** LinkedList | 8267 | 6297 | -23.8% | **1.31x** StrToInt | 5585 | 4180 | -25.2% | **1.34x** Dictionary3OfObjects | 1122 | 831 | -25.9% | **1.35x** Dictionary3 | 731 | 515 | -29.6% | **1.42x** SuperChars | 513353 | 258735 | -49.6% | **1.98x**
This commit is contained in:
@@ -28,12 +28,15 @@
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
|
||||
STATISTIC(NumSunk, "Number of instructions sunk");
|
||||
STATISTIC(NumRefCountOpsSimplified, "Number of enum ref count ops simplified");
|
||||
STATISTIC(NumHoisted, "Number of instructions hoisted");
|
||||
|
||||
llvm::cl::opt<bool> DisableSILRRCodeMotion("disable-sil-cm-rr-cm", llvm::cl::init(true));
|
||||
|
||||
using namespace swift;
|
||||
|
||||
namespace {
|
||||
@@ -1719,11 +1722,12 @@ static bool processFunction(SILFunction *F, AliasAnalysis *AA,
|
||||
Changed |= State.process();
|
||||
|
||||
// Finally we try to sink retain instructions from this BB to the next BB.
|
||||
Changed |= sinkRefCountIncrement(State.getBB(), AA, RCIA);
|
||||
if (!DisableSILRRCodeMotion)
|
||||
Changed |= sinkRefCountIncrement(State.getBB(), AA, RCIA);
|
||||
|
||||
// And hoist decrements to predecessors. This is beneficial if we can then
|
||||
// match them up with an increment in some of the predecessors.
|
||||
if (HoistReleases)
|
||||
if (!DisableSILRRCodeMotion && HoistReleases)
|
||||
Changed |= hoistDecrementsToPredecessors(State.getBB(), AA, RCIA);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user