| //===----------------------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // Out-of-line implementations for PatternMatch.h. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/IR/PatternMatch.h" | |
| #include "llvm/ADT/SmallPtrSet.h" | |
| #include "llvm/ADT/SmallVector.h" | |
| #include "llvm/IR/Constants.h" | |
| #include "llvm/IR/Value.h" | |
| using namespace llvm; | |
| bool llvm::PatternMatch::undef_match::checkAggregate( | |
| const ConstantAggregate *CA) { | |
| SmallPtrSet<const ConstantAggregate *, 8> Seen; | |
| SmallVector<const ConstantAggregate *, 8> Worklist; | |
| // Either UndefValue, PoisonValue, or an aggregate that only contains | |
| // these is accepted by matcher. | |
| // CheckValue returns false if CA cannot satisfy this constraint. | |
| auto CheckValue = [&](const ConstantAggregate *CA) { | |
| for (const Value *Op : CA->operand_values()) { | |
| if (isa<UndefValue>(Op)) | |
| continue; | |
| const auto *CA = dyn_cast<ConstantAggregate>(Op); | |
| if (!CA) | |
| return false; | |
| if (Seen.insert(CA).second) | |
| Worklist.emplace_back(CA); | |
| } | |
| return true; | |
| }; | |
| if (!CheckValue(CA)) | |
| return false; | |
| while (!Worklist.empty()) { | |
| if (!CheckValue(Worklist.pop_back_val())) | |
| return false; | |
| } | |
| return true; | |
| } |