1 //===-- GuardUtils.h - Utils for work with guards ---------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // Utils that are used to perform analyzes related to guards and their 9 // conditions. 10 //===----------------------------------------------------------------------===// 11 12 #ifndef LLVM_ANALYSIS_GUARDUTILS_H 13 #define LLVM_ANALYSIS_GUARDUTILS_H 14 15 namespace llvm { 16 17 class BasicBlock; 18 class Use; 19 class User; 20 class Value; 21 template <typename T> class SmallVectorImpl; 22 23 /// Returns true iff \p U has semantics of a guard expressed in a form of call 24 /// of llvm.experimental.guard intrinsic. 25 bool isGuard(const User *U); 26 27 /// Returns true iff \p V has semantics of llvm.experimental.widenable.condition 28 /// call 29 bool isWidenableCondition(const Value *V); 30 31 /// Returns true iff \p U is a widenable branch (that is, 32 /// extractWidenableCondition returns widenable condition). 33 bool isWidenableBranch(const User *U); 34 35 /// Returns true iff \p U has semantics of a guard expressed in a form of a 36 /// widenable conditional branch to deopt block. 37 bool isGuardAsWidenableBranch(const User *U); 38 39 /// If U is widenable branch looking like: 40 /// %cond = ... 41 /// %wc = call i1 @llvm.experimental.widenable.condition() 42 /// %branch_cond = and i1 %cond, %wc 43 /// br i1 %branch_cond, label %if_true_bb, label %if_false_bb ; <--- U 44 /// The function returns true, and the values %cond and %wc and blocks 45 /// %if_true_bb, if_false_bb are returned in 46 /// the parameters (Condition, WidenableCondition, IfTrueBB and IfFalseFF) 47 /// respectively. If \p U does not match this pattern, return false. 48 bool parseWidenableBranch(const User *U, Value *&Condition, 49 Value *&WidenableCondition, BasicBlock *&IfTrueBB, 50 BasicBlock *&IfFalseBB); 51 52 /// Analogous to the above, but return the Uses so that they can be 53 /// modified. Unlike previous version, Condition is optional and may be null. 54 bool parseWidenableBranch(User *U, Use *&Cond, Use *&WC, BasicBlock *&IfTrueBB, 55 BasicBlock *&IfFalseBB); 56 57 // The guard condition is expected to be in form of: 58 // cond1 && cond2 && cond3 ... 59 // or in case of widenable branch: 60 // cond1 && cond2 && cond3 && widenable_contidion ... 61 // Method collects the list of checks, but skips widenable_condition. 62 void parseWidenableGuard(const User *U, llvm::SmallVectorImpl<Value *> &Checks); 63 64 // Returns widenable_condition if it exists in the expression tree rooting from 65 // \p U and has only one use. 66 Value *extractWidenableCondition(const User *U); 67 } // llvm 68 69 #endif // LLVM_ANALYSIS_GUARDUTILS_H 70