1//===- PtrUseVisitor.cpp - InstVisitors over a pointers uses --------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file
10/// Implementation of the pointer use visitors.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Analysis/PtrUseVisitor.h"
15#include "llvm/IR/Instruction.h"
16#include "llvm/IR/Instructions.h"
17#include <algorithm>
18
19using namespace llvm;
20
21void detail::PtrUseVisitorBase::enqueueUsers(Instruction &I) {
22  for (Use &U : I.uses()) {
23    if (VisitedUses.insert(&U).second) {
24      UseToVisit NewU = {
25        UseToVisit::UseAndIsOffsetKnownPair(&U, IsOffsetKnown),
26        Offset
27      };
28      Worklist.push_back(std::move(NewU));
29    }
30  }
31}
32
33bool detail::PtrUseVisitorBase::adjustOffsetForGEP(GetElementPtrInst &GEPI) {
34  if (!IsOffsetKnown)
35    return false;
36
37  APInt TmpOffset(DL.getIndexTypeSizeInBits(GEPI.getType()), 0);
38  if (GEPI.accumulateConstantOffset(DL, TmpOffset)) {
39    Offset += TmpOffset.sextOrTrunc(Offset.getBitWidth());
40    return true;
41  }
42
43  return false;
44}
45