[Bug tree-optimization/81297] [8 Regression] ICE in get_single_symbol

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Jul 31 08:01:00 GMT 2017


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

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
So we fold (plus -1 -2147483648) with type 'int' and TYPE_OVERFLOW_WRAPS.  That
gets int_const_binop to set TREE_OVERFLOW (because generally fold only looks at
the SIGN and not TYPE_OVERFLOW_* when setting TREE_OVERFLOW).

The unfortunate thing here is that the overflow prevails in sth non-constant at
the end.  But recursively walking all trees to weed out TREE_OVERFLOW after
each folding to non-constant looks awkward (and might even lead to more
folding!?).

Index: gcc/fold-const.c
===================================================================
--- gcc/fold-const.c    (revision 250725)
+++ gcc/fold-const.c    (working copy)
@@ -9107,8 +9107,8 @@ expr_not_equal_to (tree t, const wide_in
    Return the folded expression if folding is successful.  Otherwise,
    return NULL_TREE.  */

-tree
-fold_binary_loc (location_t loc,
+static tree
+fold_binary_loc_1 (location_t loc,
             enum tree_code code, tree type, tree op0, tree op1)
 {
   enum tree_code_class kind = TREE_CODE_CLASS (code);
@@ -11177,6 +11177,31 @@ fold_binary_loc (location_t loc,
     } /* switch (code) */
 }

+static tree
+drop_tree_overflow_r (tree *expr_p, int *ws, void *)
+{
+  if (TREE_OVERFLOW_P (*expr_p))
+    {
+      *expr_p = drop_tree_overflow (*expr_p);
+      *ws = 0;
+    }
+  else if (! EXPR_P (*expr_p))
+    *ws = 0;
+  return NULL_TREE;
+}
+
+tree
+fold_binary_loc (location_t loc,
+                enum tree_code code, tree type, tree op0, tree op1)
+{
+  tree res = fold_binary_loc_1 (loc, code, type, op0, op1);
+  if (res && ! TREE_CONSTANT (res))
+    walk_tree (&res, drop_tree_overflow_r, NULL, NULL);
+             
+  return res;
+}
+
+
 /* Callback for walk_tree, looking for LABEL_EXPR.  Return *TP if it is
    a LABEL_EXPR; otherwise return NULL_TREE.  Do not check the subtrees
    of GOTO_EXPR.  */


note we're not properly re-building/folding subtrees here so fold checking
might be unhappy.  It's also not clear that just ignoring TREE_CONSTANT
exprs is enough if you consider folding two non-constant but with dropped
overflow parts to a constant afterwards...

So I'm going to remove the assert in VRP that I added mainly for the
-fstrict-overflow removal as a sanity check.


More information about the Gcc-bugs mailing list