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 *(const User *U); |
67 | } // llvm |
68 | |
69 | #endif // LLVM_ANALYSIS_GUARDUTILS_H |
70 | |