Fix gimple_expr_code?
Richard Biener
richard.guenther@gmail.com
Thu Nov 12 20:53:17 GMT 2020
On November 12, 2020 9:43:52 PM GMT+01:00, Andrew MacLeod via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
>So I spent some time tracking down a ranger issue, and in the end, it
>boiled down to the range-op handler not being picked up properly.
>
>The handler is picked up by:
>
> if ((gimple_code (s) == GIMPLE_ASSIGN) || (gimple_code (s) ==
>GIMPLE_COND))
> return range_op_handler (gimple_expr_code (s), gimple_expr_type
>(s));
IMHO this should use more specific functions. Gimple_expr_code should go away similar to gimple_expr_type.
>where it is indexing the table with the gimple_expr_code..
>the stmt being processed was for a pointer assignment,
> _5 = _33
>and it was coming back with a gimple_expr_code of VAR_DECL instead of
>an SSA_NAME... which confused me greatly.
>
>
>gimple_expr_code (const gimple *stmt)
>{
> enum gimple_code code = gimple_code (stmt);
> if (code == GIMPLE_ASSIGN || code == GIMPLE_COND)
> return (enum tree_code) stmt->subcode;
>
>A little more digging shows this:
>
>static inline enum tree_code
>gimple_assign_rhs_code (const gassign *gs)
>{
> enum tree_code code = (enum tree_code) gs->subcode;
> /* While we initially set subcode to the TREE_CODE of the rhs for
> GIMPLE_SINGLE_RHS assigns we do not update that subcode to stay
> in sync when we rewrite stmts into SSA form or do SSA
>propagations. */
> if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS)
> code = TREE_CODE (gs->op[1]);
>
> return code;
>}
>
>Fascinating comment.
... 😬
>But it means that gimple_expr_code() isn't returning the correct result
>
>for GIMPLE_SINGLE_RHS....
It depends. A SSA name isn't an expression code either. As said, the generic gimple_expr_code should be used with extreme care.
>Wouldn't it make sense that gimple_expr_code be changed to return
>gimple_assign_rhs_code() for GIMPLE_ASSIGN?
>
>I tested the attached patch, and it bootstraps and passes regression
>tests.
>
>There aren't a lot of places where its used, but I saw a suspicious bit
>
>in ipa-icf-gimple.c that looks like it is working around this?
>
>
> bool
> func_checker::compare_gimple_assign (gimple *s1, gimple *s2)
> {
> tree arg1, arg2;
> tree_code code1, code2;
> unsigned i;
>
> code1 = gimple_expr_code (s1);
> code2 = gimple_expr_code (s2);
>
> if (code1 != code2)
> return false;
>
> code1 = gimple_assign_rhs_code (s1);
> code2 = gimple_assign_rhs_code (s2);
>
> if (code1 != code2)
> return false;
>
>
>and there were one or two other places where SSA_NAME occurred in the
>cases of a switch after calling gimple_expr_code().
>
>This seems like it should be the right thing?
>Andrew
More information about the Gcc-patches
mailing list