On Thu, 22 Dec 2022, Jakub Jelinek wrote: > Hi! > > The following testcase ICEs on aarch64, because insert_const_anchor > inserts invalid CONST_INT into the CSE tables - 0x80000000 for SImode. > The second hunk of the patch fixes that, the first one is to avoid > triggering undefined behavior at compile time during compute_const_anchors > computations - performing those additions and subtractions in > HOST_WIDE_INT means it can overflow for certain constants. > > Bootstrapped/regtested on aarch64-linux (which does have nonzero > target.const_anchor) and x86_64-linux and i686-linux (which have it > zero). Ok for trunk? > > 2022-12-22 Jakub Jelinek <ja...@redhat.com> > > PR rtl-optimization/108193 > * cse.cc (compute_const_anchors): Change n type to > unsigned HOST_WIDE_INT, adjust comparison against it to avoid > warnings. Formatting fix. > (insert_const_anchor): Use gen_int_mode instead of GEN_INT. > > * gfortran.dg/pr108193.f90: New test. > > --- gcc/cse.cc.jj 2022-06-28 13:03:30.699692752 +0200 > +++ gcc/cse.cc 2022-12-21 12:58:24.277945065 +0100 > @@ -1169,14 +1169,14 @@ compute_const_anchors (rtx cst, > HOST_WIDE_INT *lower_base, HOST_WIDE_INT *lower_offs, > HOST_WIDE_INT *upper_base, HOST_WIDE_INT *upper_offs) > { > - HOST_WIDE_INT n = INTVAL (cst); > + unsigned HOST_WIDE_INT n = INTVAL (cst);
UINTVAL? Otherwise OK. Thanks, Richard. > > *lower_base = n & ~(targetm.const_anchor - 1); > - if (*lower_base == n) > + if ((unsigned HOST_WIDE_INT) *lower_base == n) > return false; > > - *upper_base = > - (n + (targetm.const_anchor - 1)) & ~(targetm.const_anchor - 1); > + *upper_base = ((n + (targetm.const_anchor - 1)) > + & ~(targetm.const_anchor - 1)); > *upper_offs = n - *upper_base; > *lower_offs = n - *lower_base; > return true; > @@ -1193,7 +1193,7 @@ insert_const_anchor (HOST_WIDE_INT ancho > rtx anchor_exp; > rtx exp; > > - anchor_exp = GEN_INT (anchor); > + anchor_exp = gen_int_mode (anchor, mode); > hash = HASH (anchor_exp, mode); > elt = lookup (anchor_exp, hash, mode); > if (!elt) > --- gcc/testsuite/gfortran.dg/pr108193.f90.jj 2022-12-21 13:02:21.925513332 > +0100 > +++ gcc/testsuite/gfortran.dg/pr108193.f90 2022-12-21 13:01:38.595139040 > +0100 > @@ -0,0 +1,24 @@ > +! PR rtl-optimization/108193 > +! { dg-do compile { target pthread } } > +! { dg-options "-O2 -fsplit-loops -ftree-parallelize-loops=2 > -fno-tree-dominator-opts" } > + > +subroutine foo (n, r) > + implicit none > + integer :: i, j, n > + real :: s, r(*) > + > + s = 0.0 > + > + do j = 1, 2 > + do i = j, n > + s = r(i) > + end do > + end do > + > + do i = 1, n > + do j = i, n > + s = s + 1 > + end do > + r(i) = s > + end do > +end subroutine foo > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman; HRB 36809 (AG Nuernberg)