blob: b48e86ea6e203a5b36de43e181fe25b82526f1b7 [file] [log] [blame]
Chandler Carruthed90ed02012-12-10 08:28:39 +00001//===- PtrUseVisitor.cpp - InstVisitors over a pointers uses --------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9/// \file
10/// Implementation of the pointer use visitors.
11///
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Analysis/PtrUseVisitor.h"
15
16using namespace llvm;
17
18void detail::PtrUseVisitorBase::enqueueUsers(Instruction &I) {
19 for (Value::use_iterator UI = I.use_begin(), UE = I.use_end();
20 UI != UE; ++UI) {
21 if (VisitedUses.insert(&UI.getUse())) {
22 UseToVisit NewU = {
23 UseToVisit::UseAndIsOffsetKnownPair(&UI.getUse(), IsOffsetKnown),
24 Offset
25 };
26 Worklist.push_back(llvm_move(NewU));
27 }
28 }
29}
30
31bool detail::PtrUseVisitorBase::adjustOffsetForGEP(GetElementPtrInst &GEPI) {
32 if (!IsOffsetKnown)
33 return false;
34
35 for (gep_type_iterator GTI = gep_type_begin(GEPI), GTE = gep_type_end(GEPI);
36 GTI != GTE; ++GTI) {
37 ConstantInt *OpC = dyn_cast<ConstantInt>(GTI.getOperand());
38 if (!OpC)
39 return false;
40 if (OpC->isZero())
41 continue;
42
43 // Handle a struct index, which adds its field offset to the pointer.
44 if (StructType *STy = dyn_cast<StructType>(*GTI)) {
45 unsigned ElementIdx = OpC->getZExtValue();
46 const StructLayout *SL = DL.getStructLayout(STy);
47 Offset += APInt(Offset.getBitWidth(),
48 SL->getElementOffset(ElementIdx));
49 continue;
50 }
51
52 // For array or vector indices, scale the index by the size of the type.
53 APInt Index = OpC->getValue().sextOrTrunc(Offset.getBitWidth());
54 Offset += Index * APInt(Offset.getBitWidth(),
55 DL.getTypeAllocSize(GTI.getIndexedType()));
56 }
57 return true;
58}