[LLVMdev] extractvalue and insertvalue on vector types

Andrew Booker andrew.booker at arm.com
Wed Dec 14 07:06:10 PST 2011


I'm working with some hand-written LLVM IR which llvm-as doesn't like,
giving me the error "Invalid indices for extractvalue". However, as
far as I can tell, the code is valid according to the Language
Reference Manual.

A cut-down example of the kind of code in question is:

%struct.s = type {i32,i32,<2 x i32>}

define void @entry(i32* %out)
  %1 = extractvalue %struct.s {i32 1, i32 2, <2 x i32> <i32 3, i32 4>},
  %2 = extractvalue %struct.s {i32 1, i32 2, <2 x i32> <i32 3, i32 4>},
  %3 = extractvalue %struct.s {i32 1, i32 2, <2 x i32> <i32 3, i32 4>},
2, 0
  %4 = extractvalue %struct.s {i32 1, i32 2, <2 x i32> <i32 3, i32 4>},
2, 1

  %5 = add i32 %1, %2
  %6 = add i32 %5, %3
  %7 = add i32 %6, %4

  store i32 %7, i32* %out
  ret void

The error I quoted above is reported when llvm-as is trying to read
the %3 line, accessing the first component of the <2 x i32> vector
inside the struct.

If I change the code such that the structure is defined with a
2-element array instead of a 2-element vector:
   %struct.s = type {i32,i32,[2 x i32]}
then llvm-as does not report an error, hence why I believe the problem
is specific to accessing vector components.

According to the Language Reference Manual, I should be able to access
vector components with extractvalue:

"The 'extractvalue' instruction extracts the value of a member field
from an aggregate value", and "Aggregate Types are a subset of derived
types that can contain multiple member types. Arrays, structs and
vectors are aggregate types".

"The operands [to extractvalue] are constant indices to specify which
value to extract in a similar manner as indices in a 'getelementptr'
instruction", and "subsequent types [indexed by getelementptr] can be
arrays, vectors, and structs."

Any pointers as to what I'm doing wrong, or is this a mistake in the
reference manual? I could believe that you're not meant to use
extractvalue and insertvalue on vector types, since that would seem to
duplicate the behaviour of extractelement and insertelement, but, at
the moment, the manual says that it's allowed.


More information about the llvm-dev mailing list