blob: 62c501669051b3e157a33eb491ee1aa3fb436e54 [file] [log] [blame]
//===--- ARCSequenceOptUtils.cpp - ARCSequenceOpt utilities ------------===//
// This source file is part of the open source project
// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
// See for license information
// See for the list of Swift project authors
#include "ARCSequenceOptUtils.h"
using namespace swift;
namespace swift {
bool isARCSignificantTerminator(TermInst *TI) {
switch (TI->getTermKind()) {
case TermKind::UnreachableInst:
// br is a forwarding use for its arguments. It cannot in of itself extend
// the lifetime of an object (just like a phi-node) cannot.
case TermKind::BranchInst:
// A cond_br is a forwarding use for its non-operand arguments in a similar
// way to br. Its operand must be an i1 that has a different lifetime from any
// ref counted object.
case TermKind::CondBranchInst:
return false;
// Be conservative for now. These actually perform some sort of operation
// against the operand or can use the value in some way.
case TermKind::ThrowInst:
case TermKind::ReturnInst:
case TermKind::UnwindInst:
case TermKind::YieldInst:
case TermKind::AwaitAsyncContinuationInst:
case TermKind::TryApplyInst:
case TermKind::SwitchValueInst:
case TermKind::SwitchEnumInst:
case TermKind::SwitchEnumAddrInst:
case TermKind::DynamicMethodBranchInst:
case TermKind::CheckedCastBranchInst:
case TermKind::CheckedCastValueBranchInst:
case TermKind::CheckedCastAddrBranchInst:
return true;
llvm_unreachable("Unhandled TermKind in switch.");
} // end namespace 'swift'