[llvm-commits] [PATCH] Fix assertion failure with shufflevectors on ARM

Stepan Dyatkovskiy stpworld at narod.ru
Tue Aug 28 23:52:57 PDT 2012


ping
Stepan Dyatkovskiy wrote:
> Hi all!
> Due to Duncan remarks for r162195:
> http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20120820/148595.html
>
> I reverted this patch and proceed debugging the problem. Now it seems
> that I found proper places for fix.
>
> I found that crashes, described by James in initial post are happened
> due to two bugs.
>
> Bug #1. We insert wrong concat_vectors operation while expanding
> build_vector in DAGCombiner::visitBUILD_VECTOR:
> v16i8 concat_vectors v4i16, v4i16
> That happens due to improperly formed condition: when we can expand
> build_vector and when we can't. We support widening of vectors which are
> half the size of the output registers.
> In TOT you can found the check:
> if (VecIn1.getValueType().getSizeInBits()*2 != VT.getSizeInBits())
>    return SDValue()
> I think, it is wrong, since we should check number of elements instead
> of bit width. This check doesn't take into account input and output
> vectors number. It also takes into account bit width, but it doesn't
> matter: if we produce illegal operation (input width != output width) it
> will be legalized later.
>
> Bug #2. Fired when LegalizeDAG tries to produce extract_vector_elt with
> operands that are build_vector nodes. getNode tries to return
> build_vector's operand in that case, but it also inserts the nodes, that
> performs high bits cleaning from garbage:
> Node0: i32 some-node-here
> Node1: v2i16 build_vector Node0, Node0
>
> // Current nodes sequence inserted when we invoke
> // getNode(EXTRACT_VECTOR_ELT, dl, i32, Node0, idx=0)
> Node1: i16 truncate Node0
> Node2: i32 any_extend Node1
> // return Node2 instead of extract_vector_elt node.
>
> I'm 99,9(9)% sure, that it is wrong way, due to next reasons:
>   1. 16 may be illegal type (even if v2i16 is legal), so, at least you
> need to check  CombineLevel, it should be BeforeLegalizeTypes. In
> another case you will crash the LegalizeDAG.
>   2. What if initially elements were i8 and then was transformed since
> target is 32bit machine?
>   Node0: i8 some-node-here
>   Node1: v2i8 build_vector Node0, NodeItem1, NodeItem2, NodeItem3
>   After type legalization we got current state:
>   Node0: i32 some-node-here
>   Node1: v2i16 build_vector Node0, NodeItem1, NodeItem2, NodeItem3
>   But you can't determine initial type (was it 8bit or may be 4bit?) on
> this stage. So 'i16 = truncate Node0' will not guarantee high bits
> cleanness.
>   3. build_vector operands were already extended to
>   machine word width (32 bit in our case) with some way. We needn't do
>   the same job twice.
>
> Please find the fix in attachment.
>
> -Stepan.
>
> Eli Friedman wrote:
>> On Wed, Aug 15, 2012 at 2:55 AM, Stepan Dyatkovskiy
>> <stpworld at narod.ru> wrote:
>>> Hi Eli,
>>> Please review the patch with bitcasting after concat_vectors.
>>
>> Looks fine.
>>
>> -Eli
>>
>




More information about the llvm-commits mailing list