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