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 ?

Reply via email to