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.