# Question on SelectionDAGBuilder

I ran into some odd code being generated today and I came
across something that doesn't look quite right.

In SelectionDAGBuilder::visitShuffleVector there's some code to see if we can
convert the shuffle to an EXTRACT_SUBVECTOR. After computing min/max
values of the mask for each operand, there's a look that looks at the ranges
and determines whether an EXTRACT_SUBVECTOR can be used:

for (int Input=0; Input < 2; ++Input) {
if (MinRange[Input] == (int)(SrcNumElts+1) && MaxRange[Input] == -1) {
RangeUse[Input] = 0; // Unused
StartIdx[Input] = 0;
} else if (MaxRange[Input] - MinRange[Input] < (int)MaskNumElts) {
// Fits within range but we should see if we can find a good
// start index that is a multiple of the mask length.
RangeUse[Input] = 1; // Extract from beginning of the vector
StartIdx[Input] = 0;
} else {
if (MaxRange[Input] - StartIdx[Input] < (int)MaskNumElts &&
RangeUse[Input] = 1; // Extract from a multiple of the mask
length.
}
}
}

Should this line:

use <= rather than <?

In my case I have the following:

%r4 = shufflevector <8 x double> %r3, <8 x double> undef, <4 x i32>
< i32 4, i32 5, i32 6, i32 7 > ; <<4 x double>> [#uses=1]

I would have expected this to result in an EXTRACT_SUBVECTOR of %r3 starting
at index 4, but the use of < above prevents that.

I'm not totally following the logic here, so if < is indeed correct can
someone explain why? Thanks!

-Dave

Yes, it looks that way to me.

Dan