Commit 55187c8a by Richard Guenther Committed by Hans-Peter Nilsson

re PR middle-end/35800 (Revision 133835 failed to compile binutils)

	PR middle-end/35800
	* expr.h (try_casesi): Adjust prototype.
	* expr.c (try_casesi): Take fallback label as extra parameter.
	Use that for gen_casesi if default_label is NULL.
	* stmt.c (expand_case): Pass fallback label to try_casesi,
	make sure to fill gaps with a fallback label if default_label
	is not present.

From-SVN: r133857
parent d2cf5f99
2008-04-03 Richard Guenther <rguenther@suse.de>
PR middle-end/35800
* expr.h (try_casesi): Adjust prototype.
* expr.c (try_casesi): Take fallback label as extra parameter.
Use that for gen_casesi if default_label is NULL.
* stmt.c (expand_case): Pass fallback label to try_casesi,
make sure to fill gaps with a fallback label if default_label
is not present.
2008-04-03 Dominique d'Humieres <dominiq@lps.ens.fr> 2008-04-03 Dominique d'Humieres <dominiq@lps.ens.fr>
PR target/35801 PR target/35801
......
...@@ -9830,7 +9830,8 @@ case_values_threshold (void) ...@@ -9830,7 +9830,8 @@ case_values_threshold (void)
0 otherwise (i.e. if there is no casesi instruction). */ 0 otherwise (i.e. if there is no casesi instruction). */
int int
try_casesi (tree index_type, tree index_expr, tree minval, tree range, try_casesi (tree index_type, tree index_expr, tree minval, tree range,
rtx table_label ATTRIBUTE_UNUSED, rtx default_label) rtx table_label ATTRIBUTE_UNUSED, rtx default_label,
rtx fallback_label ATTRIBUTE_UNUSED)
{ {
enum machine_mode index_mode = SImode; enum machine_mode index_mode = SImode;
int index_bits = GET_MODE_BITSIZE (index_mode); int index_bits = GET_MODE_BITSIZE (index_mode);
...@@ -9894,7 +9895,8 @@ try_casesi (tree index_type, tree index_expr, tree minval, tree range, ...@@ -9894,7 +9895,8 @@ try_casesi (tree index_type, tree index_expr, tree minval, tree range,
op2 = copy_to_mode_reg (op_mode, op2); op2 = copy_to_mode_reg (op_mode, op2);
emit_jump_insn (gen_casesi (index, op1, op2, emit_jump_insn (gen_casesi (index, op1, op2,
table_label, default_label)); table_label, !default_label
? fallback_label : default_label));
return 1; return 1;
} }
......
...@@ -555,7 +555,7 @@ extern void do_compare_rtx_and_jump (rtx, rtx, enum rtx_code, int, ...@@ -555,7 +555,7 @@ extern void do_compare_rtx_and_jump (rtx, rtx, enum rtx_code, int,
enum machine_mode, rtx, rtx, rtx); enum machine_mode, rtx, rtx, rtx);
/* Two different ways of generating switch statements. */ /* Two different ways of generating switch statements. */
extern int try_casesi (tree, tree, tree, tree, rtx, rtx); extern int try_casesi (tree, tree, tree, tree, rtx, rtx, rtx);
extern int try_tablejump (tree, tree, tree, tree, rtx, rtx); extern int try_tablejump (tree, tree, tree, tree, rtx, rtx);
/* Smallest number of adjacent cases before we use a jump table. /* Smallest number of adjacent cases before we use a jump table.
......
...@@ -2521,9 +2521,10 @@ expand_case (tree exp) ...@@ -2521,9 +2521,10 @@ expand_case (tree exp)
} }
else else
{ {
rtx fallback_label = label_rtx (case_list->code_label);
table_label = gen_label_rtx (); table_label = gen_label_rtx ();
if (! try_casesi (index_type, index_expr, minval, range, if (! try_casesi (index_type, index_expr, minval, range,
table_label, default_label)) table_label, default_label, fallback_label))
{ {
bool ok; bool ok;
...@@ -2566,11 +2567,15 @@ expand_case (tree exp) ...@@ -2566,11 +2567,15 @@ expand_case (tree exp)
= gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label)); = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label));
} }
/* Fill in the gaps with the default. */ /* Fill in the gaps with the default. We may have gaps at
if (default_label) the beginning if we tried to avoid the minval subtraction,
for (i = 0; i < ncases; i++) so substitute some label even if the default label was
if (labelvec[i] == 0) deemed unreachable. */
labelvec[i] = gen_rtx_LABEL_REF (Pmode, default_label); if (!default_label)
default_label = fallback_label;
for (i = 0; i < ncases; i++)
if (labelvec[i] == 0)
labelvec[i] = gen_rtx_LABEL_REF (Pmode, default_label);
/* Output the table. */ /* Output the table. */
emit_label (table_label); emit_label (table_label);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment