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.
if (MaxRange[Input] < (int)MaskNumElts) {
RangeUse[Input] = 1; // Extract from beginning of the vector
StartIdx[Input] = 0;
} else {
StartIdx[Input] = (MinRange[Input]/MaskNumElts)*MaskNumElts;
if (MaxRange[Input] - StartIdx[Input] < (int)MaskNumElts &&
StartIdx[Input] + MaskNumElts < SrcNumElts)
RangeUse[Input] = 1; // Extract from a multiple of the mask
length.
}
}
}
Should this line:
StartIdx[Input] + MaskNumElts < SrcNumElts)
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