/* * Copyright (c) 2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ecmascript/compiler/base/depend_chain_helper.h" namespace panda::ecmascript::kungfu { void DependChains::Merge(DependChains* that) { // find common sub list while (size_ > that->size_) { head_ = head_->next; size_--; } auto lhs = this->head_; auto rhs = that->head_; size_t rhsSize = that->size_; while (rhsSize > size_) { rhs = rhs->next; rhsSize--; } while (lhs != rhs) { ASSERT(lhs != nullptr); lhs = lhs->next; rhs = rhs->next; size_--; } head_ = lhs; } bool DependChains::Equals(DependChains* that) { if (that == nullptr) { return false; } if (size_ != that->size_) { return false; } auto lhs = this->head_; auto rhs = that->head_; while (lhs != rhs) { if (lhs->gate != rhs->gate) { return false; } lhs = lhs->next; rhs = rhs->next; } return true; } uint32_t DependChains::FoundIndexCheckedForLength(RangeGuard* rangeGuard, GateRef input) { for (Node* node = head_; node != nullptr; node = node->next) { uint32_t length = rangeGuard->CheckIndexCheckLengthInput(node->gate, input); if (length > 0) { // found !!! return length; } } return 0; } uint32_t DependChains::FoundIndexCheckedForIndex(RangeGuard* rangeGuard, GateRef input) { for (Node* node = head_; node != nullptr; node = node->next) { uint32_t length = rangeGuard->CheckIndexCheckIndexInput(node->gate, input); if (length > 0) { // found !!! return length; } } return 0; } GateRef DependChains::LookupNode(LaterElimination* elimination, GateRef gate) { for (Node* node = head_; node != nullptr; node = node->next) { if (elimination->CheckReplacement(node->gate, gate)) { return node->gate; } } return Circuit::NullGate(); } DependChains* DependChains::UpdateNode(GateRef gate) { // assign node->next to head Node* node = chunk_->New(gate, head_); DependChains* that = new (chunk_) DependChains(chunk_); // assign head to node that->head_ = node; that->size_ = size_ + 1; return that; } } // namespace panda::ecmascript::kungfu