[llvm-commits] [llvm] r71252 - in /llvm/trunk: include/llvm/Analysis/ScalarEvolution.h lib/Analysis/ScalarEvolution.cpp

Bill Wendling isanbard at gmail.com
Fri May 8 13:35:32 PDT 2009


Hi Dan,

I'm getting these errors with this patch:

/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm.src/lib/Analysis/ScalarEvolution.cpp:
In member function 'llvm::SCEVHandle
llvm::ScalarEvolution::createNodeForGEP(llvm::GetElementPtrInst*)':
/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm.src/lib/Analysis/ScalarEvolution.cpp:1872:
error: 'U' was not declared in this scope
/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm.src/lib/Analysis/ScalarEvolution.cpp:1874:
error: no matching function for call to 'gep_type_begin(<type error>)'
/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm.src/include/llvm/Support/GetElementPtrTypeIterator.h:84:
note: candidates are: llvm::gep_type_iterator
llvm::gep_type_begin(const llvm::User*)
/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm.src/include/llvm/Support/GetElementPtrTypeIterator.h:91:
note:                 llvm::gep_type_iterator
llvm::gep_type_begin(const llvm::User&)


On Fri, May 8, 2009 at 1:26 PM, Dan Gohman <gohman at apple.com> wrote:
> Author: djg
> Date: Fri May  8 15:26:55 2009
> New Revision: 71252
>
> URL: http://llvm.org/viewvc/llvm-project?rev=71252&view=rev
> Log:
> Factor out the code for creating SCEVs for GEPs into a
> separate function.
>
> Modified:
>    llvm/trunk/include/llvm/Analysis/ScalarEvolution.h
>    llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>
> Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolution.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolution.h?rev=71252&r1=71251&r2=71252&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/ScalarEvolution.h (original)
> +++ llvm/trunk/include/llvm/Analysis/ScalarEvolution.h Fri May  8 15:26:55 2009
> @@ -279,6 +279,10 @@
>     /// SCEVs.
>     SCEVHandle createNodeForPHI(PHINode *PN);
>
> +    /// createNodeForGEP - Provide the special handling we need to analyze GEP
> +    /// SCEVs.
> +    SCEVHandle createNodeForGEP(GetElementPtrInst *GEP);
> +
>     /// ReplaceSymbolicValueWithConcrete - This looks up the computed SCEV value
>     /// for the specified instruction and replaces any references to the
>     /// symbolic value SymName with the specified value.  This is used during
>
> Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=71252&r1=71251&r2=71252&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Fri May  8 15:26:55 2009
> @@ -1863,6 +1863,44 @@
>   return getUnknown(PN);
>  }
>
> +/// createNodeForGEP - Expand GEP instructions into add and multiply
> +/// operations. This allows them to be analyzed by regular SCEV code.
> +///
> +SCEVHandle ScalarEvolution::createNodeForGEP(GetElementPtrInst *GEP) {
> +
> +  const Type *IntPtrTy = TD->getIntPtrType();
> +  Value *Base = U->getOperand(0);
> +  SCEVHandle TotalOffset = getIntegerSCEV(0, IntPtrTy);
> +  gep_type_iterator GTI = gep_type_begin(U);
> +  for (GetElementPtrInst::op_iterator I = next(U->op_begin()),
> +                                      E = U->op_end();
> +       I != E; ++I) {
> +    Value *Index = *I;
> +    // Compute the (potentially symbolic) offset in bytes for this index.
> +    if (const StructType *STy = dyn_cast<StructType>(*GTI++)) {
> +      // For a struct, add the member offset.
> +      const StructLayout &SL = *TD->getStructLayout(STy);
> +      unsigned FieldNo = cast<ConstantInt>(Index)->getZExtValue();
> +      uint64_t Offset = SL.getElementOffset(FieldNo);
> +      TotalOffset = getAddExpr(TotalOffset,
> +                                  getIntegerSCEV(Offset, IntPtrTy));
> +    } else {
> +      // For an array, add the element offset, explicitly scaled.
> +      SCEVHandle LocalOffset = getSCEV(Index);
> +      if (!isa<PointerType>(LocalOffset->getType()))
> +        // Getelementptr indicies are signed.
> +        LocalOffset = getTruncateOrSignExtend(LocalOffset,
> +                                              IntPtrTy);
> +      LocalOffset =
> +        getMulExpr(LocalOffset,
> +                   getIntegerSCEV(TD->getTypePaddedSize(*GTI),
> +                                  IntPtrTy));
> +      TotalOffset = getAddExpr(TotalOffset, LocalOffset);
> +    }
> +  }
> +  return getAddExpr(getSCEV(Base), TotalOffset);
> +}
> +
>  /// GetMinTrailingZeros - Determine the minimum number of zero bits that S is
>  /// guaranteed to end in (at every loop iteration).  It is, at the same time,
>  /// the minimum number of times S is divisible by 2.  For example, given {4,+,8}
> @@ -2073,40 +2111,9 @@
>     return getTruncateOrZeroExtend(getSCEV(U->getOperand(0)),
>                                    U->getType());
>
> -  case Instruction::GetElementPtr: {
> +  case Instruction::GetElementPtr:
>     if (!TD) break; // Without TD we can't analyze pointers.
> -    const Type *IntPtrTy = TD->getIntPtrType();
> -    Value *Base = U->getOperand(0);
> -    SCEVHandle TotalOffset = getIntegerSCEV(0, IntPtrTy);
> -    gep_type_iterator GTI = gep_type_begin(U);
> -    for (GetElementPtrInst::op_iterator I = next(U->op_begin()),
> -                                        E = U->op_end();
> -         I != E; ++I) {
> -      Value *Index = *I;
> -      // Compute the (potentially symbolic) offset in bytes for this index.
> -      if (const StructType *STy = dyn_cast<StructType>(*GTI++)) {
> -        // For a struct, add the member offset.
> -        const StructLayout &SL = *TD->getStructLayout(STy);
> -        unsigned FieldNo = cast<ConstantInt>(Index)->getZExtValue();
> -        uint64_t Offset = SL.getElementOffset(FieldNo);
> -        TotalOffset = getAddExpr(TotalOffset,
> -                                    getIntegerSCEV(Offset, IntPtrTy));
> -      } else {
> -        // For an array, add the element offset, explicitly scaled.
> -        SCEVHandle LocalOffset = getSCEV(Index);
> -        if (!isa<PointerType>(LocalOffset->getType()))
> -          // Getelementptr indicies are signed.
> -          LocalOffset = getTruncateOrSignExtend(LocalOffset,
> -                                                IntPtrTy);
> -        LocalOffset =
> -          getMulExpr(LocalOffset,
> -                     getIntegerSCEV(TD->getTypePaddedSize(*GTI),
> -                                    IntPtrTy));
> -        TotalOffset = getAddExpr(TotalOffset, LocalOffset);
> -      }
> -    }
> -    return getAddExpr(getSCEV(Base), TotalOffset);
> -  }
> +    return createNodeForGEP(cast<GetElementPtrInst>(U));
>
>   case Instruction::PHI:
>     return createNodeForPHI(cast<PHINode>(U));
>
>
> _______________________________________________
> 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