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);