1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===- ValueLattice.h - Value constraint analysis ---------------*- C++ -*-===//
2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//                     The LLVM Compiler Infrastructure
4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source
6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details.
7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===//
9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_ANALYSIS_VALUELATTICE_H
11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_ANALYSIS_VALUELATTICE_H
12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/ConstantRange.h"
14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/Constants.h"
15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===//
17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//                               ValueLatticeElement
18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===//
19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// This class represents lattice values for constants.
21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// FIXME: This is basically just for bringup, this can be made a lot more rich
23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// in the future.
24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace llvm {
27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ValueLatticeElement {
28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum ValueLatticeElementTy {
29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// This Value has no known value yet.  As a result, this implies the
30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// producing instruction is dead.  Caution: We use this as the starting
31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// state in our local meet rules.  In this usage, it's taken to mean
32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// "nothing known yet".
33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    undefined,
34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// This Value has a specific constant value.  (For constant integers,
36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// constantrange is used instead.  Integer typed constantexprs can appear
37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// as constant.)
38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    constant,
39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// This Value is known to not have the specified value.  (For constant
41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// integers, constantrange is used instead.  As above, integer typed
42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// constantexprs can appear here.)
43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    notconstant,
44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// The Value falls within this range. (Used only for integer typed values.)
46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    constantrange,
47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// We can not precisely model the dynamic values this value might take.
49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    overdefined
50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// Val: This stores the current lattice value along with the Constant* for
53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// the constant if this is a 'constant' or 'notconstant' value.
54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ValueLatticeElementTy Tag;
55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Constant *Val;
56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConstantRange Range;
57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ValueLatticeElement() : Tag(undefined), Val(nullptr), Range(1, true) {}
60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ValueLatticeElement get(Constant *C) {
62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    ValueLatticeElement Res;
63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!isa<UndefValue>(C))
64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Res.markConstant(C);
65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return Res;
66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ValueLatticeElement getNot(Constant *C) {
68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    ValueLatticeElement Res;
69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!isa<UndefValue>(C))
70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Res.markNotConstant(C);
71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return Res;
72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ValueLatticeElement getRange(ConstantRange CR) {
74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    ValueLatticeElement Res;
75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Res.markConstantRange(std::move(CR));
76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return Res;
77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ValueLatticeElement getOverdefined() {
79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    ValueLatticeElement Res;
80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Res.markOverdefined();
81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return Res;
82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isUndefined() const { return Tag == undefined; }
85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isConstant() const { return Tag == constant; }
86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isNotConstant() const { return Tag == notconstant; }
87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isConstantRange() const { return Tag == constantrange; }
88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isOverdefined() const { return Tag == overdefined; }
89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Constant *getConstant() const {
91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(isConstant() && "Cannot get the constant of a non-constant!");
92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return Val;
93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Constant *getNotConstant() const {
96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(isNotConstant() && "Cannot get the constant of a non-notconstant!");
97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return Val;
98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const ConstantRange &getConstantRange() const {
101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(isConstantRange() &&
102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot           "Cannot get the constant-range of a non-constant-range!");
103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return Range;
104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Optional<APInt> asConstantInteger() const {
107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (isConstant() && isa<ConstantInt>(Val)) {
108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return cast<ConstantInt>(Val)->getValue();
109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    } else if (isConstantRange() && Range.isSingleElement()) {
110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return *Range.getSingleElement();
111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return None;
113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void markOverdefined() {
117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (isOverdefined())
118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return;
119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Tag = overdefined;
120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void markConstant(Constant *V) {
123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(V && "Marking constant with NULL");
124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      markConstantRange(ConstantRange(CI->getValue()));
126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return;
127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (isa<UndefValue>(V))
129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return;
130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert((!isConstant() || getConstant() == V) &&
132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot           "Marking constant with different value");
133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(isUndefined());
134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Tag = constant;
135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Val = V;
136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void markNotConstant(Constant *V) {
139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(V && "Marking constant with NULL");
140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      markConstantRange(ConstantRange(CI->getValue() + 1, CI->getValue()));
142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return;
143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (isa<UndefValue>(V))
145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return;
146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert((!isConstant() || getConstant() != V) &&
148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot           "Marking constant !constant with same value");
149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert((!isNotConstant() || getNotConstant() == V) &&
150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot           "Marking !constant with different value");
151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(isUndefined() || isConstant());
152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Tag = notconstant;
153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Val = V;
154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void markConstantRange(ConstantRange NewR) {
157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (isConstantRange()) {
158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (NewR.isEmptySet())
159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        markOverdefined();
160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      else {
161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        Range = std::move(NewR);
162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      }
163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return;
164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(isUndefined());
167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (NewR.isEmptySet())
168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      markOverdefined();
169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    else {
170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Tag = constantrange;
171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Range = std::move(NewR);
172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// Updates this object to approximate both this object and RHS. Returns
177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// true if this object has been changed.
178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool mergeIn(const ValueLatticeElement &RHS, const DataLayout &DL) {
179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (RHS.isUndefined() || isOverdefined())
180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return false;
181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (RHS.isOverdefined()) {
182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      markOverdefined();
183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (isUndefined()) {
187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      *this = RHS;
188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return !RHS.isUndefined();
189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (isConstant()) {
192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (RHS.isConstant() && Val == RHS.Val)
193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        return false;
194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      markOverdefined();
195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (isNotConstant()) {
199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (RHS.isNotConstant() && Val == RHS.Val)
200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        return false;
201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      markOverdefined();
202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(isConstantRange() && "New ValueLattice type?");
206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!RHS.isConstantRange()) {
207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      // We can get here if we've encountered a constantexpr of integer type
208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      // and merge it with a constantrange.
209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      markOverdefined();
210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    ConstantRange NewR = Range.unionWith(RHS.getConstantRange());
213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (NewR.isFullSet())
214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      markOverdefined();
215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    else
216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      markConstantRange(std::move(NewR));
217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return true;
218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConstantInt *getConstantInt() const {
221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(isConstant() && isa<ConstantInt>(getConstant()) &&
222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot           "No integer constant");
223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return cast<ConstantInt>(getConstant());
224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool satisfiesPredicate(CmpInst::Predicate Pred,
227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                          const ValueLatticeElement &Other) const {
228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    // TODO: share with LVI getPredicateResult.
229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (isUndefined() || Other.isUndefined())
231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (isConstant() && Other.isConstant() && Pred == CmpInst::FCMP_OEQ)
234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return getConstant() == Other.getConstant();
235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    // Integer constants are represented as ConstantRanges with single
237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    // elements.
238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!isConstantRange() || !Other.isConstantRange())
239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return false;
240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    const auto &CR = getConstantRange();
242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    const auto &OtherCR = Other.getConstantRange();
243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return ConstantRange::makeSatisfyingICmpRegion(Pred, OtherCR).contains(CR);
244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotraw_ostream &operator<<(raw_ostream &OS, const ValueLatticeElement &Val);
248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namespace llvm
250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif
251