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

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jeffrey A. Law from comment #5)
> I wonder why forwprop doesn't simplify bb6 by pushing the RHS of the
> assignment to _40 into the use of _40 in the conditional.
> 
> I'd guess the fortran front-end's boolean types are goofy and that's getting
> in the way of forwprop doing its job.  It may be impeding other bits as well.

It is because we fold (_39 < 0) != 0 to (logical(kind=1)) (_39 >> 63) and
canonicalize_cond_expr_cond doesn't recognize that form.

Index: gcc/gimple.c
===================================================================
--- gcc/gimple.c        (revision 255539)
+++ gcc/gimple.c        (working copy)
@@ -2148,6 +2148,17 @@ canonicalize_cond_expr_cond (tree t)
   else if (TREE_CODE (t) == BIT_XOR_EXPR)
     t = build2 (NE_EXPR, TREE_TYPE (t),
                TREE_OPERAND (t, 0), TREE_OPERAND (t, 1));
+  /* For (bool)(x >> 63) use x < 0.  */
+  else if (CONVERT_EXPR_P (t)
+          && TREE_CODE (TREE_OPERAND (t, 0)) == RSHIFT_EXPR
+          && TREE_CODE (TREE_OPERAND (TREE_OPERAND (t, 0), 1)) == INTEGER_CST
+          && ! TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (t, 0)))
+          && compare_tree_int (TREE_OPERAND (TREE_OPERAND (t, 0), 1),
+                               TYPE_PRECISION
+                                 (TREE_TYPE (TREE_OPERAND (t, 0))) - 1) == 0)
+    t = build2 (LT_EXPR, TREE_TYPE (t),
+               TREE_OPERAND (TREE_OPERAND (t, 0), 0),
+               build_zero_cst (TREE_TYPE (TREE_OPERAND (t, 0))));

   if (is_gimple_condexpr (t))
     return t;

fixes that but not the warnings (didn't expect that).  As suspected the array
accesses are introduced by cunroll.  I'll see what to recover from there.

Reply via email to