[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