https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79981

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jakub Jelinek from comment #4)
> (In reply to Dominik Vogt from comment #3)
> > (In reply to Richard Biener from comment #2)
> > > of course needs to be conditional on oldlhs being bool and lhs being
> > > integral.
> > 
> > Like so?
> > 
> > --
> > diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
> > index 9fd45d1..e5e448e 100644
> > --- a/gcc/gimple-fold.c
> > +++ b/gcc/gimple-fold.c
> > @@ -3581,7 +3581,12 @@ fold_builtin_atomic_compare_exchange
> > (gimple_stmt_iterator *gsi)
> >     }
> >        else
> >     gsi_insert_after (gsi, g, GSI_NEW_STMT);
> > -      g = gimple_build_assign (oldlhs, NOP_EXPR, gimple_assign_lhs (g));
> > +      if (TREE_CODE (TREE_TYPE (oldlhs)) == BOOLEAN_TYPE
> > +     && INTEGRAL_TYPE_P (itype))
> > +   g = gimple_build_assign (oldlhs, NE_EXPR, gimple_assign_lhs (g),
> > +                            build_zero_cst (TREE_TYPE (gimple_assign_lhs 
> > (g))));
> > +      else
> > +   g = gimple_build_assign (oldlhs, NOP_EXPR, gimple_assign_lhs (g));
> >        gsi_insert_after (gsi, g, GSI_NEW_STMT);
> >      }
> >    g = gimple_build_assign (make_ssa_name (itype), REALPART_EXPR,
> 
> That looks like a pessimization instead of optimization, perhaps optimizers
> then do a better job at that, but maybe in other cases don't.

As said, we miss canonicalization here and yes, likely it's a pessimization
in some cases.

> Wouldn't it be better to look after building the NOP_EXPR at the immediate
> uses of oldlhs and if any of them is oldlhs != 0 or oldlhs == 0 comparison,
> forward propagate there immediately the rhs1 of the nop and adjust the other
> operand?

You can't do this from folding (looking at immediate uses).

There is the possibility to enhance combine_cond_expr_cond
to handle the if ((_Bool) int != 0) case.  In this case it looks like
a missed canonicalization to me given we simplify this to (_Bool) int:

Index: gcc/gimple.c
===================================================================
--- gcc/gimple.c        (revision 246023)
+++ gcc/gimple.c        (working copy)
@@ -2084,8 +2084,16 @@ canonicalize_cond_expr_cond (tree t)
             == BOOLEAN_TYPE))
     t = TREE_OPERAND (t, 0);

+  /* For (bool)x use x != 0.  */
+  if (CONVERT_EXPR_P (t)
+      && TREE_CODE (TREE_TYPE (t)) == BOOLEAN_TYPE)
+    {
+      tree top0 = TREE_OPERAND (t, 0);
+      t = build2 (NE_EXPR, TREE_TYPE (t),
+                 top0, build_int_cst (TREE_TYPE (top0), 0));
+    }
   /* For !x use x == 0.  */
-  if (TREE_CODE (t) == TRUTH_NOT_EXPR)
+  else if (TREE_CODE (t) == TRUTH_NOT_EXPR)
     {
       tree top0 = TREE_OPERAND (t, 0);
       t = build2 (EQ_EXPR, TREE_TYPE (t),

fixes the testcase.

Reply via email to