Message ID | 20170404053333.GA295@x4 |
---|---|
State | New |
Headers | show |
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 <rguenther@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.
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>