https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79904

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
For signed integer overflow sanitized vector +/-/*, the code is emitted from
internal-fn.c calling generic expansion routines.
I have no idea what s390.c complains about here, why is it wrong.
What internal-fn.c does is it tries to expand:
VIEW_CONVERT_EXPR<signed char[8]>({ 3, 3, 3, 3, 3, 3, 3, 3 })[D.2328];
The vector has DImode, is VCEd to array of 8 chars, and then array accessed.
internal-fn.c uses:
          op1 = fold_build1_loc (loc, VIEW_CONVERT_EXPR, atype, arg1);
          op1 = build4_loc (loc, ARRAY_REF, eltype, op1, cntv,
                            NULL_TREE, NULL_TREE);
where arg1 is VECTOR_CST and later that op1 is expanded using expand_normal.  I
can certainly as optimization deal there with uniform vectors, will attach a
patch for that momentarily, but that doesn't fix:
/* PR sanitizer/79904 */
/* { dg-do compile } */
/* { dg-options "-fsanitize=signed-integer-overflow" } */

typedef signed char V __attribute__((vector_size (8))); 

void
foo (V *a) 
{ 
  *a = *a * (V) { 3, 4, 5, 6, 7, 8, 9, 10 }; 
}
which still ICEs.  I must say I don't see anything wrong here on the middle-end
side.

Reply via email to