Indices for extractvalue and insertvalue

Hi

Can someone explain to me why we cant use uint64_t for extractvalue
and insertvalue indices, while GEP on arrays can have indices of any
integer type. Basically if I load an array with UINT_MAX+O (O>=2)
elements, I can not extract its last element.

Given this restriction I feel we have a bug here (uint64_t is passed
as a unsigned). This cant happen because of the if (NumElements >
1024) guard, but its a bug anyways.

https://github.com/llvm-mirror/llvm/blob/master/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp#L634

Thanks,
-Xin

I think originally insertvalue / extractvalue were only intended to work on struct values. LLVM struct types can have up to 2**32 element types, and the insertvalue/extractvalue indices match that.

I hope people aren’t actually trying to load a >4GB array and hoping to do something good with it.

That makes sense.

Then it seems to me that there is some unclearness about what the
language ref says, i.e.
http://llvm.org/docs/LangRef.html#extractvalue-instruction says
extractvalue indices work in a similar manner as indices for
getelementptr, and what the the compiler supports (extractvalue
indices are unsigned or smaller while getelementptr indices can be
uint64_t).

What would be the problem if we make extractvalue and insertvalue use
uint64_t indices, other than the compiler potentially uses a bit more
memory ?

-Xin