|  | //===-- GuardUtils.cpp - Utils for work with guards -------------*- C++ -*-===// | 
|  | // | 
|  | // 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 | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // Utils that are used to perform analyzes related to guards and their | 
|  | // conditions. | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "llvm/Analysis/GuardUtils.h" | 
|  | #include "llvm/IR/PatternMatch.h" | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | bool llvm::isGuard(const User *U) { | 
|  | using namespace llvm::PatternMatch; | 
|  | return match(U, m_Intrinsic<Intrinsic::experimental_guard>()); | 
|  | } | 
|  |  | 
|  | bool llvm::isGuardAsWidenableBranch(const User *U) { | 
|  | Value *Condition, *WidenableCondition; | 
|  | BasicBlock *GuardedBB, *DeoptBB; | 
|  | if (!parseWidenableBranch(U, Condition, WidenableCondition, GuardedBB, | 
|  | DeoptBB)) | 
|  | return false; | 
|  | using namespace llvm::PatternMatch; | 
|  | for (auto &Insn : *DeoptBB) { | 
|  | if (match(&Insn, m_Intrinsic<Intrinsic::experimental_deoptimize>())) | 
|  | return true; | 
|  | if (Insn.mayHaveSideEffects()) | 
|  | return false; | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | bool llvm::parseWidenableBranch(const User *U, Value *&Condition, | 
|  | Value *&WidenableCondition, | 
|  | BasicBlock *&IfTrueBB, BasicBlock *&IfFalseBB) { | 
|  | using namespace llvm::PatternMatch; | 
|  | return match(U, m_Br(m_And(m_Value(Condition), m_Value(WidenableCondition)), | 
|  | IfTrueBB, IfFalseBB)); | 
|  | } |