47#define DEBUG_TYPE "lazy-value-info" 
   56                "Lazy Value Information Analysis", 
false, 
true)
 
   63    "lvi-per-pred-ranges", 
cl::Hidden, 
cl::init(
false),
 
   64    cl::desc(
"Enable tracking of ranges for a value in a block for" 
   65             "each block predecessor (default = false)"));
 
   95  class LazyValueInfoCache;
 
   96  struct LVIValueHandle final : 
public CallbackVH {
 
   97    LazyValueInfoCache *Parent;
 
   99    LVIValueHandle(
Value *V, LazyValueInfoCache *
P = 
nullptr)
 
  100      : CallbackVH(
V), Parent(
P) { }
 
  102    void deleted() 
override;
 
  103    void allUsesReplacedWith(
Value *V)
 override {
 
  111using BBLatticeElementMap =
 
  113using PredecessorValueLatticeMap =
 
  118class LazyValueInfoCache {
 
  123  struct BlockCacheEntry {
 
  124    SmallDenseMap<AssertingVH<Value>, ValueLatticeElement, 4> LatticeElements;
 
  125    SmallDenseSet<AssertingVH<Value>, 4> OverDefined;
 
  128    std::optional<NonNullPointerSet> NonNullPointers;
 
  132    std::optional<PredecessorValueLatticeMap> PredecessorLatticeElements;
 
  136  DenseMap<PoisoningVH<BasicBlock>, std::unique_ptr<BlockCacheEntry>>
 
  139  DenseSet<LVIValueHandle, DenseMapInfo<Value *>> ValueHandles;
 
  141  const BlockCacheEntry *getBlockEntry(BasicBlock *BB)
 const {
 
  142    auto It = BlockCache.
find_as(BB);
 
  143    if (It == BlockCache.
end())
 
  145    return It->second.get();
 
  148  BlockCacheEntry *getOrCreateBlockEntry(BasicBlock *BB) {
 
  149    auto It = BlockCache.
find_as(BB);
 
  150    if (It == BlockCache.
end()) {
 
  151      std::unique_ptr<BlockCacheEntry> BCE =
 
  152          std::make_unique<BlockCacheEntry>();
 
  154        BCE->PredecessorLatticeElements =
 
  155            std::make_optional<PredecessorValueLatticeMap>();
 
  156      It = BlockCache.
insert({BB, std::move(BCE)}).first;
 
  159    return It->second.get();
 
  162  void addValueHandle(
Value *Val) {
 
  163    auto HandleIt = ValueHandles.
find_as(Val);
 
  164    if (HandleIt == ValueHandles.
end())
 
  165      ValueHandles.
insert({Val, 
this});
 
  169  void insertResult(
Value *Val, BasicBlock *BB,
 
  170                    const ValueLatticeElement &Result) {
 
  171    BlockCacheEntry *
Entry = getOrCreateBlockEntry(BB);
 
  175    if (
Result.isOverdefined())
 
  176      Entry->OverDefined.insert(Val);
 
  183  void insertPredecessorResults(
Value *Val, BasicBlock *BB,
 
  184                                BBLatticeElementMap &PredLatticeElements) {
 
  185    BlockCacheEntry *
Entry = getOrCreateBlockEntry(BB);
 
  187    Entry->PredecessorLatticeElements->insert({Val, PredLatticeElements});
 
  192  std::optional<BBLatticeElementMap>
 
  193  getCachedPredecessorInfo(
Value *V, BasicBlock *BB)
 const {
 
  194    const BlockCacheEntry *
Entry = getBlockEntry(BB);
 
  198    auto LatticeIt = 
Entry->PredecessorLatticeElements->find_as(V);
 
  199    if (LatticeIt == 
Entry->PredecessorLatticeElements->end())
 
  202    return LatticeIt->second;
 
  205  std::optional<ValueLatticeElement> getCachedValueInfo(
Value *V,
 
  206                                                        BasicBlock *BB)
 const {
 
  207    const BlockCacheEntry *
Entry = getBlockEntry(BB);
 
  211    if (
Entry->OverDefined.count(V))
 
  214    auto LatticeIt = 
Entry->LatticeElements.find_as(V);
 
  215    if (LatticeIt == 
Entry->LatticeElements.end())
 
  218    return LatticeIt->second;
 
  222  isNonNullAtEndOfBlock(
Value *V, BasicBlock *BB,
 
  223                        function_ref<NonNullPointerSet(BasicBlock *)> InitFn) {
 
  224    BlockCacheEntry *
Entry = getOrCreateBlockEntry(BB);
 
  225    if (!
Entry->NonNullPointers) {
 
  226      Entry->NonNullPointers = InitFn(BB);
 
  231    return Entry->NonNullPointers->count(V);
 
  237    ValueHandles.
clear();
 
  241  void eraseValue(
Value *V);
 
  245  void eraseBlock(BasicBlock *BB);
 
  250  void threadEdgeImpl(BasicBlock *OldSucc, BasicBlock *NewSucc);
 
  254void LazyValueInfoCache::eraseValue(
Value *V) {
 
  255  for (
auto &Pair : BlockCache) {
 
  256    Pair.second->LatticeElements.erase(V);
 
  257    Pair.second->OverDefined.erase(V);
 
  258    if (Pair.second->NonNullPointers)
 
  259      Pair.second->NonNullPointers->erase(V);
 
  261      Pair.second->PredecessorLatticeElements->erase(V);
 
  264  auto HandleIt = ValueHandles.
find_as(V);
 
  265  if (HandleIt != ValueHandles.
end())
 
  266    ValueHandles.
erase(HandleIt);
 
  269void LVIValueHandle::deleted() {
 
  272  Parent->eraseValue(*
this);
 
  275void LazyValueInfoCache::eraseBlock(
BasicBlock *BB) {
 
  278    for (
auto &Pair : BlockCache)
 
  279      Pair.second->PredecessorLatticeElements->clear();
 
  280  BlockCache.erase(BB);
 
  283void LazyValueInfoCache::threadEdgeImpl(
BasicBlock *OldSucc,
 
  295  std::vector<BasicBlock*> worklist;
 
  296  worklist.push_back(OldSucc);
 
  298  const BlockCacheEntry *
Entry = getBlockEntry(OldSucc);
 
  299  if (!Entry || 
Entry->OverDefined.empty())
 
  302                                      Entry->OverDefined.end());
 
  308  while (!worklist.empty()) {
 
  313    if (ToUpdate == NewSucc) 
continue;
 
  316    auto OI = BlockCache.find_as(ToUpdate);
 
  317    if (OI == BlockCache.end() || OI->second->OverDefined.empty())
 
  319    auto &ValueSet = OI->second->OverDefined;
 
  321    bool changed = 
false;
 
  322    for (
Value *V : ValsToClear) {
 
  323      if (!ValueSet.erase(V))
 
  331    if (!changed) 
continue;
 
  342  LazyValueInfoImpl *LVIImpl;
 
  348  LazyValueInfoAnnotatedWriter(LazyValueInfoImpl *L, DominatorTree &DTree)
 
  349      : LVIImpl(
L), DT(DTree) {}
 
  351  void emitBasicBlockStartAnnot(
const BasicBlock *BB,
 
  352                                formatted_raw_ostream &OS) 
override;
 
  354  void emitInstructionAnnot(
const Instruction *
I,
 
  355                            formatted_raw_ostream &OS) 
override;
 
  362  LazyValueInfoCache TheCache;
 
  374  bool pushBlockValue(
const std::pair<BasicBlock *, Value *> &BV) {
 
  375    if (!BlockValueSet.insert(BV).second)
 
  379                      << BV.first->getName() << 
"\n");
 
  380    BlockValueStack.push_back(BV);
 
  391  std::optional<ValueLatticeElement> getBlockValue(
Value *Val, 
BasicBlock *BB,
 
  401  std::optional<ValueLatticeElement> solveBlockValueImpl(
Value *Val,
 
  403  std::optional<ValueLatticeElement> solveBlockValueNonLocal(
Value *Val,
 
  405  std::optional<ValueLatticeElement> solveBlockValuePHINode(
PHINode *PN,
 
  407  std::optional<ValueLatticeElement> solveBlockValueSelect(
SelectInst *S,
 
  411  std::optional<ValueLatticeElement> solveBlockValueBinaryOpImpl(
 
  415  std::optional<ValueLatticeElement>
 
  417  std::optional<ValueLatticeElement> solveBlockValueCast(
CastInst *CI,
 
  419  std::optional<ValueLatticeElement>
 
  421  std::optional<ValueLatticeElement> solveBlockValueIntrinsic(
IntrinsicInst *
II,
 
  423  std::optional<ValueLatticeElement>
 
  425  std::optional<ValueLatticeElement>
 
  428  void intersectAssumeOrGuardBlockValueConstantRange(
Value *Val,
 
  438  std::optional<ValueLatticeElement>
 
  443  std::optional<ValueLatticeElement>
 
  444  getValueFromICmpCondition(
Value *Val, 
ICmpInst *ICI, 
bool isTrueDest,
 
  449  std::optional<ValueLatticeElement>
 
  451                        bool UseBlockValue, 
unsigned Depth = 0);
 
  453  std::optional<ValueLatticeElement> getEdgeValueLocal(
Value *Val,
 
  486    LazyValueInfoAnnotatedWriter Writer(
this, DTree);
 
  487    F.print(OS, &Writer);
 
 
  497    TheCache.eraseBlock(BB);
 
 
  506      : AC(AC), DL(DL), GuardDecl(GuardDecl) {}
 
 
 
  510void LazyValueInfoImpl::solve() {
 
  514  unsigned processedCount = 0;
 
  515  while (!BlockValueStack.empty()) {
 
  527          dbgs() << 
"Giving up on stack because we are getting too deep\n");
 
  529      while (!StartingStack.
empty()) {
 
  530        std::pair<BasicBlock *, Value *> &
e = StartingStack.
back();
 
  531        TheCache.insertResult(
e.second, 
e.first,
 
  535      BlockValueSet.clear();
 
  536      BlockValueStack.clear();
 
  539    std::pair<BasicBlock *, Value *> 
e = BlockValueStack.back();
 
  540    assert(BlockValueSet.count(e) && 
"Stack value should be in BlockValueSet!");
 
  541    unsigned StackSize = BlockValueStack.size();
 
  544    if (solveBlockValue(
e.second, 
e.first)) {
 
  546      assert(BlockValueStack.size() == StackSize &&
 
  547             BlockValueStack.back() == e && 
"Nothing should have been pushed!");
 
  549      std::optional<ValueLatticeElement> BBLV =
 
  550          TheCache.getCachedValueInfo(
e.second, 
e.first);
 
  551      assert(BBLV && 
"Result should be in cache!");
 
  553          dbgs() << 
"POP " << *
e.second << 
" in " << 
e.first->getName() << 
" = " 
  557      BlockValueStack.pop_back();
 
  558      BlockValueSet.erase(e);
 
  561      assert(BlockValueStack.size() == StackSize + 1 &&
 
  562             "Exactly one element should have been pushed!");
 
  567std::optional<ValueLatticeElement>
 
  574  if (std::optional<ValueLatticeElement> OptLatticeVal =
 
  575          TheCache.getCachedValueInfo(Val, BB)) {
 
  576    intersectAssumeOrGuardBlockValueConstantRange(Val, *OptLatticeVal, CxtI);
 
  577    return OptLatticeVal;
 
  581  if (!pushBlockValue({ BB, Val }))
 
  592  case Instruction::Call:
 
  593  case Instruction::Invoke:
 
  597  case Instruction::Load:
 
 
  611  assert(!TheCache.getCachedValueInfo(Val, BB) &&
 
  612         "Value should not be in cache");
 
  616  std::optional<ValueLatticeElement> Res = solveBlockValueImpl(Val, BB);
 
  621  TheCache.insertResult(Val, BB, *Res);
 
  625std::optional<ValueLatticeElement>
 
  629    return solveBlockValueNonLocal(Val, BB);
 
  632    return solveBlockValuePHINode(PN, BB);
 
  635    return solveBlockValueSelect(SI, BB);
 
  652      return solveBlockValueCast(CI, BB);
 
  655      return solveBlockValueBinaryOp(BO, BB);
 
  658      return solveBlockValueInsertElement(IEI, BB);
 
  661      return solveBlockValueExtractValue(EVI, BB);
 
  664      return solveBlockValueIntrinsic(
II, BB);
 
  668                    << 
"' - unknown inst def found.\n");
 
  673                              bool IsDereferenced = 
true) {
 
  675  if (
Ptr->getType()->getPointerAddressSpace() == 0)
 
  677                                 : 
Ptr->stripInBoundsOffsets());
 
 
  687    if (
MI->isVolatile()) 
return;
 
  691    if (!Len || Len->isZero()) 
return;
 
  697    for (
auto &U : CB->args()) {
 
  698      if (U->getType()->isPointerTy() &&
 
  699          CB->paramHasNonNullAttr(CB->getArgOperandNo(&U),
 
 
  706bool LazyValueInfoImpl::isNonNullAtEndOfBlock(
Value *Val, 
BasicBlock *BB) {
 
  712  return TheCache.isNonNullAtEndOfBlock(Val, BB, [](BasicBlock *BB) {
 
  713    NonNullPointerSet NonNullPointers;
 
  714    for (Instruction &
I : *BB)
 
  716    return NonNullPointers;
 
  720std::optional<ValueLatticeElement>
 
  721LazyValueInfoImpl::solveBlockValueNonLocal(
Value *Val, 
BasicBlock *BB) {
 
  722  ValueLatticeElement 
Result;  
 
  741  std::optional<BBLatticeElementMap> PredLatticeElements;
 
  743    PredLatticeElements = std::make_optional<BBLatticeElementMap>();
 
  748    std::optional<ValueLatticeElement> EdgeResult = getEdgeValue(Val, Pred, BB);
 
  753    Result.mergeIn(*EdgeResult);
 
  757    if (
Result.isOverdefined()) {
 
  759                        << 
"' - overdefined because of pred '" 
  760                        << Pred->getName() << 
"' (non local).\n");
 
  764      PredLatticeElements->insert({Pred, *EdgeResult});
 
  768    TheCache.insertPredecessorResults(Val, BB, *PredLatticeElements);
 
  775std::optional<ValueLatticeElement>
 
  777  ValueLatticeElement 
Result;  
 
  782  std::optional<BBLatticeElementMap> PredLatticeElements;
 
  784    PredLatticeElements = std::make_optional<BBLatticeElementMap>();
 
  791    std::optional<ValueLatticeElement> EdgeResult =
 
  792        getEdgeValue(PhiVal, PhiBB, BB, PN);
 
  797    Result.mergeIn(*EdgeResult);
 
  801    if (
Result.isOverdefined()) {
 
  803                        << 
"' - overdefined because of pred (local).\n");
 
  809      PredLatticeElements->insert({PhiBB, *EdgeResult});
 
  813    TheCache.insertPredecessorResults(PN, BB, *PredLatticeElements);
 
  816  assert(!
Result.isOverdefined() && 
"Possible PHI in entry block?");
 
  822void LazyValueInfoImpl::intersectAssumeOrGuardBlockValueConstantRange(
 
  829  for (
auto &AssumeVH : AC->assumptionsFor(Val)) {
 
  840    BBLV = BBLV.
intersect(*getValueFromCondition(Val, 
I->getArgOperand(0),
 
  846  if (GuardDecl && !GuardDecl->use_empty() &&
 
  848    for (Instruction &
I :
 
  863        isNonNullAtEndOfBlock(Val, BB))
 
  868std::optional<ValueLatticeElement>
 
  871  std::optional<ValueLatticeElement> OptTrueVal =
 
  872      getBlockValue(
SI->getTrueValue(), BB, SI);
 
  875  ValueLatticeElement &
TrueVal = *OptTrueVal;
 
  877  std::optional<ValueLatticeElement> OptFalseVal =
 
  878      getBlockValue(
SI->getFalseValue(), BB, SI);
 
  881  ValueLatticeElement &
FalseVal = *OptFalseVal;
 
  884    const ConstantRange &TrueCR = 
TrueVal.asConstantRange(
SI->getType());
 
  885    const ConstantRange &FalseCR = 
FalseVal.asConstantRange(
SI->getType());
 
  892        ((
LHS == 
SI->getTrueValue() && 
RHS == 
SI->getFalseValue()) ||
 
  893         (
RHS == 
SI->getTrueValue() && 
LHS == 
SI->getFalseValue()))) {
 
  894      ConstantRange ResultCR = [&]() {
 
  899          return TrueCR.
smin(FalseCR);
 
  901          return TrueCR.
umin(FalseCR);
 
  903          return TrueCR.
smax(FalseCR);
 
  905          return TrueCR.
umax(FalseCR);
 
  909          ResultCR, 
TrueVal.isConstantRangeIncludingUndef() ||
 
  910                        FalseVal.isConstantRangeIncludingUndef());
 
  914      if (
LHS == 
SI->getTrueValue())
 
  916            TrueCR.
abs(), 
TrueVal.isConstantRangeIncludingUndef());
 
  917      if (
LHS == 
SI->getFalseValue())
 
  919            FalseCR.
abs(), 
FalseVal.isConstantRangeIncludingUndef());
 
  924      if (
LHS == 
SI->getTrueValue())
 
  927      if (
LHS == 
SI->getFalseValue())
 
  941        TrueVal.intersect(*getValueFromCondition(
SI->getTrueValue(), 
Cond,
 
  945        FalseVal.intersect(*getValueFromCondition(
SI->getFalseValue(), 
Cond,
 
  954std::optional<ConstantRange>
 
  956  std::optional<ValueLatticeElement> OptVal = getBlockValue(V, BB, CxtI);
 
  959  return OptVal->asConstantRange(
V->getType());
 
  962std::optional<ValueLatticeElement>
 
  968  case Instruction::Trunc:
 
  969  case Instruction::SExt:
 
  970  case Instruction::ZExt:
 
  975                      << 
"' - overdefined (unknown cast).\n");
 
  982  std::optional<ConstantRange> LHSRes = getRangeFor(CI->
getOperand(0), CI, BB);
 
  986  const ConstantRange &LHSRange = *LHSRes;
 
  993  ConstantRange Res = ConstantRange::getEmpty(ResultBitWidth);
 
  995    Res = LHSRange.
truncate(ResultBitWidth, Trunc->getNoWrapKind());
 
 1002std::optional<ValueLatticeElement>
 
 1003LazyValueInfoImpl::solveBlockValueBinaryOpImpl(
 
 1010  auto ThreadBinOpOverSelect =
 
 1011      [&](
Value *
X, 
const ConstantRange &CRX, SelectInst *
Y,
 
 1012          bool XIsLHS) -> std::optional<ValueLatticeElement> {
 
 1017      return std::nullopt;
 
 1020      return std::nullopt;
 
 1022      return std::nullopt;
 
 1024    ConstantRange TrueX =
 
 1025        CRX.intersectWith(getValueFromCondition(
X, 
Cond, 
true,
 
 1027                              ->asConstantRange(
X->getType()));
 
 1028    ConstantRange FalseX =
 
 1029        CRX.intersectWith(getValueFromCondition(
X, 
Cond, 
false,
 
 1031                              ->asConstantRange(
X->getType()));
 
 1037          OpFn(TrueX, TrueY).unionWith(OpFn(FalseX, FalseY)));
 
 1039        OpFn(TrueY, TrueX).unionWith(OpFn(FalseY, FalseX)));
 
 1046  std::optional<ConstantRange> LHSRes = getRangeFor(
LHS, 
I, BB);
 
 1048    return std::nullopt;
 
 1052    if (
auto Res = ThreadBinOpOverSelect(
LHS, *LHSRes, SI, 
true))
 
 1056  std::optional<ConstantRange> RHSRes = getRangeFor(
RHS, 
I, BB);
 
 1058    return std::nullopt;
 
 1062    if (
auto Res = ThreadBinOpOverSelect(
RHS, *RHSRes, SI, 
false))
 
 1066  const ConstantRange &LHSRange = *LHSRes;
 
 1067  const ConstantRange &RHSRange = *RHSRes;
 
 1069  std::optional<ValueLatticeElement> MergedResult =
 
 1073    return MergedResult;
 
 1075  std::optional<BBLatticeElementMap> PredLHS =
 
 1076      TheCache.getCachedPredecessorInfo(
LHS, BB);
 
 1078    return MergedResult;
 
 1079  std::optional<BBLatticeElementMap> PredRHS =
 
 1080      TheCache.getCachedPredecessorInfo(
RHS, BB);
 
 1082    return MergedResult;
 
 1084  const BBLatticeElementMap &LHSPredMap = *PredLHS;
 
 1085  const BBLatticeElementMap &RHSPredMap = *PredRHS;
 
 1087  BBLatticeElementMap PredLatticeElements;
 
 1088  ValueLatticeElement OverallPredResult;
 
 1090    auto LHSIt = LHSPredMap.find_as(Pred);
 
 1091    if (LHSIt == LHSPredMap.end())
 
 1092      return MergedResult;
 
 1093    const ValueLatticeElement &LHSFromPred = LHSIt->second;
 
 1094    std::optional<ConstantRange> LHSFromPredRes =
 
 1096    if (!LHSFromPredRes)
 
 1097      return MergedResult;
 
 1099    auto RHSIt = RHSPredMap.find_as(Pred);
 
 1100    if (RHSIt == RHSPredMap.end())
 
 1101      return MergedResult;
 
 1102    const ValueLatticeElement &RHSFromPred = RHSIt->second;
 
 1103    std::optional<ConstantRange> RHSFromPredRes =
 
 1105    if (!RHSFromPredRes)
 
 1106      return MergedResult;
 
 1108    const ConstantRange &LHSFromPredRange = *LHSFromPredRes;
 
 1109    const ConstantRange &RHSFromPredRange = *RHSFromPredRes;
 
 1110    std::optional<ValueLatticeElement> PredResult =
 
 1113      return MergedResult;
 
 1114    if (PredResult->isOverdefined()) {
 
 1116          dbgs() << 
" pred BB '" << Pred->getName() << 
"' for BB '" 
 1118                 << 
"' overdefined. Discarding all predecessor intervals.\n");
 
 1119      return MergedResult;
 
 1121    PredLatticeElements.insert({Pred, *PredResult});
 
 1122    OverallPredResult.
mergeIn(*PredResult);
 
 1128  TheCache.insertPredecessorResults(
I, BB, PredLatticeElements);
 
 1131                    << 
" to: " << OverallPredResult << 
".\n");
 
 1134    return OverallPredResult;
 
 1137                    << OverallPredResult << 
" and  " << MergedResult << 
".\n");
 
 1138  return MergedResult->intersect(OverallPredResult);
 
 1141std::optional<ValueLatticeElement>
 
 1144         "all operands to binary operators are sized");
 
 1146    unsigned NoWrapKind = OBO->getNoWrapKind();
 
 1147    return solveBlockValueBinaryOpImpl(
 
 1149        [BO, NoWrapKind](
const ConstantRange &CR1, 
const ConstantRange &CR2) {
 
 1154  return solveBlockValueBinaryOpImpl(
 
 1155      BO, BB, [BO](
const ConstantRange &CR1, 
const ConstantRange &CR2) {
 
 1160std::optional<ValueLatticeElement>
 
 1163  return solveBlockValueBinaryOpImpl(
 
 1164      WO, BB, [WO](
const ConstantRange &CR1, 
const ConstantRange &CR2) {
 
 1169std::optional<ValueLatticeElement>
 
 1174                      << 
"' - unknown intrinsic.\n");
 
 1180    std::optional<ConstantRange> 
Range = getRangeFor(
Op, 
II, BB);
 
 1182      return std::nullopt;
 
 1191std::optional<ValueLatticeElement>
 
 1194  std::optional<ValueLatticeElement> OptEltVal =
 
 1197    return std::nullopt;
 
 1198  ValueLatticeElement &Res = *OptEltVal;
 
 1200  std::optional<ValueLatticeElement> OptVecVal =
 
 1203    return std::nullopt;
 
 1209  if (OptEltVal->isConstant())
 
 1216std::optional<ValueLatticeElement>
 
 1221      return solveBlockValueOverflowIntrinsic(WO, BB);
 
 1228    return getBlockValue(V, BB, EVI);
 
 1231                    << 
"' - overdefined (unknown extractvalue).\n");
 
 1269std::optional<ValueLatticeElement>
 
 1274                                                   bool UseBlockValue) {
 
 1278    RHSRange = ConstantRange(CI->getValue());
 
 1279  } 
else if (UseBlockValue) {
 
 1280    std::optional<ValueLatticeElement> 
R =
 
 1283      return std::nullopt;
 
 1287  ConstantRange TrueValues =
 
 1292static std::optional<ConstantRange>
 
 1295  bool Invert = 
false;
 
 1302    if (
RHS.isMaxSignedValue())
 
 1303      return std::nullopt; 
 
 1307  if (
auto CR = Fn(
RHS))
 
 1308    return Invert ? CR->inverse() : CR;
 
 1309  return std::nullopt;
 
 
 1315  unsigned BitWidth = 
RHS->getType()->getScalarSizeInBits();
 
 
 1333std::optional<ValueLatticeElement> LazyValueInfoImpl::getValueFromICmpCondition(
 
 1334    Value *Val, 
ICmpInst *ICI, 
bool isTrueDest, 
bool UseBlockValue) {
 
 1358    return getValueFromSimpleICmpCondition(EdgePred, 
RHS, 
Offset, ICI,
 
 1363    return getValueFromSimpleICmpCondition(SwappedPred, 
LHS, 
Offset, ICI,
 
 1369  const APInt *
Mask, *
C;
 
 1403  const APInt *ShAmtC;
 
 1408        EdgePred, *
C, [&](
const APInt &
RHS) -> std::optional<ConstantRange> {
 
 1409          APInt 
New = 
RHS << *ShAmtC;
 
 1410          if ((
New.ashr(*ShAmtC)) != 
RHS)
 
 1411            return std::nullopt;
 
 1479std::optional<ValueLatticeElement>
 
 1481                                         bool IsTrueDest, 
bool UseBlockValue,
 
 1484    return getValueFromICmpCondition(Val, ICI, IsTrueDest, UseBlockValue);
 
 1487    return getValueFromTrunc(Val, Trunc, IsTrueDest);
 
 1499    return getValueFromCondition(Val, 
N, !IsTrueDest, UseBlockValue, 
Depth);
 
 1510  std::optional<ValueLatticeElement> LV =
 
 1511      getValueFromCondition(Val, L, IsTrueDest, UseBlockValue, 
Depth);
 
 1513    return std::nullopt;
 
 1514  std::optional<ValueLatticeElement> RV =
 
 1515      getValueFromCondition(Val, R, IsTrueDest, UseBlockValue, 
Depth);
 
 1517    return std::nullopt;
 
 1523  if (IsTrueDest ^ IsAnd) {
 
 1528  return LV->intersect(*RV);
 
 1549                                            const APInt &OpConstVal,
 
 1564    assert((Op0Match || Op1Match) &&
 
 1565           "Operand 0 nor Operand 1 isn't a match");
 
 
 1580std::optional<ValueLatticeElement>
 
 1588    if (BI->isConditional() &&
 
 1589        BI->getSuccessor(0) != BI->getSuccessor(1)) {
 
 1590      bool isTrueDest = BI->getSuccessor(0) == BBTo;
 
 1591      assert(BI->getSuccessor(!isTrueDest) == BBTo &&
 
 1592             "BBTo isn't a successor of BBFrom");
 
 1593      Value *Condition = BI->getCondition();
 
 1598      if (Condition == Val)
 
 1604      std::optional<ValueLatticeElement> 
Result =
 
 1605          getValueFromCondition(Val, Condition, isTrueDest, UseBlockValue);
 
 1607        return std::nullopt;
 
 1609      if (!
Result->isOverdefined())
 
 1613        assert(
Result->isOverdefined() && 
"Result isn't overdefined");
 
 1627            APInt ConditionVal(1, isTrueDest ? 1 : 0);
 
 1630            ValueLatticeElement OpLatticeVal =
 
 1631                *getValueFromCondition(Usr->getOperand(0), Condition,
 
 1635              const unsigned ResultBitWidth =
 
 1636                  Usr->getType()->getScalarSizeInBits();
 
 1661            for (
unsigned i = 0; i < Usr->getNumOperands(); ++i) {
 
 1662              Value *
Op = Usr->getOperand(i);
 
 1663              ValueLatticeElement OpLatticeVal = *getValueFromCondition(
 
 1664                  Op, Condition, isTrueDest,  
false);
 
 1665              if (std::optional<APInt> OpConst =
 
 1674      if (!
Result->isOverdefined())
 
 1682    Value *Condition = 
SI->getCondition();
 
 1685    bool ValUsesConditionAndMayBeFoldable = 
false;
 
 1686    if (Condition != Val) {
 
 1691      if (!ValUsesConditionAndMayBeFoldable)
 
 1694    assert((Condition == Val || ValUsesConditionAndMayBeFoldable) &&
 
 1695           "Condition != Val nor Val doesn't use Condition");
 
 1697    bool DefaultCase = 
SI->getDefaultDest() == BBTo;
 
 1699    ConstantRange EdgesVals(
BitWidth, DefaultCase);
 
 1701    for (
auto Case : 
SI->cases()) {
 
 1702      APInt CaseValue = Case.getCaseValue()->getValue();
 
 1703      ConstantRange EdgeVal(CaseValue);
 
 1704      if (ValUsesConditionAndMayBeFoldable) {
 
 1707        ValueLatticeElement EdgeLatticeVal =
 
 1720        if (Case.getCaseSuccessor() != BBTo && Condition == Val)
 
 1721          EdgesVals = EdgesVals.difference(EdgeVal);
 
 1722      } 
else if (Case.getCaseSuccessor() == BBTo)
 
 1723        EdgesVals = EdgesVals.unionWith(EdgeVal);
 
 1732std::optional<ValueLatticeElement>
 
 1739  std::optional<ValueLatticeElement> LocalResult =
 
 1740      getEdgeValueLocal(Val, BBFrom, BBTo,  
true);
 
 1742    return std::nullopt;
 
 1748  std::optional<ValueLatticeElement> OptInBlock =
 
 1751    return std::nullopt;
 
 1752  ValueLatticeElement &
InBlock = *OptInBlock;
 
 1762  intersectAssumeOrGuardBlockValueConstantRange(Val, 
InBlock, CxtI);
 
 1764  return LocalResult->intersect(
InBlock);
 
 1769  LLVM_DEBUG(
dbgs() << 
"LVI Getting block end value " << *V << 
" at '" 
 1772  assert(BlockValueStack.empty() && BlockValueSet.empty());
 
 1773  std::optional<ValueLatticeElement> OptResult = getBlockValue(V, BB, CxtI);
 
 1776    OptResult = getBlockValue(V, BB, CxtI);
 
 1777    assert(OptResult && 
"Value not available after solving");
 
 
 1794  intersectAssumeOrGuardBlockValueConstantRange(V, Result, CxtI);
 
 
 1803  LLVM_DEBUG(
dbgs() << 
"LVI Getting edge value " << *V << 
" from '" 
 1807  std::optional<ValueLatticeElement> Result =
 
 1808      getEdgeValue(V, FromBB, ToBB, CxtI);
 
 1814    Result = getEdgeValue(V, FromBB, ToBB, CxtI);
 
 
 1828  const Use *CurrU = &U;
 
 1830  const unsigned MaxUsesToInspect = 3;
 
 1831  for (
unsigned I = 0; 
I < MaxUsesToInspect; ++
I) {
 
 1832    std::optional<ValueLatticeElement> CondVal;
 
 1839      if (CurrU->getOperandNo() == 1)
 
 1841            *getValueFromCondition(V, 
SI->getCondition(),  
true,
 
 1843      else if (CurrU->getOperandNo() == 2)
 
 1845            *getValueFromCondition(V, 
SI->getCondition(),  
false,
 
 1849      CondVal = *getEdgeValueLocal(V, 
PHI->getIncomingBlock(*CurrU),
 
 1850                                   PHI->getParent(),  
false);
 
 1864    if (!CurrI->hasOneUse() ||
 
 
 1875  TheCache.threadEdgeImpl(OldSucc, NewSucc);
 
 
 1885  if (
auto *Impl = Info.getImpl())
 
 
 1903    assert(M && 
"getCache() called with a null Module");
 
 1918  if (
auto *Impl = getImpl()) {
 
 
 1925                               FunctionAnalysisManager::Invalidator &Inv) {
 
 
 1951  V = V->stripPointerCasts();
 
 
 1965      getOrCreateImpl(BB->
getModule()).getValueInBlock(V, BB, CxtI);
 
 1967  if (Result.isConstant())
 
 1968    return Result.getConstant();
 
 1969  if (Result.isConstantRange()) {
 
 1972      return ConstantInt::get(V->getType(), *SingleVal);
 
 
 1978                                              bool UndefAllowed) {
 
 1981      getOrCreateImpl(BB->
getModule()).getValueInBlock(V, BB, CxtI);
 
 1982  return Result.asConstantRange(V->getType(), UndefAllowed);
 
 
 1986                                                   bool UndefAllowed) {
 
 1989      getOrCreateImpl(Inst->getModule()).getValueAtUse(U);
 
 1990  return Result.asConstantRange(U->getType(), UndefAllowed);
 
 
 2000      getOrCreateImpl(M).getValueOnEdge(V, FromBB, ToBB, CxtI);
 
 2002  if (Result.isConstant())
 
 2003    return Result.getConstant();
 
 2004  if (Result.isConstantRange()) {
 
 2007      return ConstantInt::get(V->getType(), *SingleVal);
 
 
 2018      getOrCreateImpl(M).getValueOnEdge(V, FromBB, ToBB, CxtI);
 
 2020  return Result.asConstantRange(V->getType(),  
true);
 
 
 2071      getOrCreateImpl(M).getValueOnEdge(V, FromBB, ToBB, CxtI);
 
 
 2078                                        bool UseBlockValue) {
 
 2085  if (V->getType()->isPointerTy() && 
C->isNullValue() &&
 
 2094  auto &Impl = getOrCreateImpl(M);
 
 2096      UseBlockValue ? Impl.getValueInBlock(V, CxtI->
getParent(), CxtI)
 
 2097                    : Impl.getValueAt(V, CxtI);
 
 2137    if (
PHI->getParent() == BB) {
 
 2139      for (
unsigned i = 0, e = 
PHI->getNumIncomingValues(); i < e; i++) {
 
 2148        Baseline = (i == 0) ? Result 
 
 2149                            : (Baseline == Result ? Baseline
 
 2168      while (++PI != PE) {
 
 2170        if (Ret != Baseline)
 
 
 2185                                        bool UseBlockValue) {
 
 2195  if (UseBlockValue) {
 
 2198        getOrCreateImpl(M).getValueInBlock(LHS, CxtI->
getParent(), CxtI);
 
 2199    if (L.isOverdefined())
 
 2203        getOrCreateImpl(M).getValueInBlock(RHS, CxtI->
getParent(), CxtI);
 
 2205    return L.getCompare(Pred, Ty, R, M->getDataLayout());
 
 
 2212  if (
auto *Impl = getImpl())
 
 2213    Impl->threadEdge(PredBB, OldSucc, NewSucc);
 
 
 2217  if (
auto *Impl = getImpl())
 
 2218    Impl->forgetValue(V);
 
 
 2222  if (
auto *Impl = getImpl())
 
 2223    Impl->eraseBlock(BB);
 
 
 2227  if (
auto *Impl = getImpl())
 
 
 2232  if (
auto *Impl = getImpl())
 
 2233    Impl->printLVI(
F, DTree, OS);
 
 
 2237void LazyValueInfoAnnotatedWriter::emitBasicBlockStartAnnot(
 
 2241  for (
const auto &Arg : 
F->args()) {
 
 2244    if (Result.isUnknown())
 
 2246    OS << 
"; LatticeVal for: '" << Arg << 
"' is: " << Result << 
"\n";
 
 2254void LazyValueInfoAnnotatedWriter::emitInstructionAnnot(
 
 2255    const Instruction *
I, formatted_raw_ostream &OS) {
 
 2258  SmallPtrSet<const BasicBlock*, 16> BlocksContainingLVI;
 
 2264  auto printResult = [&](
const BasicBlock *BB) {
 
 2265    if (!BlocksContainingLVI.
insert(BB).second)
 
 2269      OS << 
"; LatticeVal for: '" << *
I << 
"' in BB: '";
 
 2271      OS << 
"' is: " << 
Result << 
"\n";
 
 2274  printResult(ParentBB);
 
 2277  for (
const auto *BBSucc : 
successors(ParentBB))
 
 2279      printResult(BBSucc);
 
 2282  for (
const auto *U : 
I->users())
 
 2285        printResult(UseI->getParent());
 
 2291  OS << 
"LVI for function '" << 
F.getName() << 
"':\n";
 
 2294  LVI.printLVI(
F, DTree, OS);
 
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
 
static const Function * getParent(const Value *V)
 
This file contains the declarations for the subclasses of Constant, which represent the different fla...
 
This file defines the DenseSet and SmallDenseSet classes.
 
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
 
Module.h This file contains the declarations for the Module class.
 
static bool isOperationFoldable(User *Usr)
 
static void AddNonNullPointer(Value *Ptr, NonNullPointerSet &PtrSet, bool IsDereferenced=true)
 
static void AddNonNullPointersByInstruction(Instruction *I, NonNullPointerSet &PtrSet)
 
static std::optional< ConstantRange > getRangeViaSLT(CmpInst::Predicate Pred, APInt RHS, function_ref< std::optional< ConstantRange >(const APInt &)> Fn)
 
static const unsigned MaxProcessedPerValue
 
static ValueLatticeElement getValueFromICmpCtpop(ICmpInst::Predicate Pred, Value *RHS)
Get value range for a "ctpop(Val) Pred RHS" condition.
 
static bool usesOperand(User *Usr, Value *Op)
 
static ValueLatticeElement constantFoldUser(User *Usr, Value *Op, const APInt &OpConstVal, const DataLayout &DL)
 
static ValueLatticeElement getFromRangeMetadata(Instruction *BBI)
 
lazy value Lazy Value Information static true cl::opt< bool > PerPredRanges("lvi-per-pred-ranges", cl::Hidden, cl::init(false), cl::desc("Enable tracking of ranges for a value in a block for" "each block predecessor (default = false)"))
 
static Constant * getPredicateResult(CmpInst::Predicate Pred, Constant *C, const ValueLatticeElement &Val, const DataLayout &DL)
 
static ValueLatticeElement getValueFromOverflowCondition(Value *Val, WithOverflowInst *WO, bool IsTrueDest)
 
static bool isKnownNonConstant(Value *V)
Returns true if we can statically tell that this value will never be a "useful" constant.
 
static bool matchICmpOperand(APInt &Offset, Value *LHS, Value *Val, ICmpInst::Predicate Pred)
 
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
 
uint64_t IntrinsicInst * II
 
FunctionAnalysisManager FAM
 
#define INITIALIZE_PASS_DEPENDENCY(depName)
 
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
 
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
 
const SmallVectorImpl< MachineOperand > & Cond
 
static bool InBlock(const Value *V, const BasicBlock *BB)
 
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
 
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
 
static std::optional< unsigned > getOpcode(ArrayRef< VPValue * > Values)
Returns the opcode of Values or ~0 if they do not all agree.
 
Class for arbitrary precision integers.
 
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
 
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
 
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
 
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
 
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
 
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
 
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
 
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
 
Represent the analysis usage information of a pass.
 
AnalysisUsage & addRequired()
 
void setPreservesAll()
Set by analyses that do not transform their input at all.
 
This class represents an incoming formal argument to a Function.
 
A function analysis which provides an AssumptionCache.
 
An immutable pass that tracks lazily created AssumptionCache objects.
 
A cache of @llvm.assume calls within a function.
 
LLVM Basic Block Representation.
 
iterator begin()
Instruction iterator methods.
 
const Function * getParent() const
Return the enclosing method, or null if none.
 
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
 
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
 
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
 
LLVM_ABI const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
 
LLVM_ABI unsigned getNoWrapKind() const
Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
 
LLVM_ABI Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
 
BinaryOps getOpcode() const
 
Value handle with callbacks on RAUW and destruction.
 
This is the base class for all instructions that perform data casts.
 
Instruction::CastOps getOpcode() const
Return the opcode of this CastInst.
 
Type * getDestTy() const
Return the destination type, as a convenience.
 
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
 
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
 
@ ICMP_SLT
signed less than
 
@ ICMP_SLE
signed less or equal
 
@ ICMP_UGE
unsigned greater or equal
 
@ ICMP_UGT
unsigned greater than
 
@ ICMP_SGT
signed greater than
 
@ ICMP_ULT
unsigned less than
 
@ ICMP_SGE
signed greater or equal
 
@ ICMP_ULE
unsigned less or equal
 
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
 
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
 
Predicate getPredicate() const
Return the predicate for this instruction.
 
This is the shared class of boolean and integer constants.
 
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
 
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
 
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
 
This class represents a range of values.
 
LLVM_ABI ConstantRange subtract(const APInt &CI) const
Subtract the specified constant from the endpoints of this constant range.
 
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
 
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
 
LLVM_ABI ConstantRange castOp(Instruction::CastOps CastOp, uint32_t BitWidth) const
Return a new range representing the possible values resulting from an application of the specified ca...
 
LLVM_ABI ConstantRange umin(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned minimum of a value in ...
 
LLVM_ABI APInt getUnsignedMin() const
Return the smallest unsigned value contained in the ConstantRange.
 
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
 
static LLVM_ABI ConstantRange intrinsic(Intrinsic::ID IntrinsicID, ArrayRef< ConstantRange > Ops)
Compute range of intrinsic result for the given operand ranges.
 
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
 
LLVM_ABI ConstantRange abs(bool IntMinIsPoison=false) const
Calculate absolute value range.
 
static LLVM_ABI bool isIntrinsicSupported(Intrinsic::ID IntrinsicID)
Returns true if ConstantRange calculations are supported for intrinsic with IntrinsicID.
 
LLVM_ABI ConstantRange overflowingBinaryOp(Instruction::BinaryOps BinOp, const ConstantRange &Other, unsigned NoWrapKind) const
Return a new range representing the possible values resulting from an application of the specified ov...
 
bool isSingleElement() const
Return true if this set contains exactly one member.
 
LLVM_ABI ConstantRange truncate(uint32_t BitWidth, unsigned NoWrapKind=0) const
Return a new range in the specified integer type, which must be strictly smaller than the current typ...
 
LLVM_ABI ConstantRange umax(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned maximum of a value in ...
 
static LLVM_ABI ConstantRange makeAllowedICmpRegion(CmpInst::Predicate Pred, const ConstantRange &Other)
Produce the smallest range such that all values that may satisfy the given predicate with any value c...
 
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
 
LLVM_ABI ConstantRange inverse() const
Return a new range that is the logical not of the current set.
 
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
 
static LLVM_ABI ConstantRange makeMaskNotEqualRange(const APInt &Mask, const APInt &C)
Initialize a range containing all values X that satisfy (X & Mask) / != C.
 
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
 
LLVM_ABI ConstantRange smin(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed minimum of a value in thi...
 
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
 
LLVM_ABI ConstantRange smax(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed maximum of a value in thi...
 
LLVM_ABI ConstantRange binaryOp(Instruction::BinaryOps BinOp, const ConstantRange &Other) const
Return a new range representing the possible values resulting from an application of the specified bi...
 
static LLVM_ABI ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
 
This is an important base class in LLVM.
 
static LLVM_ABI Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
 
LLVM_ABI ConstantRange toConstantRange() const
Convert constant to an approximate constant range.
 
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
 
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
 
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
 
A parsed version of the target data layout string in and methods for querying it.
 
iterator find_as(const LookupKeyT &Val)
Alternate version of find() which allows a different, and possibly less expensive,...
 
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
 
Implements a dense probed hash-table based set.
 
Analysis pass which computes a DominatorTree.
 
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
 
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
 
FunctionPass class - This class is used to implement most global optimizations.
 
Module * getParent()
Get the module that this global value is contained inside of...
 
This instruction compares its operands according to the predicate given to the constructor.
 
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
 
This instruction inserts a single (scalar) element into a VectorType value.
 
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
 
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
 
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
 
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
 
A wrapper class for inspecting calls to intrinsic functions.
 
Analysis to compute lazy value information.
 
Result run(Function &F, FunctionAnalysisManager &FAM)
 
ValueLatticeElement getValueOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
This is the query interface to determine the lattice value for the specified Value* that is true on t...
 
ValueLatticeElement getValueAt(Value *V, Instruction *CxtI)
This is the query interface to determine the lattice value for the specified Value* at the specified ...
 
void threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc, BasicBlock *NewSucc)
This is the update interface to inform the cache that an edge from PredBB to OldSucc has been threade...
 
void printLVI(Function &F, DominatorTree &DTree, raw_ostream &OS)
Printing the LazyValueInfo Analysis.
 
void forgetValue(Value *V)
This is part of the update interface to remove information related to this value from the cache.
 
void eraseBlock(BasicBlock *BB)
This is part of the update interface to inform the cache that a block has been deleted.
 
void clear()
Complete flush all previously computed values.
 
LazyValueInfoImpl(AssumptionCache *AC, const DataLayout &DL, Function *GuardDecl)
 
ValueLatticeElement getValueInBlock(Value *V, BasicBlock *BB, Instruction *CxtI=nullptr)
This is the query interface to determine the lattice value for the specified Value* at the context in...
 
ValueLatticeElement getValueAtUse(const Use &U)
 
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
 
Wrapper around LazyValueInfo.
 
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
 
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
 
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
 
LazyValueInfoWrapperPass()
 
This pass computes, caches, and vends lazy value constraint information.
 
void eraseBlock(BasicBlock *BB)
Inform the analysis cache that we have erased a block.
 
ConstantRange getConstantRangeAtUse(const Use &U, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the value at a specific use-site.
 
ConstantRange getConstantRange(Value *V, Instruction *CxtI, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the specified value at the specified in...
 
void threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc, BasicBlock *NewSucc)
Inform the analysis cache that we have threaded an edge from PredBB to OldSucc to be from PredBB to N...
 
Constant * getPredicateOnEdge(CmpInst::Predicate Pred, Value *V, Constant *C, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Determine whether the specified value comparison with a constant is known to be true or false on the ...
 
Constant * getConstantOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Determine whether the specified value is known to be a constant on the specified edge.
 
ConstantRange getConstantRangeOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Return the ConstantRage constraint that is known to hold for the specified value on the specified edg...
 
Constant * getConstant(Value *V, Instruction *CxtI)
Determine whether the specified value is known to be a constant at the specified instruction.
 
void printLVI(Function &F, DominatorTree &DTree, raw_ostream &OS)
Print the \LazyValueInfo Analysis.
 
void forgetValue(Value *V)
Remove information related to this value from the cache.
 
void clear()
Complete flush all previously computed values.
 
Constant * getPredicateAt(CmpInst::Predicate Pred, Value *V, Constant *C, Instruction *CxtI, bool UseBlockValue)
Determine whether the specified value comparison with a constant is known to be true or false at the ...
 
bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
Handle invalidation events in the new pass manager.
 
An instruction for reading from memory.
 
This is the common base class for memset/memcpy/memmove.
 
This class wraps the llvm.memcpy/memmove intrinsics.
 
A Module instance is used to store all the information related to an LLVM module.
 
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
 
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
 
unsigned getNumIncomingValues() const
Return the number of incoming edges.
 
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
 
A set of analyses that are preserved following a run of a transformation pass.
 
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
 
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
 
This class represents the LLVM 'select' instruction.
 
Implements a dense probed hash-table based set with some number of buckets stored inline.
 
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
 
void push_back(const T &Elt)
 
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
 
An instruction for storing to memory.
 
This class represents a truncation of integer types.
 
unsigned getNoWrapKind() const
Returns the no-wrap kind of the operation.
 
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
 
The instances of the Type class are immutable: once they are created, they are never changed.
 
LLVM_ABI unsigned getIntegerBitWidth() const
 
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
 
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
 
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
 
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
 
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
 
bool isIntegerTy() const
True if this is an instance of IntegerType.
 
A Use represents the edge between a Value definition and its users.
 
Value * getOperand(unsigned i) const
 
This class represents lattice values for constants.
 
static ValueLatticeElement getRange(ConstantRange CR, bool MayIncludeUndef=false)
 
bool isOverdefined() const
 
static ValueLatticeElement getNot(Constant *C)
 
ConstantRange asConstantRange(unsigned BW, bool UndefAllowed=false) const
 
bool isNotConstant() const
 
std::optional< APInt > asConstantInteger() const
 
const ConstantRange & getConstantRange(bool UndefAllowed=true) const
Returns the constant range for this value.
 
bool isConstantRange(bool UndefAllowed=true) const
Returns true if this value is a constant range.
 
static ValueLatticeElement get(Constant *C)
 
Constant * getNotConstant() const
 
LLVM_ABI ValueLatticeElement intersect(const ValueLatticeElement &Other) const
Combine two sets of facts about the same value into a single set of facts.
 
Constant * getConstant() const
 
bool mergeIn(const ValueLatticeElement &RHS, MergeOptions Opts=MergeOptions())
Updates this object to approximate both this object and RHS.
 
static ValueLatticeElement getOverdefined()
 
LLVM Value Representation.
 
Type * getType() const
All values are typed, get the type of this value.
 
LLVM_ABI const Value * stripInBoundsOffsets(function_ref< void(const Value *)> Func=[](const Value *) {}) const
Strip off pointer casts and inbounds GEPs.
 
LLVM_ABI void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
 
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
 
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
 
Represents an op.with.overflow intrinsic.
 
std::pair< iterator, bool > insert(const ValueT &V)
 
iterator find_as(const LookupKeyT &Val)
Alternative version of find() which allows a different, and possibly less expensive,...
 
bool erase(const ValueT &V)
 
An efficient, type-erasing, non-owning reference to a callable.
 
const ParentTy * getParent() const
 
self_iterator getIterator()
 
This class implements an extremely fast bulk output stream that can only output to a stream.
 
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
 
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
 
@ C
The default llvm calling convention, compatible with C.
 
@ BasicBlock
Various leaf nodes.
 
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
 
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
 
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
 
PtrToIntSameSize_match< OpTy > m_PtrToIntSameSize(const DataLayout &DL, const OpTy &Op)
 
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
 
BinaryOp_match< LHS, RHS, Instruction::URem > m_URem(const LHS &L, const RHS &R)
 
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
 
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
 
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
 
bool match(Val *V, const Pattern &P)
 
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
 
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
 
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
 
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
 
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
 
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
 
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
 
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
 
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
 
This namespace contains all of the command line option processing machinery.
 
@ User
could "use" a pointer
 
friend class Instruction
Iterator for Instructions in a `BasicBlock.
 
This is an optimization pass for GlobalISel generic memory operations.
 
FunctionAddr VTableAddr Value
 
LLVM_ABI bool isValidAssumeForContext(const Instruction *I, const Instruction *CxtI, const DominatorTree *DT=nullptr, bool AllowEphemerals=false)
Return true if it is valid to use the assumptions provided by an assume intrinsic,...
 
auto pred_end(const MachineBasicBlock *BB)
 
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
 
auto successors(const MachineBasicBlock *BB)
 
static ConstantRange getRange(Value *Op, SCCPSolver &Solver, const SmallPtrSetImpl< Value * > &InsertedValues)
Helper for getting ranges from Solver.
 
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
 
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
 
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Instruction *I=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
 
LLVM_ABI bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
 
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
 
LLVM_ABI Value * simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty, const SimplifyQuery &Q)
Given operands for a CastInst, fold the result or return null.
 
LLVM_ABI FunctionPass * createLazyValueInfoPass()
createLazyValueInfoPass - This creates an instance of the LazyValueInfo pass.
 
auto dyn_cast_or_null(const Y &Val)
 
constexpr unsigned MaxAnalysisRecursionDepth
 
@ SPF_ABS
Floating point maxnum.
 
@ SPF_NABS
Absolute value.
 
@ SPF_UMIN
Signed minimum.
 
@ SPF_UMAX
Signed maximum.
 
@ SPF_SMAX
Unsigned minimum.
 
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
 
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
 
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
 
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
 
LLVM_ABI Value * simplifyExtractValueInst(Value *Agg, ArrayRef< unsigned > Idxs, const SimplifyQuery &Q)
Given operands for an ExtractValueInst, fold the result or return null.
 
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
 
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
 
DWARFExpression::Operation Op
 
bool isSafeToSpeculativelyExecuteWithVariableReplaced(const Instruction *I, bool IgnoreUBImplyingAttrs=true)
Don't use information from its non-constant operands.
 
PredIterator< BasicBlock, Value::user_iterator > pred_iterator
 
static bool hasSingleValue(const ValueLatticeElement &Val)
 
constexpr unsigned BitWidth
 
auto pred_begin(const MachineBasicBlock *BB)
 
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
 
auto predecessors(const MachineBasicBlock *BB)
 
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
 
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
 
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
 
A special type used by analysis passes to provide an address that identifies that particular analysis...
 
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...
 
SelectPatternFlavor Flavor
 
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?