[llvm-commits] [llvm] r51157 - in /llvm/trunk: include/llvm/Constants.h include/llvm/Instruction.def include/llvm/Instructions.h include/llvm/Support/InstVisitor.h lib/AsmParser/llvmAsmParser.cpp.cvs lib/AsmParser/llvmAsmParser.h.cvs lib/AsmParser/llvmAsmParser.y lib/AsmParser/llvmAsmParser.y.cvs lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/VMCore/ConstantFold.cpp lib/VMCore/ConstantFold.h lib/VMCore/Constants.cpp lib/VMCore/Instructions.cpp lib/VMCore/Verifier.cpp test/Verifier/2002-11-05-GetelementptrPointers.ll

Chris Lattner clattner at apple.com
Fri May 23 14:37:25 PDT 2008


On May 15, 2008, at 12:50 PM, Dan Gohman wrote:
> URL: http://llvm.org/viewvc/llvm-project?rev=51157&view=rev
> Log:
> IR support for extractvalue and insertvalue instructions. Also, begin
> moving toward making structs and arrays first-class types.

Ok.

>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/Constants.h (original)
> +++ llvm/trunk/include/llvm/Constants.h Thu May 15 14:50:34 2008
> @@ -575,6 +575,11 @@
>                                       Constant *Elt, Constant *Idx);
>   static Constant *getShuffleVectorTy(const Type *Ty, Constant *V1,
>                                       Constant *V2, Constant *Mask);
> +  static Constant *getExtractValueTy(const Type *Ty, Constant *Agg,
> +                                     Constant * const *Idxs,  
> unsigned NumIdxs);
> +  static Constant *getInsertValueTy(const Type *Ty, Constant *Agg,
> +                                    Constant *Val,
> +                                    Constant * const *Idxs,  
> unsigned NumIdxs);

As discussed in langref, I think this should take just "const unsigned  
*Idxs, unsigned NumIdxs" like getresult.

I understand that this means that you don't get to share code with GEP  
indexing, but it is more efficient and means that we can't have  
constantexprs as indices etc.

> // 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
> +//                                ExtractValueInst Class
> +// 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
> +
> +/// ExtractValueInst - This instruction extracts a value
> +/// from an aggregate value
> +///
> +class ExtractValueInst : public Instruction {
> +  ExtractValueInst(const ExtractValueInst &EVI);
> +  void init(Value *Agg, Value* const *Idx, unsigned NumIdx);
> +  void init(Value *Agg, Value *Idx);
> +
> +  template<typename InputIterator>
> +  void init(Value *Agg, InputIterator IdxBegin, InputIterator IdxEnd,
> +            const std::string &Name,
> +            // This argument ensures that we have an iterator we can
> +            // do arithmetic on in constant time
> +            std::random_access_iterator_tag) {
> +    unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin,  
> IdxEnd));
> +
> +    if (NumIdx > 0) {

I thought the instruction required at least one index?  Likewise in a  
couple other places.

> +++ llvm/trunk/test/Verifier/2002-11-05-GetelementptrPointers.ll Thu  
> May 15 14:50:34 2008
> @@ -1,7 +1,7 @@
> -; RUN: not llvm-as < %s |& grep {Invalid getelementptr indices}
> +; RUN: llvm-as < %s
>
> -; This testcase is invalid because we are indexing into a pointer  
> that is
> -; contained WITHIN a structure.
> +; This testcase was previously considered invalid for indexing into  
> a pointer
> +; that is contained WITHIN a structure, but this is now valid.
>
> define void @test({i32, i32*} * %X) {
> 	getelementptr {i32, i32*} * %X, i32 0, i32 1, i32 0

Why is this valid?

-Chris




More information about the llvm-commits mailing list