On Fri, Jun 16, 2017 at 5:48 PM, Marc Glisse <[email protected]> wrote:
> On Fri, 16 Jun 2017, Bin.Cheng wrote:
>
>> On Fri, Jun 16, 2017 at 5:16 PM, Richard Biener
>> <[email protected]> wrote:
>>>
>>>
>>> That means we miss a pattern in match.PD to handle this case.
>>
>> I see. I will withdraw this patch and look in that direction.
>
>
> For _123, we have
>
> /* (A +- CST1) +- CST2 -> A + CST3
> or
> /* Associate (p +p off1) +p off2 as (p +p (off1 + off2)). */
>
>
> For _115, we have
>
> /* min (a, a + CST) -> a where CST is positive. */
> /* min (a, a + CST) -> a + CST where CST is negative. */
> (simplify
> (min:c @0 (plus@2 @0 INTEGER_CST@1))
> (if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)))
> (if (tree_int_cst_sgn (@1) > 0)
> @0
> @2)))
>
> What is the type of all those SSA_NAMEs?
Hi,
>From the debugging process, there are two issues preventing "(A +-
CST1) +- CST2 -> A + CST3" from being applied:
A) before we reach this pattern, there is pattern:
/* A - B -> A + (-B) if B is easily negatable. */
(simplify
(minus @0 negate_expr_p@1)
(if (!FIXED_POINT_TYPE_P (type))
(plus @0 (negate @1))))
which is matched and returned in gimple_simplify_MINUS_EXPR. So does
pattern order matter here?
B) When folding "_124 - 1" on the basis of existing stmts sequence
like "_124 = _197 + 1;". The corresponding gimple-match.c code is
like:
if (gimple_nop_convert (op0, op0_pops, valueize))
{
tree o20 = op0_pops[0];
switch (TREE_CODE (o20))
{
case SSA_NAME:
if (do_valueize (valueize, o20) != NULL_TREE)
{
gimple *def_stmt = SSA_NAME_DEF_STMT (o20);
if (gassign *def = dyn_cast <gassign *> (def_stmt))
switch (gimple_assign_rhs_code (def))
{
case PLUS_EXPR:
{
tree o30 = gimple_assign_rhs1 (def);
if ((o30 = do_valueize (valueize, o30)))
{
tree o31 = gimple_assign_rhs2 (def);
if ((o31 = do_valueize (valueize, o31)))
{
if (tree_swap_operands_p (o30, o31))
std::swap (o30, o31);
if (CONSTANT_CLASS_P (o31))
{
if (CONSTANT_CLASS_P (op1))
{
{
/* #line 1392 "../../gcc/gcc/match.pd" */
tree captures[3] ATTRIBUTE_UNUSED = { o30, o31, op1 };
if (gimple_simplify_194 (res_code, res_ops, seq,
valueize, type, captures, PLUS_EXPR, MINUS_EXPR, MINUS_EXPR))
return true;
}
}
}
}
}
break;
}
Note we have:
(gdb) call debug_generic_expr(op0)
_124
(gdb) call debug_generic_expr(op1)
1
(gdb) call debug_gimple_stmt(def_stmt)
_124 = _197 + 1;
(gdb) call debug_generic_expr(o30)
_197
But since definition of _197 isn't in current stmt sequence, call "o31
= do_valueize (valueize, o31)" will return NULL. As a result, it's
not matched.
Any ideas? Thanks.
Thanks,
bin