Files
swift-mirror/lib/SILOptimizer/SemanticARC/RedundantMoveValueElimination.cpp
2023-12-14 13:35:26 -08:00

46 lines
1.6 KiB
C++

//===--- RedundantMoveValueElimination.cpp - Delete spurious move_values --===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2023 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
//
//===----------------------------------------------------------------------===//
// A move_value ends an owned lifetime and begins an owned lifetime.
//
// The new lifetime may have the same characteristics as the original lifetime
// with regards to
// - lexicality
// - escaping
//
// If it has the same characteristics, there is no reason to have two separate
// lifetimes--they are redundant. This optimization deletes such redundant
// move_values.
//===----------------------------------------------------------------------===//
#include "SemanticARC/SemanticARCOpts.h"
#include "SemanticARCOptVisitor.h"
#include "swift/SIL/LinearLifetimeChecker.h"
using namespace swift;
using namespace semanticarc;
//===----------------------------------------------------------------------===//
// Top Level Entrypoint
//===----------------------------------------------------------------------===//
bool SemanticARCOptVisitor::visitMoveValueInst(MoveValueInst *mvi) {
if (!ctx.shouldPerform(ARCTransformKind::RedundantMoveValueElim))
return false;
if (!isRedundantMoveValue(mvi))
return false;
// Both characteristics match.
eraseAndRAUWSingleValueInstruction(mvi, mvi->getOperand());
return true;
}