Hi, I found a few more cases that still cause internal compiler errors, I managed to fix them. I have attached an updated patch.
Sean On Tue, Mar 17, 2009 at 12:45 PM, Fu, Chao-Ying <f...@mips.com> wrote: > Sean D'Epagnier wrote: >> >> 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 >> > > Thanks for finding this bug and fixing it! I think you should send your > patch to gcc-patc...@gcc.gnu.org, and check in this patch to mainline and 4.3 > if possible. > > Regards, > Chao-ying >
Index: fold-const.c =================================================================== --- fold-const.c (revision 144210) +++ fold-const.c (working copy) @@ -11844,6 +11844,11 @@ fold_binary (enum tree_code code, tree t if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0) return NULL_TREE; + /* Since fixed point types cannot perform bitwise and, or, etc.. + don't try to convert to an expression with them. */ + if (TREE_CODE(type) == FIXED_POINT_TYPE) + return NULL_TREE; + /* Turn (a OP c1) OP c2 into a OP (c1+c2). */ if (TREE_CODE (op0) == code && host_integerp (arg1, false) && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type) Index: cse.c =================================================================== --- cse.c (revision 144210) +++ cse.c (working copy) @@ -3509,9 +3509,10 @@ fold_rtx (rtx x, rtx insn) && exact_log2 (- INTVAL (const_arg1)) >= 0))) break; - /* ??? Vector mode shifts by scalar + /* ??? Vector and Fixed Point shifts by scalar shift operand are not supported yet. */ - if (is_shift && VECTOR_MODE_P (mode)) + if (is_shift && (VECTOR_MODE_P (mode) + || ALL_FIXED_POINT_MODE_P (mode))) break; if (is_shift