Message ID | CAFiYyc1ABWuYFuDXyomhN3tG9GVyNavQCb2guY-P48ReXHhceg@mail.gmail.com |
---|---|
State | New |
Headers | show |
> Hm, but canonicalize_cond_expr_cond is supposed to produce a > tree that is suitable for a condition in a GIMPLE_COND, or a > COND_EXPR. So the issue is that it is used for a tcc_comparison > on a assignment RHS? It is called on (Ada_Boolean_Type) iftmp.xxx, which comes from the RHS of Ada_Boolean_Var = (Integer_Var != 0); > Wouldn't the "proper" fix then be to verify that the result from > forward_propagate_into_comparison_1 in forwprop is a suitable > replacement of the assign rhs in forward_propagate_into_comparison? Not clear whether it is the proper fix, as you explicitly pass the type in the call to forward_propagate_into_comparison_1 just above: tmp = forward_propagate_into_comparison_1 (stmt, gimple_assign_rhs_code (stmt), TREE_TYPE (gimple_assign_lhs (stmt)), rhs1, rhs2); and then to combine_cond_expr_cond, so you would expect that both functions return a tree with the specified type. But this would probably work, yes.
On Fri, Oct 7, 2011 at 1:37 PM, Eric Botcazou <ebotcazou@adacore.com> wrote: >> Hm, but canonicalize_cond_expr_cond is supposed to produce a >> tree that is suitable for a condition in a GIMPLE_COND, or a >> COND_EXPR. So the issue is that it is used for a tcc_comparison >> on a assignment RHS? > > It is called on (Ada_Boolean_Type) iftmp.xxx, which comes from the RHS of > > Ada_Boolean_Var = (Integer_Var != 0); > >> Wouldn't the "proper" fix then be to verify that the result from >> forward_propagate_into_comparison_1 in forwprop is a suitable >> replacement of the assign rhs in forward_propagate_into_comparison? > > Not clear whether it is the proper fix, as you explicitly pass the type in the > call to forward_propagate_into_comparison_1 just above: > > tmp = forward_propagate_into_comparison_1 (stmt, > gimple_assign_rhs_code (stmt), > TREE_TYPE > (gimple_assign_lhs (stmt)), > rhs1, rhs2); > > and then to combine_cond_expr_cond, so you would expect that both functions > return a tree with the specified type. But this would probably work, yes. Yeah, it uses the type to do t = fold_binary_loc (gimple_location (stmt), code, type, op0, op1); and using the "original type" is surely the best idea for that. It could also simply use boolean_type_node nowadays, not sure if that would cause more fails on the type checking that is needed in forward_propagate_into_comparison. I suppose at most for Ada, so maybe you can check that. If it doesn't make a difference then stripping the type argument from the call chain and using boolean_type_node in combine_cond_expr_cond would be a good cleanup. But the original suggested patch is ok if it bootstraps & tests if you just want to go forward. Thanks, Richard. > -- > Eric Botcazou >
Index: gcc/tree-ssa-forwprop.c =================================================================== --- gcc/tree-ssa-forwprop.c (revision 179647) +++ gcc/tree-ssa-forwprop.c (working copy) @@ -474,7 +474,9 @@ forward_propagate_into_comparison (gimpl TREE_TYPE (gimple_assign_lhs (stmt)), rhs1, rhs2); - if (tmp) + if (tmp + && useless_type_conversion_p (TREE_TYPE (gimple_assign_lhs (stmt)), + TREE_TYPE (tmp))) { gimple_assign_set_rhs_from_tree (gsi, tmp); fold_stmt (gsi);