On Mon, Mar 25, 2013 at 12:08 PM, Jeff Law <l...@redhat.com> wrote:
> On 03/21/2013 03:44 AM, Richard Biener wrote:
>>>
>>> +         /* If LHS is an SSA_NAME and RHS is a constant and LHS was set
>>> +            via a widening type conversion, then we may be able to
>>> record
>>> +            additional equivalences.  */
>>> +         if (lhs
>>> +             && TREE_CODE (lhs) == SSA_NAME
>>> +             && is_gimple_constant (rhs))
>>> +           {
>>> +             gimple defstmt = SSA_NAME_DEF_STMT (lhs);
>>> +
>>> +             if (defstmt
>>> +                 && is_gimple_assign (defstmt)
>>> +                 && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code
>>> (defstmt)))
>>> +               {
>>> +                 tree old_rhs = gimple_assign_rhs1 (defstmt);
>>> +                 tree newval = fold_convert (TREE_TYPE (old_rhs), rhs);
>>
>>
>> You want to delay that folding and creating of a new tree node until after
>> ...
>>
>>> +
>>> +                 /* If this was a widening conversion and if RHS is
>>> converted
>>> +                    to the type of OLD_RHS and has the same value, then
>>> we
>>> +                    can record an equivalence between OLD_RHS and the
>>> +                    converted representation of RHS.  */
>>> +                 if ((TYPE_PRECISION (TREE_TYPE (lhs))
>>> +                      > TYPE_PRECISION (TREE_TYPE (old_rhs)))
>>
>>
>> ... this check.
>>
>>> +                     && operand_equal_p (rhs, newval, 0))
>>
>>
>> If you'd restricted yourself to handling INTEGER_CSTs then using
>> int_fits_type_p (rhs, TREE_TYPE (lhs)) would have been enough to check.
>>
>> And operand_equal_p will never return for non-equal typed non-INTEGER_CSTs
>> anyway ...
>
> Agreed.  Addressed via the attached patch which was committed after a
> bootstrap and regression test on x86_64-unknown-linux-gnu.
>
>
>
> diff --git a/gcc/ChangeLog b/gcc/ChangeLog
> index 9bdf1e5..9db0629 100644
> --- a/gcc/ChangeLog
> +++ b/gcc/ChangeLog
> @@ -1,3 +1,9 @@
> +2013-03-25  Jeff Law  <l...@redhat.com>
> +
> +       * tree-ssa-dom.c (record_equivalences_from_incoming_edge): Rework
> +       slightly to avoid creating and folding useless trees.  Simplify
> +       slightly by restricting to INTEGER_CSTs and using int_fits_type_p.
> +
>  2013-03-25  Uros Bizjak  <ubiz...@gmail.com>
>

This breaks the bootstrap on Linux/x86:

http://gcc.gnu.org/ml/gcc-regression/2013-03/msg00148.html

../../../../../src-trunk/libstdc++-v3/src/c++98/mt_allocator.cc: In
member function 'std::size_t
__gnu_cxx::__pool<true>::_M_get_thread_id()':
../../../../../src-trunk/libstdc++-v3/src/c++98/mt_allocator.cc:620:3:
internal compiler error: tree check: expected integer_type or
enumeral_type or boolean_type or real_type or fixed_point_type, have
pointer_type in int_fits_type_p, at tree.c:8325
   __pool<true>::_M_get_thread_id()
   ^
0x8ad2cef tree_check_failed(tree_node const*, char const*, int, char
const*, ...)
        ../../src-trunk/gcc/tree.c:8947
0x81ba464 tree_check5(tree_node const*, char const*, int, char const*,
tree_code, tree_code, tree_code, tree_code, tree_code)
        ../../src-trunk/gcc/tree.h:3987
0x8ad058d int_fits_type_p(tree_node const*, tree_node const*)
        ../../src-trunk/gcc/tree.c:8325
0x897363b record_equivalences_from_incoming_edge
        ../../src-trunk/gcc/tree-ssa-dom.c:1156
0x8977b5e dom_opt_enter_block
        ../../src-trunk/gcc/tree-ssa-dom.c:1769
0x8dccddd walk_dominator_tree(dom_walk_data*, basic_block_def*)
        ../../src-trunk/gcc/domwalk.c:210
0x8972b9c tree_ssa_dominator_optimize
        ../../src-trunk/gcc/tree-ssa-dom.c:762
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.

-- 
H.J.

Reply via email to