[Bug tree-optimization/37242] missed FRE opportunity because of signedness of addition
bonzini at gnu dot org
gcc-bugzilla@gcc.gnu.org
Wed Aug 27 07:16:00 GMT 2008
------- Comment #5 from bonzini at gnu dot org 2008-08-27 07:14 -------
With this patch:
Index: fold-const.c
===================================================================
--- fold-const.c (revision 139423)
+++ fold-const.c (working copy)
@@ -7868,7 +7868,11 @@ fold_unary (enum tree_code code, tree ty
very likely don't have maximal range for their precision and this
transformation effectively doesn't preserve non-maximal ranges. */
if (TREE_CODE (type) == INTEGER_TYPE
- && TREE_CODE (op0) == BIT_AND_EXPR
+ && (TREE_CODE (op0) == BIT_AND_EXPR
+ || TREE_CODE (op0) == BIT_IOR_EXPR
+ || TREE_CODE (op0) == BIT_XOR_EXPR
+ || TREE_CODE (op0) == PLUS_EXPR
+ || TREE_CODE (op0) == MINUS_EXPR)
&& TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
{
tree and = op0;
@@ -7906,7 +7910,7 @@ fold_unary (enum tree_code code, tree ty
tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
TREE_INT_CST_HIGH (and1), 0,
TREE_OVERFLOW (and1));
- return fold_build2 (BIT_AND_EXPR, type,
+ return fold_build2 (TREE_CODE (op0), type,
fold_convert (type, and0), tem);
}
}
I can fold "(unsigned) (x + 1)" to "(unsigned) x + 1". The problem is that TER
does not fold the trees it creates.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37242
More information about the Gcc-bugs
mailing list