https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116510

--- Comment #8 from rguenther at suse dot de <rguenther at suse dot de> ---
On Wed, 28 Aug 2024, pinskia at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116510
> 
> --- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
> #6  0x000000000187822c in gimple_simplify_226 (res_op=0x7fffffffcd00,
> seq=0x7fffffffced0, valueize=0xd13880 <no_follow_ssa_edges(tree_node*)>,
> type=0x7ffff741cb28, captures=0x7fffffffa160, cmp=EQ_EXPR) at
> gimple-match-9.cc:1994
> 1994      if (wi::bit_and_not (wi::to_wide (captures[1]), get_nonzero_bits
> (captures[0])) != 0
> (gdb) p debug_tree(captures[1])
>  <integer_cst 0x7ffff730fb40 type <integer_type 0x7ffff741c348 unsigned char>
> constant 92>
> $1 = void
> (gdb) p debug_tree(captures[0])
>  <ssa_name 0x7ffff73086c0
>     type <integer_type 0x7ffff741c5e8 int public SI
>         size <integer_cst 0x7ffff741f168 constant 32>
>         unit-size <integer_cst 0x7ffff741f180 constant 4>
>         align:32 warn_if_not_align:0 symtab:0 alias-set 1 canonical-type
> 0x7ffff741c5e8 precision:32 min <integer_cst 0x7ffff741f120 -2147483648> max
> <integer_cst 0x7ffff741f138 2147483647>
>         pointer_to_this <pointer_type 0x7ffff7424b28>>
>     visited
>     def_stmt _8 = gg_strescape_i.2_11 & 255;
>     version:8
>     ptr-info 0x7ffff733ddb0>
> 
> ...
> (gdb) p debug_tree(switch_cond)
>  <truth_not_expr 0x7ffff73513a0
>     type <boolean_type 0x7ffff741cb28 _Bool public unsigned QI
>         size <integer_cst 0x7ffff741f018 constant 8>
>         unit-size <integer_cst 0x7ffff741f030 constant 1>
>         align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
> 0x7ffff741cb28 precision:1 min <integer_cst 0x7ffff741f270 0> max <integer_cst
> 0x7ffff741f2a0 1>>
> 
>     arg:0 <bit_ior_expr 0x7ffff7354320 type <boolean_type 0x7ffff741cb28 
> _Bool>
> 
>         arg:0 <eq_expr 0x7ffff7354348 type <boolean_type 0x7ffff741cb28 _Bool>
> 
>             arg:0 <ssa_name 0x7ffff73086c0 type <integer_type 0x7ffff741c5e8
> int>
>                 visited
>                 def_stmt _8 = gg_strescape_i.2_11 & 255;
>                 version:8
>                 ptr-info 0x7ffff733ddb0>
>             arg:1 <integer_cst 0x7ffff730fb40 constant 92>
>             t5.c:6:5 start: t5.c:6:5 finish: t5.c:6:10>
>         arg:1 <eq_expr 0x7ffff7354370 type <boolean_type 0x7ffff741cb28 _Bool>
>             arg:0 <ssa_name 0x7ffff73086c0>
>             arg:1 <integer_cst 0x7ffff730fb58 constant 34>
>             t5.c:6:5 start: t5.c:6:5 finish: t5.c:6:10>
>         t5.c:6:5 start: t5.c:6:5 finish: t5.c:6:10>
>     t5.c:6:5 start: t5.c:6:5 finish: t5.c:6:10>
> 
> (gdb) p debug_tree((tree)0x7ffff730fb40)
>  <integer_cst 0x7ffff730fb40 type <integer_type 0x7ffff741c348 unsigned char>
> constant 92>
> 
> 
> CASE_HIGH/CASE_LOW have a type of `unsigned char` but index is type of `int`.
> 
> 
> There is a missing fold_convert in the predicate_bbs on CASE_HIGH/CASE_LOW.
> 
> Note one more thing:
> +                 tree low = build2_loc (loc, GE_EXPR,
> +                                        boolean_type_node,
> +                                        index, CASE_LOW (label));
> +                 tree high = build2_loc (loc, LE_EXPR,
> +                                         boolean_type_node,
> +                                         index, CASE_HIGH (label));
> +                 case_cond = build2_loc (loc, TRUTH_AND_EXPR,
> +                                         boolean_type_node,
> +                                         low, high);
> 
> Why use TRUTH_AND_EXPR here, just use AND_EXPR .
> 
> Likewise, use TRUTH_NOT_EXPR.
> 
> +         switch_cond = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node,
> +                                   unshare_expr (switch_cond));
> 
> Also why not do something like what is done in convert_single_case_switch ?

Note this is what ifcvt requires internally, so I'd rather not change
this just in this isolated place.

Reply via email to