Hi,

I think I found a generic problem for fixed point constant folding.

In fold-const.c:11872 gcc tries to apply:
      /* Transform (x >> c) << c into x & (-1<<c), or transform (x <<
c) >> c
         into x & ((unsigned)-1 >> c) for unsigned types.  */

I attached a simple patch which fixes the problem by not applying this
optimization to fixed point types.  I would like to have this
optimization because it is possible.. but the problem is fixed-point
types do not support bitwise operations like & | ^ ~.. so without
supporting these somehow internally but not allowing the user to have
them, this can't take place.

I am open to other suggestions.  For future reference should this be
posted as a bug report?   It seems simple enough that it could be
included right away.. but I feel like if it's a bug report no one will
notice since fixed-point support is not widely used.

Sean
Index: fold-const.c
===================================================================
--- fold-const.c	(revision 144210)
+++ fold-const.c	(working copy)
@@ -11877,7 +11877,8 @@ fold_binary (enum tree_code code, tree t
 	  && host_integerp (arg1, false)
 	  && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
 	  && host_integerp (TREE_OPERAND (arg0, 1), false)
-	  && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
+	  && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type)
+	  && TREE_CODE (type) != FIXED_POINT_TYPE)
 	{
 	  HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
 	  HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);

Reply via email to