diff options
author | Richard Guenther <rguenther@suse.de> | 2008-04-03 02:09:20 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@gcc.gnu.org> | 2008-04-03 02:09:20 +0000 |
commit | 55187c8a16273a21be18e982bc2389e534e48975 (patch) | |
tree | 27d6aeb3a7b64063a0e152660705ca93e4060509 /gcc/stmt.c | |
parent | d2cf5f997fa1a72e92b641dd42177ea7a98ae1a6 (diff) | |
download | gcc-55187c8a16273a21be18e982bc2389e534e48975.zip gcc-55187c8a16273a21be18e982bc2389e534e48975.tar.gz gcc-55187c8a16273a21be18e982bc2389e534e48975.tar.bz2 |
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
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r-- | gcc/stmt.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -2521,9 +2521,10 @@ expand_case (tree exp) } else { + rtx fallback_label = label_rtx (case_list->code_label); table_label = gen_label_rtx (); if (! try_casesi (index_type, index_expr, minval, range, - table_label, default_label)) + table_label, default_label, fallback_label)) { bool ok; @@ -2566,11 +2567,15 @@ expand_case (tree exp) = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label)); } - /* Fill in the gaps with the default. */ - if (default_label) - for (i = 0; i < ncases; i++) - if (labelvec[i] == 0) - labelvec[i] = gen_rtx_LABEL_REF (Pmode, default_label); + /* Fill in the gaps with the default. We may have gaps at + the beginning if we tried to avoid the minval subtraction, + so substitute some label even if the default label was + deemed unreachable. */ + 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. */ emit_label (table_label); |