|
| 1 | +//===- llvm/Analysis/ConditionCacheUtil.h -----------------------*- 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 | +// |
| 9 | +// Shared by DomConditionCache and AssumptionCache. Holds common operation of |
| 10 | +// finding values potentially affected by an assumed/branched on condition. |
| 11 | +// |
| 12 | +//===----------------------------------------------------------------------===// |
| 13 | + |
1 | 14 | #ifndef LLVM_ANALYSIS_CONDITIONCACHEUTIL_H
|
2 | 15 | #define LLVM_ANALYSIS_CONDITIONCACHEUTIL_H
|
3 | 16 |
|
| 17 | +#include "llvm/ADT/SmallVector.h" |
4 | 18 | #include "llvm/IR/PatternMatch.h"
|
5 | 19 | #include <functional>
|
6 | 20 |
|
@@ -43,65 +57,56 @@ static void findValuesAffectedByCondition(
|
43 | 57 | CmpInst::Predicate Pred;
|
44 | 58 | Value *A, *B, *X;
|
45 | 59 |
|
46 |
| - if (IsAssume) |
| 60 | + if (IsAssume) { |
47 | 61 | AddAffected(V);
|
| 62 | + if (match(V, m_Not(m_Value(X)))) |
| 63 | + AddAffected(X); |
| 64 | + } |
48 | 65 |
|
49 |
| - if (IsAssume && match(V, m_Not(m_Value(X)))) |
50 |
| - AddAffected(X); |
51 |
| - if (!IsAssume && match(V, m_LogicalOp(m_Value(A), m_Value(B)))) { |
| 66 | + if (match(V, m_LogicalOp(m_Value(A), m_Value(B)))) { |
52 | 67 | Worklist.push_back(A);
|
53 | 68 | Worklist.push_back(B);
|
54 |
| - } else if (match(V, m_Cmp(Pred, m_Value(A), m_Value(B))) && |
55 |
| - (IsAssume || isa<ICmpInst>(V))) { |
56 |
| - if (IsAssume || match(B, m_Constant())) { |
57 |
| - AddAffected(A); |
58 |
| - if (IsAssume) |
59 |
| - AddAffected(B); |
| 69 | + } else if (match(V, m_Cmp(Pred, m_Value(A), m_Value(B)))) { |
| 70 | + AddAffected(A); |
| 71 | + if (IsAssume) |
| 72 | + AddAffected(B); |
60 | 73 |
|
61 |
| - if (IsAssume ? (Pred == ICmpInst::ICMP_EQ) |
62 |
| - : ICmpInst::isEquality(Pred)) { |
63 |
| - if (match(B, m_ConstantInt())) { |
64 |
| - // (X & C) or (X | C) or (X ^ C). |
65 |
| - // (X << C) or (X >>_s C) or (X >>_u C). |
66 |
| - if (match(A, m_BitwiseLogic(m_Value(X), m_ConstantInt())) || |
67 |
| - match(A, m_Shift(m_Value(X), m_ConstantInt()))) |
68 |
| - AddAffected(X); |
69 |
| - } |
70 |
| - } else { |
71 |
| - if (Pred == ICmpInst::ICMP_NE) |
72 |
| - if (match(A, m_And(m_Value(X), m_Power2())) && match(B, m_Zero())) |
73 |
| - AddAffected(X); |
| 74 | + if (ICmpInst::isEquality(Pred)) { |
| 75 | + if (match(B, m_ConstantInt())) { |
| 76 | + // (X & C) or (X | C) or (X ^ C). |
| 77 | + // (X << C) or (X >>_s C) or (X >>_u C). |
| 78 | + if (match(A, m_BitwiseLogic(m_Value(X), m_ConstantInt())) || |
| 79 | + match(A, m_Shift(m_Value(X), m_ConstantInt()))) |
| 80 | + AddAffected(X); |
| 81 | + } |
| 82 | + } else { |
| 83 | + // Handle (A + C1) u< C2, which is the canonical form of |
| 84 | + // A > C3 && A < C4. |
| 85 | + if (match(A, m_Add(m_Value(X), m_ConstantInt())) && |
| 86 | + match(B, m_ConstantInt())) |
| 87 | + AddAffected(X); |
74 | 88 |
|
75 |
| - if (!IsAssume || Pred == ICmpInst::ICMP_ULT) { |
76 |
| - // Handle (A + C1) u< C2, which is the canonical form of |
77 |
| - // A > C3 && A < C4. |
78 |
| - if (match(A, m_Add(m_Value(X), m_ConstantInt())) && |
79 |
| - match(B, m_ConstantInt())) |
80 |
| - AddAffected(X); |
81 |
| - } |
82 |
| - if (!IsAssume) { |
83 |
| - // Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported |
84 |
| - // by computeKnownFPClass(). |
85 |
| - if ((Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGT) && |
86 |
| - match(A, m_ElementWiseBitCast(m_Value(X)))) |
87 |
| - InsertAffected(X, -1); |
88 |
| - } |
| 89 | + // Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported |
| 90 | + // by computeKnownFPClass(). |
| 91 | + if (match(A, m_ElementWiseBitCast(m_Value(X)))) { |
| 92 | + if (Pred == ICmpInst::ICMP_SLT && match(B, m_Zero())) |
| 93 | + InsertAffected(X, -1); |
| 94 | + else if (Pred == ICmpInst::ICMP_SGT && match(B, m_AllOnes())) |
| 95 | + InsertAffected(X, -1); |
| 96 | + } |
89 | 97 |
|
90 |
| - if (IsAssume && CmpInst::isFPPredicate(Pred)) { |
91 |
| - // fcmp fneg(x), y |
92 |
| - // fcmp fabs(x), y |
93 |
| - // fcmp fneg(fabs(x)), y |
94 |
| - if (match(A, m_FNeg(m_Value(A)))) |
95 |
| - AddAffected(A); |
96 |
| - if (match(A, m_FAbs(m_Value(A)))) |
97 |
| - AddAffected(A); |
98 |
| - } |
| 98 | + if (CmpInst::isFPPredicate(Pred)) { |
| 99 | + // fcmp fneg(x), y |
| 100 | + // fcmp fabs(x), y |
| 101 | + // fcmp fneg(fabs(x)), y |
| 102 | + if (match(A, m_FNeg(m_Value(A)))) |
| 103 | + AddAffected(A); |
| 104 | + if (match(A, m_FAbs(m_Value(A)))) |
| 105 | + AddAffected(A); |
99 | 106 | }
|
100 | 107 | }
|
101 |
| - } else if ((!IsAssume && |
102 |
| - match(Cond, m_FCmp(Pred, m_Value(A), m_Constant()))) || |
103 |
| - match(Cond, m_Intrinsic<Intrinsic::is_fpclass>(m_Value(A), |
104 |
| - m_Value(B)))) { |
| 108 | + } else if (match(V, m_Intrinsic<Intrinsic::is_fpclass>(m_Value(A), |
| 109 | + m_Value()))) { |
105 | 110 | // Handle patterns that computeKnownFPClass() support.
|
106 | 111 | AddAffected(A);
|
107 | 112 | }
|
|
0 commit comments