On Tue, 4 Apr 2017, Marc Glisse wrote: > On Tue, 4 Apr 2017, Markus Trippelsdorf wrote: > > > On 2017.04.03 at 11:16 +0200, Richard Biener wrote: > > > > > > The following extends split_address_to_core_and_offset to handle > > > POINTER_PLUS_EXPR to be able to simplify > > > (unsigned long) &MEM[(void *)&D.15512 + 12B] - (unsigned long) ((const int > > > *) &D.15512 + 4) which appears during niter analysis. > > > > > > We seem to have various copies of similar code but refactoring didn't > > > seem appropriate at this stage so I went for the minimal fix. > > > > > > Bootstrap and regtest running on x86_64-unknown-linux-gnu. > > > > > > Richard. > > > > > > 2017-04-03 Richard Biener <rguent...@suse.de> > > > > > > PR tree-optimization/80275 > > > * fold-const.c (split_address_to_core_and_offset): Handle > > > POINTER_PLUS_EXPR. > > > > > > * g++.dg/opt/pr80275.C: New testcase. > > > > > > Index: gcc/fold-const.c > > > =================================================================== > > > --- gcc/fold-const.c (revision 246642) > > > +++ gcc/fold-const.c (working copy) > > > @@ -14341,6 +14341,24 @@ split_address_to_core_and_offset (tree e > > > &volatilep); > > > core = build_fold_addr_expr_loc (loc, core); > > > } > > > + else if (TREE_CODE (exp) == POINTER_PLUS_EXPR) > > > + { > > > + core = TREE_OPERAND (exp, 0); > > > + STRIP_NOPS (core); > > > + *pbitpos = 0; > > > + *poffset = TREE_OPERAND (exp, 1); > > > + if (TREE_CODE (*poffset) == INTEGER_CST) > > > + { > > > + offset_int tem = wi::sext (wi::to_offset (*poffset), > > > + TYPE_PRECISION (TREE_TYPE (*poffset))); > > > + tem <<= LOG2_BITS_PER_UNIT; > > > + if (wi::fits_shwi_p (tem)) > > > + { > > > + *pbitpos = tem.to_shwi (); > > > + *poffset = NULL_TREE; > > > + } > > > + } > > > + } > > > else > > > { > > > core = exp; > > > Index: gcc/testsuite/g++.dg/opt/pr80275.C > > > =================================================================== > > > --- gcc/testsuite/g++.dg/opt/pr80275.C (nonexistent) > > > +++ gcc/testsuite/g++.dg/opt/pr80275.C (working copy) > > > @@ -0,0 +1,16 @@ > > > +// { dg-do compile { target c++14 } } > > > +// { dg-options "-O2 -fdump-tree-optimized" } > > > + > > > +#include <algorithm> > > > + > > > +int g() > > > +{ > > > + return 1234; > > > +} > > > + > > > +int f2() > > > +{ > > > + return std::min({1, g(), 4}); > > > +} > > > + > > > +// { dg-final { scan-tree-dump "return 1;" "optimized" } } > > > > The testcase fails with -fpic, e.g.: > > https://gcc.gnu.org/ml/gcc-regression/2017-04/msg00002.html > > > > So perhaps: > > > > diff --git a/gcc/testsuite/g++.dg/opt/pr80275.C > > b/gcc/testsuite/g++.dg/opt/pr80275.C > > index 7296a07fb2dd..7d625f2c7757 100644 > > --- a/gcc/testsuite/g++.dg/opt/pr80275.C > > +++ b/gcc/testsuite/g++.dg/opt/pr80275.C > > @@ -1,4 +1,4 @@ > > -// { dg-do compile { target c++14 } } > > +// { dg-do compile { target c++14 && nonpic } } > > // { dg-options "-O2 -fdump-tree-optimized" } > > > > #include <algorithm> > > Making g static should work even with PIC.
Tested on x86_64-unknown-linux-gnu, applied. Richard. 2017-04-04 Richard Biener <rguent...@suse.de> PR tree-optimization/80275 * g++.dg/opt/pr80275.C: Make g static. Index: gcc/testsuite/g++.dg/opt/pr80275.C =================================================================== --- gcc/testsuite/g++.dg/opt/pr80275.C (revision 246670) +++ gcc/testsuite/g++.dg/opt/pr80275.C (working copy) @@ -3,7 +3,7 @@ #include <algorithm> -int g() +static int g() { return 1234; }