Dorit Nuzman - [PATCH] PR30975 (original) (raw)

This is the mail archive of the gcc-patches@gcc.gnu.orgmailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] PR30975 - remove wrong assert (fix vectorizer ICE)


Hi,

The assert on which the testcase in this PR ICEs is plain wrong - I don't know what I was thinking when I put it there in the first place. The patch below simply removes the assert. Here's the long explanation why:

The situation in question is a loop with induction and with multiple-data-sizes. More specifically - vectorizing an induction using a vector-size VS that cannot fit VF elements (VF = vectorization factor). This can happen, for example, if the induction is of type int, and there is another operation in the loop of type char, for which the VF=16; We need to generate 4 vector operations in order to compute 16 integer results when we vectorize the induction (i.e. ncopies = 4). This is the code that is generated:

  vector int vi;

loop:

[1] vi_0 = phi < {0,1,2,3}, vi_1 > ... [2] vi_2 = vi_0 + {4,4,4,4} [3] vi_3 = vi_2 + {4,4,4,4} [4] vi_4 = vi_3 + {4,4,4,4} ... [5] vi_1 = vi_0 + {16,16,16,16}

When we vectorize a stmt that uses the induction variable - we call 'vect_get_vec_def_for_operand' to create the above def-use cycle that computes the vector induction, and it returns the first vector induction def (vi_0). For the rest of the copies, we call 'vect_get_vec_def_for_stmt_copy' (to get vi_2, vi_3, and vi_4). The ICE occurs in 'vect_get_vec_def_for_stmt_copy' where we (wrongly) assert that the previous vector-stmt is a phi-node. This is only true for the first "copy" - i.e. stmt [2]. It is not true for the rest of the copies (stmts [3],[4]).

What bothered me is how come none of the induction testcases caught this. Turns out the testcase that was supposed to test this functionality - vect-iv-8.c - was accidentally missing the loop-update - so instead of an induction, we have an invariant variablbe... Also, the offending assert is always true for the first copy-stmt (and only for it), so when ncopies = 2 (which is the case in vect-iv-8.c) we don't ICE (cause in that case we have only one copy stmt)...

Bootsrapped on powerpc-linux and i386-linux. Tested on the vectorizer testcases on these platforms.

OK for mainline?

thanks, dorit

:ADDPATCH vectorizer (non-algorithmic):

   * tree-vect-trasnform.c (vect_get_vec_def_for_stmt_copy): Remove
    wrong assert.

    * gcc.dg/vect/vect-iv-8.c: Fix to include an induction. Xfail.
    * gcc.dg/vect/vect-iv-8a.c: New (same as above, but signed).
    * gcc.dg/vect/pr30795.c: New.

(See attached file: feb18.pr30795.txt)

Attachment:feb18.pr30795.txt
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]