On Tue, 5 Dec 2023, Jakub Jelinek wrote:

> Hi!
> 
> As discussed in the PR, for the middle (on x86-64 65..128 bit) _BitInt
> types like
>   _1 = x_4(D) * 5;
> where _1 and x_4(D) have _BitInt(128) type and x is PARM_DECL, the bitint
> lowering pass wants to replace this with
>   _13 = (int128_t) x_4(D);
>   _12 = _13 * 5;
>   _1 = (_BitInt(128)) _12;
> where _13 and _12 have int128_t type and the ranger ICEs when the IL is
> temporarily invalid:
> during GIMPLE pass: bitintlower
> pr112843.c: In function ?foo?:
> pr112843.c:7:1: internal compiler error: Segmentation fault
>     7 | foo (_BitInt (128) x, _BitInt (256) y)
>       | ^~~
> 0x152943f crash_signal
>       ../../gcc/toplev.cc:316
> 0x25c21c8 ranger_cache::range_of_expr(vrange&, tree_node*, gimple*)
>       ../../gcc/gimple-range-cache.cc:1204
> 0x25cdcf9 fold_using_range::range_of_range_op(vrange&, 
> gimple_range_op_handler&, fur_source&)
>       ../../gcc/gimple-range-fold.cc:671
> 0x25cf9a0 fold_using_range::fold_stmt(vrange&, gimple*, fur_source&, 
> tree_node*)
>       ../../gcc/gimple-range-fold.cc:602
> 0x25b5520 gimple_ranger::update_stmt(gimple*)
>       ../../gcc/gimple-range.cc:564
> 0x16f1234 update_stmt_operands(function*, gimple*)
>       ../../gcc/tree-ssa-operands.cc:1150
> 0x117a5b6 update_stmt_if_modified(gimple*)
>       ../../gcc/gimple-ssa.h:187
> 0x117a5b6 update_stmt_if_modified(gimple*)
>       ../../gcc/gimple-ssa.h:184
> 0x117a5b6 update_modified_stmt
>       ../../gcc/gimple-iterator.cc:44
> 0x117a5b6 gsi_insert_after(gimple_stmt_iterator*, gimple*, 
> gsi_iterator_update)
>       ../../gcc/gimple-iterator.cc:544
> 0x25abc2f gimple_lower_bitint
>       ../../gcc/gimple-lower-bitint.cc:6348
> 
> What the code does right now is, it first creates a new SSA_NAME (_12
> above), adds the
>   _1 = (_BitInt(128)) _12;
> stmt after it (where it crashes, because _12 has no SSA_NAME_DEF_STMT yet),
> then sets lhs of the previous stmt to _12 (this is also temporarily
> incorrect, there are incompatible types involved in the stmt), later on
> changes also operands and finally update_stmt it.
> 
> The following patch instead changes the lhs of the stmt before adding the
> cast after it.  The question is if this is less or more wrong temporarily
> (but the ICE is gone).
> Yet another possibility would be to first adjust the operands of stmt
> (without update_stmt), then set_lhs to a new lhs (still without
> update_stmt), then add the cast after it and finally update_stmt (stmt).
> Maybe that would be less wrong (still, before it is updated some chains
> might think it is still the setter of _1 when it is not anymore).
> Anyway, should I go with that order then instead of the patch below?

There isn't really anything "wrong" with the code.  All stmt modification
is stmt-local, so is (or rather should be ...) update_stmt.

So the question is more one of readability of the code performing the
update, not how intermediate states of GIMPLE look like.

I have meanwhile successfully tested removal of that
range_query->update_stmt call in update_stmt_operands and will push it
after writing a changelog entry.

As for the patch whatever you think improves readability should be OK.

Richard.

> The reason I tweaked the lhs first is that it then just uses gimple_op and
> iterates over all ops, if that is done before lhs it would need to special
> case which op to skip because it is lhs (I'm using gimple_get_lhs for the
> lhs, but this isn't done for GIMPLE_CALL nor GIMPLE_PHI, so GIMPLE_ASSIGN
> or say GIMPLE_GOTO etc. are the only options, so I could just start with
> op 1 rather than 0 for is_gimple_assign).
> 
> 2023-12-04  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/112843
>       * gimple-lower-bitint.cc (gimple_lower_bitint): Change lhs of stmt
>       to lhs2 before building and inserting lhs = (cast) lhs2; assignment.
> 
>       * gcc.dg/bitint-47.c: New test.
> 
> --- gcc/gimple-lower-bitint.cc.jj     2023-12-03 17:53:55.604855552 +0100
> +++ gcc/gimple-lower-bitint.cc        2023-12-04 14:39:20.352057389 +0100
> @@ -6338,6 +6338,7 @@ gimple_lower_bitint (void)
>                   int uns = TYPE_UNSIGNED (TREE_TYPE (lhs));
>                   type = build_nonstandard_integer_type (prec, uns);
>                   tree lhs2 = make_ssa_name (type);
> +                 gimple_set_lhs (stmt, lhs2);
>                   gimple *g = gimple_build_assign (lhs, NOP_EXPR, lhs2);
>                   if (stmt_ends_bb_p (stmt))
>                     {
> @@ -6346,7 +6347,6 @@ gimple_lower_bitint (void)
>                     }
>                   else
>                     gsi_insert_after (&gsi, g, GSI_SAME_STMT);
> -                 gimple_set_lhs (stmt, lhs2);
>                 }
>             unsigned int nops = gimple_num_ops (stmt);
>             for (unsigned int i = 0; i < nops; ++i)
> --- gcc/testsuite/gcc.dg/bitint-47.c.jj       2023-12-04 14:53:19.784200724 
> +0100
> +++ gcc/testsuite/gcc.dg/bitint-47.c  2023-12-04 14:42:07.251699994 +0100
> @@ -0,0 +1,13 @@
> +/* PR tree-optimization/112843 */
> +/* { dg-do compile { target bitint } } */
> +/* { dg-options "-O2" } */
> +
> +#if __BITINT_MAXWIDTH__ >= 256
> +_BitInt (256)
> +foo (_BitInt (128) x, _BitInt (256) y)
> +{
> +  return x * 5 * y;
> +}
> +#else
> +int x;
> +#endif
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to