Files
swift-mirror/lib/SILOptimizer/Mandatory/ConstantPropagation.cpp
Erik Eckstein 18063707b5 Optimizer: enable complete OSSA lifetimes throughout the pass pipeline
This new OSSA invariant simplifies many optimizations because they don't have to take care of the corner case of incomplete lifetimes in dead-end blocks.

The implementation basically consists of these changes:
* add the lifetime completion utility
* add a flag in SILFunction which tells optimization that they need to run the lifetime completion utility
* let all optimizations complete lifetimes if necessary
* enable the ownership verifier to check complete lifetimes
2026-01-22 17:41:48 +01:00

70 lines
2.5 KiB
C++

//===--- ConstantPropagation.cpp - Constant fold and diagnose overflows ---===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#define DEBUG_TYPE "constant-propagation"
#include "swift/Basic/Assertions.h"
#include "swift/SILOptimizer/PassManager/Transforms.h"
#include "swift/SILOptimizer/Utils/SILOptFunctionBuilder.h"
#include "swift/SILOptimizer/Utils/ConstantFolding.h"
#include "swift/SILOptimizer/Utils/BasicBlockOptUtils.h"
#include "swift/SILOptimizer/Utils/CFGOptUtils.h"
#include "swift/SILOptimizer/Utils/OwnershipOptUtils.h"
using namespace swift;
//===----------------------------------------------------------------------===//
// Top Level Driver
//===----------------------------------------------------------------------===//
namespace {
class ConstantPropagation : public SILFunctionTransform {
bool EnableDiagnostics;
public:
ConstantPropagation(bool EnableDiagnostics) :
EnableDiagnostics(EnableDiagnostics) {}
private:
/// The entry point to the transformation.
void run() override {
SILOptFunctionBuilder FuncBuilder(*this);
ConstantFolder Folder(FuncBuilder, getOptions().AssertConfig,
EnableDiagnostics);
Folder.initializeWorklist(*getFunction());
auto Invalidation = Folder.processWorkList();
if (Invalidation != SILAnalysis::InvalidationKind::Nothing) {
invalidateAnalysis(Invalidation);
if ((Invalidation & SILAnalysis::InvalidationKind::Branches) != 0) {
removeUnreachableBlocks(*getFunction());
if (getFunction()->needBreakInfiniteLoops())
breakInfiniteLoops(getPassManager(), getFunction());
if (getFunction()->needCompleteLifetimes())
completeAllLifetimes(getPassManager(), getFunction());
}
}
}
};
} // end anonymous namespace
SILTransform *swift::createDiagnosticConstantPropagation() {
// Diagnostic propagation is rerun on deserialized SIL because it is sensitive
// to assert configuration.
return new ConstantPropagation(true /*enable diagnostics*/);
}
SILTransform *swift::createPerformanceConstantPropagation() {
return new ConstantPropagation(false /*disable diagnostics*/);
}