//===--- ValueUtils.cpp ---------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2018 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 // //===----------------------------------------------------------------------===// #include "swift/SIL/ValueUtils.h" #include "swift/Basic/STLExtras.h" #include "swift/SIL/SILFunction.h" using namespace swift; Optional swift::mergeSILValueOwnership(ArrayRef values) { // A forwarding inst without operands must be trivial. if (values.empty()) return Optional(ValueOwnershipKind::Trivial); // Find the first index where we have a trivial value. auto iter = find_if(values, [](SILValue v) -> bool { return v.getOwnershipKind() != ValueOwnershipKind::Trivial; }); // All trivial. if (iter == values.end()) { return Optional(ValueOwnershipKind::Trivial); } // See if we have any Any. If we do, just return that for now. if (any_of(values, [](SILValue v) -> bool { return v.getOwnershipKind() == ValueOwnershipKind::Any; })) return Optional(ValueOwnershipKind::Any); unsigned index = std::distance(values.begin(), iter); ValueOwnershipKind base = values[index].getOwnershipKind(); for (SILValue v : values.slice(index + 1)) { auto opKind = v.getOwnershipKind(); if (opKind.merge(ValueOwnershipKind::Trivial)) continue; auto mergedValue = base.merge(opKind.Value); if (!mergedValue.hasValue()) { return None; } } return base; }