[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 14:01:00 PDT 2009


Thanks! :-)

-bw

On Fri, May 8, 2009 at 1:59 PM, Dan Gohman <gohman at apple.com> wrote:
> Hi, these are fixed now. Sorry for the breakage.
>
> Dan
>
> On May 8, 2009, at 1:35 PM, Bill Wendling wrote:
>
>> 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
>>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> 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