On Fri, Jun 20, 2025 at 3:47 PM Mikael Morin <morin-mik...@orange.fr> wrote: > > From: Mikael Morin <mik...@gcc.gnu.org> > > Regression tested on x86_64-linux. OK for master?
OK. Thanks, Richard. > -- 8< -- > > gcc/ChangeLog: > > * match.pd (`-(-X)`, `~(~X)`): Add a NON_LVALUE_EXPR wrapper to the > simplification of doubled unary operators NEGATE_EXPR and > BIT_NOT_EXPR. > > gcc/testsuite/ChangeLog: > > * gfortran.dg/non_lvalue_1.f90: New test. > --- > gcc/match.pd | 4 ++-- > gcc/testsuite/gfortran.dg/non_lvalue_1.f90 | 23 ++++++++++++++++++++++ > 2 files changed, 25 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gfortran.dg/non_lvalue_1.f90 > > diff --git a/gcc/match.pd b/gcc/match.pd > index 0f53c162fce..ad0fa8f1004 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -2357,7 +2357,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > /* ~~x -> x */ > (simplify > (bit_not (bit_not @0)) > - @0) > + (non_lvalue @0)) > > /* zero_one_valued_p will match when a value is known to be either > 0 or 1 including constants 0 or 1. > @@ -4037,7 +4037,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (negate (nop_convert? (negate @1))) > (if (!TYPE_OVERFLOW_SANITIZED (type) > && !TYPE_OVERFLOW_SANITIZED (TREE_TYPE (@1))) > - (view_convert @1))) > + (non_lvalue (view_convert @1)))) > > /* We can't reassociate floating-point unless -fassociative-math > or fixed-point plus or minus because of saturation to +-Inf. */ > diff --git a/gcc/testsuite/gfortran.dg/non_lvalue_1.f90 > b/gcc/testsuite/gfortran.dg/non_lvalue_1.f90 > new file mode 100644 > index 00000000000..536c86b1eb6 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/non_lvalue_1.f90 > @@ -0,0 +1,23 @@ > +! { dg-do compile } > +! { dg-additional-options "-fdump-tree-original" } > +! > +! Check the generation of NON_LVALUE_EXPR expressions in cases where a unary > +! operator expression would simplify to a bare data reference. > + > +! A NON_LVALUE_EXPR is generated for a double negation that would simplify to > +! a bare data reference. > +function f1 (f1_arg1) > + integer, value :: f1_arg1 > + integer :: f1 > + f1 = -(-f1_arg1) > +end function > +! { dg-final { scan-tree-dump "__result_f1 = NON_LVALUE_EXPR <f1_arg1>;" > "original" } } > + > +! A NON_LVALUE_EXPR is generated for a double complement that would simplify > to > +! a bare data reference. > +function f2 (f2_arg1) > + integer, value :: f2_arg1 > + integer :: f2 > + f2 = not(not(f2_arg1)) > +end function > +! { dg-final { scan-tree-dump "__result_f2 = NON_LVALUE_EXPR <f2_arg1>;" > "original" } } > -- > 2.47.2 >