https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116510
--- Comment #12 from ak at gcc dot gnu.org --- Like this? It fixes the test case. I'm not sure why you want AND_EXPR, this is a truth formula. Maybe it should be TRUTH_ANDIF_EXPR though to short circuit. diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc index 90c754a48147..376a4642954d 100644 --- a/gcc/tree-if-conv.cc +++ b/gcc/tree-if-conv.cc @@ -1477,10 +1477,12 @@ predicate_bbs (loop_p loop) { tree low = build2_loc (loc, GE_EXPR, boolean_type_node, - index, CASE_LOW (label)); + index, fold_convert_loc (loc, TREE_TYPE (index), + CASE_LOW (label))); tree high = build2_loc (loc, LE_EXPR, boolean_type_node, - index, CASE_HIGH (label)); + index, fold_convert_loc (loc, TREE_TYPE (index), + CASE_HIGH (label))); case_cond = build2_loc (loc, TRUTH_AND_EXPR, boolean_type_node, low, high); @@ -1489,7 +1491,8 @@ predicate_bbs (loop_p loop) case_cond = build2_loc (loc, EQ_EXPR, boolean_type_node, index, - CASE_LOW (gimple_switch_label (sw, i))); + fold_convert_loc (loc, TREE_TYPE (index), + CASE_LOW (label))); if (i > 1) switch_cond = build2_loc (loc, TRUTH_OR_EXPR, boolean_type_node,