On Tue, 31 Mar 2020, Jakub Jelinek wrote: > Hi! > > The following testcase is miscompiled since 4.9, we treat unsigned > vector types as if they were signed and "optimize" negations across it. > > Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for > trunk?
OK. Richard. > 2020-03-31 Marc Glisse <marc.gli...@inria.fr> > Jakub Jelinek <ja...@redhat.com> > > PR middle-end/94412 > * fold-const.c (fold_binary_loc) <case TRUNC_DIV_EXPR>: Use > ANY_INTEGRAL_TYPE_P instead of INTEGRAL_TYPE_P. > > * gcc.c-torture/execute/pr94412.c: New test. > > --- gcc/fold-const.c.jj 2020-03-19 10:23:34.106114042 +0100 > +++ gcc/fold-const.c 2020-03-30 23:00:32.273551465 +0200 > @@ -11148,11 +11148,11 @@ fold_binary_loc (location_t loc, enum tr > > /* Convert -A / -B to A / B when the type is signed and overflow is > undefined. */ > - if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type)) > + if ((!ANY_INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type)) > && TREE_CODE (op0) == NEGATE_EXPR > && negate_expr_p (op1)) > { > - if (INTEGRAL_TYPE_P (type)) > + if (ANY_INTEGRAL_TYPE_P (type)) > fold_overflow_warning (("assuming signed overflow does not occur " > "when distributing negation across " > "division"), > @@ -11162,11 +11162,11 @@ fold_binary_loc (location_t loc, enum tr > TREE_OPERAND (arg0, 0)), > negate_expr (op1)); > } > - if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type)) > + if ((!ANY_INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type)) > && TREE_CODE (arg1) == NEGATE_EXPR > && negate_expr_p (op0)) > { > - if (INTEGRAL_TYPE_P (type)) > + if (ANY_INTEGRAL_TYPE_P (type)) > fold_overflow_warning (("assuming signed overflow does not occur " > "when distributing negation across " > "division"), > --- gcc/testsuite/gcc.c-torture/execute/pr94412.c.jj 2020-03-30 > 23:12:17.499118691 +0200 > +++ gcc/testsuite/gcc.c-torture/execute/pr94412.c 2020-03-30 > 23:12:00.701367149 +0200 > @@ -0,0 +1,28 @@ > +/* PR middle-end/94412 */ > + > +typedef unsigned V __attribute__ ((__vector_size__ (sizeof (unsigned) * 2))); > + > +void > +foo (V *v, V *w) > +{ > + *w = -*v / 11; > +} > + > +void > +bar (V *v, V *w) > +{ > + *w = -18 / -*v; > +} > + > +int > +main () > +{ > + V a = (V) { 1, 0 }; > + V b = (V) { 3, __INT_MAX__ }; > + V c, d; > + foo (&a, &c); > + bar (&b, &d); > + if (c[0] != -1U / 11 || c[1] != 0 || d[0] != 0 || d[1] != -18U / > -__INT_MAX__) > + __builtin_abort (); > + return 0; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)