[llvm-commits] [llvm] r169852 - in /llvm/trunk: include/llvm/Analysis/PtrUseVisitor.h include/llvm/Instructions.h lib/Analysis/PtrUseVisitor.cpp lib/VMCore/Instructions.cpp
Nuno Lopes
nunoplopes at sapo.pt
Tue Dec 11 11:17:50 PST 2012
This looks very similar to DataLayout::getIndexedOffset()
http://llvm.org/docs/doxygen/html/DataLayout_8cpp_source.html#l00660
This interface is much nicer, so I guess we can remove
DT::getIndexedOffset(), no?
BTW, I think you can safely use uint64_t instead of APInt. AFAIR, elsewhere
in LLVM (CodeGen, etc..) we use uint64_t as well.
Nuno
----- Original Message -----
> Author: chandlerc
> Date: Tue Dec 11 04:29:10 2012
> New Revision: 169852
>
> URL: http://llvm.org/viewvc/llvm-project?rev=169852&view=rev
> Log:
> Hoist the GEP constant address offset computation to a common home on
> the GEP instruction class.
>
> This is part of the continued refactoring and cleaning of the
> infrastructure used by SROA. This particular operation is also done in
> a few other places which I'll try to refactor to share this
> implementation.
>
> Modified:
> llvm/trunk/include/llvm/Analysis/PtrUseVisitor.h
> llvm/trunk/include/llvm/Instructions.h
> llvm/trunk/lib/Analysis/PtrUseVisitor.cpp
> llvm/trunk/lib/VMCore/Instructions.cpp
>
> Modified: llvm/trunk/include/llvm/Analysis/PtrUseVisitor.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/PtrUseVisitor.h?rev=169852&r1=169851&r2=169852&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/PtrUseVisitor.h (original)
> +++ llvm/trunk/include/llvm/Analysis/PtrUseVisitor.h Tue Dec 11 04:29:10
> 2012
> @@ -29,7 +29,6 @@
> #include "llvm/InstVisitor.h"
> #include "llvm/IntrinsicInst.h"
> #include "llvm/Support/Compiler.h"
> -#include "llvm/Support/GetElementPtrTypeIterator.h"
>
> namespace llvm {
>
>
> Modified: llvm/trunk/include/llvm/Instructions.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Instructions.h?rev=169852&r1=169851&r2=169852&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Instructions.h (original)
> +++ llvm/trunk/include/llvm/Instructions.h Tue Dec 11 04:29:10 2012
> @@ -29,9 +29,10 @@
>
> namespace llvm {
>
> +class APInt;
> class ConstantInt;
> class ConstantRange;
> -class APInt;
> +class DataLayout;
> class LLVMContext;
>
> enum AtomicOrdering {
> @@ -850,6 +851,16 @@
> /// isInBounds - Determine whether the GEP has the inbounds flag.
> bool isInBounds() const;
>
> + /// \brief Accumulate the constant address offset of this GEP if
> possible.
> + ///
> + /// This routine accepts an APInt into which it will accumulate the
> constant
> + /// offset of this GEP if the GEP is in fact constant. If the GEP is
> not
> + /// all-constant, it returns false and the value of the offset APInt is
> + /// undefined (it is *not* preserved!). The APInt passed into this
> routine
> + /// must be at least as wide as the IntPtr type for the address space
> of
> + /// the base GEP pointer.
> + bool accumulateConstantOffset(const DataLayout &DL, APInt &Offset)
> const;
> +
> // Methods for support type inquiry through isa, cast, and dyn_cast:
> static inline bool classof(const Instruction *I) {
> return (I->getOpcode() == Instruction::GetElementPtr);
>
> Modified: llvm/trunk/lib/Analysis/PtrUseVisitor.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/PtrUseVisitor.cpp?rev=169852&r1=169851&r2=169852&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/PtrUseVisitor.cpp (original)
> +++ llvm/trunk/lib/Analysis/PtrUseVisitor.cpp Tue Dec 11 04:29:10 2012
> @@ -32,27 +32,5 @@
> if (!IsOffsetKnown)
> return false;
>
> - for (gep_type_iterator GTI = gep_type_begin(GEPI), GTE =
> gep_type_end(GEPI);
> - GTI != GTE; ++GTI) {
> - ConstantInt *OpC = dyn_cast<ConstantInt>(GTI.getOperand());
> - if (!OpC)
> - return false;
> - if (OpC->isZero())
> - continue;
> -
> - // Handle a struct index, which adds its field offset to the pointer.
> - if (StructType *STy = dyn_cast<StructType>(*GTI)) {
> - unsigned ElementIdx = OpC->getZExtValue();
> - const StructLayout *SL = DL.getStructLayout(STy);
> - Offset += APInt(Offset.getBitWidth(),
> - SL->getElementOffset(ElementIdx));
> - continue;
> - }
> -
> - // For array or vector indices, scale the index by the size of the
> type.
> - APInt Index = OpC->getValue().sextOrTrunc(Offset.getBitWidth());
> - Offset += Index * APInt(Offset.getBitWidth(),
> -
> DL.getTypeAllocSize(GTI.getIndexedType()));
> - }
> - return true;
> + return GEPI.accumulateConstantOffset(DL, Offset);
> }
>
> Modified: llvm/trunk/lib/VMCore/Instructions.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Instructions.cpp?rev=169852&r1=169851&r2=169852&view=diff
> ==============================================================================
> --- llvm/trunk/lib/VMCore/Instructions.cpp (original)
> +++ llvm/trunk/lib/VMCore/Instructions.cpp Tue Dec 11 04:29:10 2012
> @@ -15,6 +15,7 @@
> #include "llvm/Instructions.h"
> #include "LLVMContextImpl.h"
> #include "llvm/Constants.h"
> +#include "llvm/DataLayout.h"
> #include "llvm/DerivedTypes.h"
> #include "llvm/Function.h"
> #include "llvm/Module.h"
> @@ -22,6 +23,7 @@
> #include "llvm/Support/CallSite.h"
> #include "llvm/Support/ConstantRange.h"
> #include "llvm/Support/ErrorHandling.h"
> +#include "llvm/Support/GetElementPtrTypeIterator.h"
> #include "llvm/Support/MathExtras.h"
> using namespace llvm;
>
> @@ -1423,6 +1425,37 @@
> return cast<GEPOperator>(this)->isInBounds();
> }
>
> +bool GetElementPtrInst::accumulateConstantOffset(const DataLayout &DL,
> + APInt &Offset) const {
> + assert(Offset.getBitWidth() ==
> + DL.getPointerSizeInBits(getPointerAddressSpace()) &&
> + "The offset must have exactly as many bits as our pointer.");
> +
> + for (gep_type_iterator GTI = gep_type_begin(this), GTE =
> gep_type_end(this);
> + GTI != GTE; ++GTI) {
> + ConstantInt *OpC = dyn_cast<ConstantInt>(GTI.getOperand());
> + if (!OpC)
> + return false;
> + if (OpC->isZero())
> + continue;
> +
> + // Handle a struct index, which adds its field offset to the pointer.
> + if (StructType *STy = dyn_cast<StructType>(*GTI)) {
> + unsigned ElementIdx = OpC->getZExtValue();
> + const StructLayout *SL = DL.getStructLayout(STy);
> + Offset += APInt(Offset.getBitWidth(),
> + SL->getElementOffset(ElementIdx));
> + continue;
> + }
> +
> + // For array or vector indices, scale the index by the size of the
> type.
> + APInt Index = OpC->getValue().sextOrTrunc(Offset.getBitWidth());
> + Offset += Index * APInt(Offset.getBitWidth(),
> + DL.getTypeAllocSize(GTI.getIndexedType()));
> + }
> + return true;
> +}
> +
> //===----------------------------------------------------------------------===//
> // ExtractElementInst Implementation
> //===----------------------------------------------------------------------===//
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list