xref: /src/contrib/llvm-project/llvm/lib/Analysis/DomConditionCache.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1b1c73532SDimitry Andric //===- DomConditionCache.cpp ----------------------------------------------===//
2b1c73532SDimitry Andric //
3b1c73532SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b1c73532SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5b1c73532SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b1c73532SDimitry Andric //
7b1c73532SDimitry Andric //===----------------------------------------------------------------------===//
8b1c73532SDimitry Andric 
9b1c73532SDimitry Andric #include "llvm/Analysis/DomConditionCache.h"
10ac9a064cSDimitry Andric #include "llvm/Analysis/ValueTracking.h"
11b1c73532SDimitry Andric using namespace llvm;
12b1c73532SDimitry Andric 
findAffectedValues(Value * Cond,SmallVectorImpl<Value * > & Affected)13b1c73532SDimitry Andric static void findAffectedValues(Value *Cond,
14b1c73532SDimitry Andric                                SmallVectorImpl<Value *> &Affected) {
15ac9a064cSDimitry Andric   auto InsertAffected = [&Affected](Value *V) { Affected.push_back(V); };
16ac9a064cSDimitry Andric   findValuesAffectedByCondition(Cond, /*IsAssume=*/false, InsertAffected);
17b1c73532SDimitry Andric }
18b1c73532SDimitry Andric 
registerBranch(BranchInst * BI)19b1c73532SDimitry Andric void DomConditionCache::registerBranch(BranchInst *BI) {
20b1c73532SDimitry Andric   assert(BI->isConditional() && "Must be conditional branch");
21b1c73532SDimitry Andric   SmallVector<Value *, 16> Affected;
22b1c73532SDimitry Andric   findAffectedValues(BI->getCondition(), Affected);
23b1c73532SDimitry Andric   for (Value *V : Affected) {
24b1c73532SDimitry Andric     auto &AV = AffectedValues[V];
25b1c73532SDimitry Andric     if (!is_contained(AV, BI))
26b1c73532SDimitry Andric       AV.push_back(BI);
27b1c73532SDimitry Andric   }
28b1c73532SDimitry Andric }
29