Commit 1b0cb6fc by Richard Kenner

(expand_end_case): Use old type of INDEX_EXPR when making a constant.

From-SVN: r7359
parent 3061cc54
...@@ -4214,7 +4214,7 @@ expand_end_case (orig_index) ...@@ -4214,7 +4214,7 @@ expand_end_case (orig_index)
register int i; register int i;
rtx before_case; rtx before_case;
register struct nesting *thiscase = case_stack; register struct nesting *thiscase = case_stack;
tree index_expr; tree index_expr, index_type;
int unsignedp; int unsignedp;
if (output_bytecode) if (output_bytecode)
...@@ -4225,12 +4225,13 @@ expand_end_case (orig_index) ...@@ -4225,12 +4225,13 @@ expand_end_case (orig_index)
table_label = gen_label_rtx (); table_label = gen_label_rtx ();
index_expr = thiscase->data.case_stmt.index_expr; index_expr = thiscase->data.case_stmt.index_expr;
unsignedp = TREE_UNSIGNED (TREE_TYPE (index_expr)); index_type = TREE_TYPE (index_expr);
unsignedp = TREE_UNSIGNED (index_type);
do_pending_stack_adjust (); do_pending_stack_adjust ();
/* An ERROR_MARK occurs for various reasons including invalid data type. */ /* An ERROR_MARK occurs for various reasons including invalid data type. */
if (TREE_TYPE (index_expr) != error_mark_node) if (index_type != error_mark_node)
{ {
/* If switch expression was an enumerated type, check that all /* If switch expression was an enumerated type, check that all
enumeration literals are covered by the cases. enumeration literals are covered by the cases.
...@@ -4284,8 +4285,8 @@ expand_end_case (orig_index) ...@@ -4284,8 +4285,8 @@ expand_end_case (orig_index)
if (TREE_CODE (n->high) != INTEGER_CST) if (TREE_CODE (n->high) != INTEGER_CST)
abort (); abort ();
n->low = convert (TREE_TYPE (index_expr), n->low); n->low = convert (index_type, n->low);
n->high = convert (TREE_TYPE (index_expr), n->high); n->high = convert (index_type, n->high);
/* Count the elements and track the largest and smallest /* Count the elements and track the largest and smallest
of them (treating them as signed even if they are not). */ of them (treating them as signed even if they are not). */
...@@ -4310,10 +4311,9 @@ expand_end_case (orig_index) ...@@ -4310,10 +4311,9 @@ expand_end_case (orig_index)
/* Compute span of values. */ /* Compute span of values. */
if (count != 0) if (count != 0)
range = fold (build (MINUS_EXPR, TREE_TYPE (index_expr), range = fold (build (MINUS_EXPR, index_type, maxval, minval));
maxval, minval));
if (count == 0 || TREE_CODE (TREE_TYPE (index_expr)) == ERROR_MARK) if (count == 0)
{ {
expand_expr (index_expr, const0_rtx, VOIDmode, 0); expand_expr (index_expr, const0_rtx, VOIDmode, 0);
emit_queue (); emit_queue ();
...@@ -4387,7 +4387,7 @@ expand_end_case (orig_index) ...@@ -4387,7 +4387,7 @@ expand_end_case (orig_index)
index_expr index_expr
= build_int_2 (INTVAL (index), = build_int_2 (INTVAL (index),
unsignedp || INTVAL (index) >= 0 ? 0 : -1); unsignedp || INTVAL (index) >= 0 ? 0 : -1);
index_expr = convert (TREE_TYPE (index_expr), index_expr); index_expr = convert (index_type, index_expr);
} }
/* For constant index expressions we need only /* For constant index expressions we need only
...@@ -4395,14 +4395,11 @@ expand_end_case (orig_index) ...@@ -4395,14 +4395,11 @@ expand_end_case (orig_index)
target code. The job of removing any unreachable target code. The job of removing any unreachable
code is left to the optimisation phase if the code is left to the optimisation phase if the
"-O" option is specified. */ "-O" option is specified. */
for (n = thiscase->data.case_stmt.case_list; for (n = thiscase->data.case_stmt.case_list; n; n = n->right)
n;
n = n->right)
{
if (! tree_int_cst_lt (index_expr, n->low) if (! tree_int_cst_lt (index_expr, n->low)
&& ! tree_int_cst_lt (n->high, index_expr)) && ! tree_int_cst_lt (n->high, index_expr))
break; break;
}
if (n) if (n)
emit_jump (label_rtx (n->code_label)); emit_jump (label_rtx (n->code_label));
else else
...@@ -4430,7 +4427,7 @@ expand_end_case (orig_index) ...@@ -4430,7 +4427,7 @@ expand_end_case (orig_index)
balance_case_nodes (&thiscase->data.case_stmt.case_list, balance_case_nodes (&thiscase->data.case_stmt.case_list,
NULL_PTR); NULL_PTR);
emit_case_nodes (index, thiscase->data.case_stmt.case_list, emit_case_nodes (index, thiscase->data.case_stmt.case_list,
default_label, TREE_TYPE (index_expr)); default_label, index_type);
emit_jump_if_reachable (default_label); emit_jump_if_reachable (default_label);
} }
} }
...@@ -4446,14 +4443,14 @@ expand_end_case (orig_index) ...@@ -4446,14 +4443,14 @@ expand_end_case (orig_index)
enum machine_mode op_mode; enum machine_mode op_mode;
/* Convert the index to SImode. */ /* Convert the index to SImode. */
if (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (index_expr))) if (GET_MODE_BITSIZE (TYPE_MODE (index_type))
> GET_MODE_BITSIZE (index_mode)) > GET_MODE_BITSIZE (index_mode))
{ {
enum machine_mode omode = TYPE_MODE (TREE_TYPE (index_expr)); enum machine_mode omode = TYPE_MODE (index_type);
rtx rangertx = expand_expr (range, NULL_RTX, VOIDmode, 0); rtx rangertx = expand_expr (range, NULL_RTX, VOIDmode, 0);
/* We must handle the endpoints in the original mode. */ /* We must handle the endpoints in the original mode. */
index_expr = build (MINUS_EXPR, TREE_TYPE (index_expr), index_expr = build (MINUS_EXPR, index_type,
index_expr, minval); index_expr, minval);
minval = integer_zero_node; minval = integer_zero_node;
index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0); index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
...@@ -4464,7 +4461,7 @@ expand_end_case (orig_index) ...@@ -4464,7 +4461,7 @@ expand_end_case (orig_index)
} }
else else
{ {
if (TYPE_MODE (TREE_TYPE (index_expr)) != index_mode) if (TYPE_MODE (index_type) != index_mode)
index_expr = convert (type_for_size (index_bits, 0), index_expr = convert (type_for_size (index_bits, 0),
index_expr); index_expr);
index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0); index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
...@@ -4501,15 +4498,14 @@ expand_end_case (orig_index) ...@@ -4501,15 +4498,14 @@ expand_end_case (orig_index)
if (! win && HAVE_tablejump) if (! win && HAVE_tablejump)
{ {
index_expr = convert (thiscase->data.case_stmt.nominal_type, index_expr = convert (thiscase->data.case_stmt.nominal_type,
fold (build (MINUS_EXPR, fold (build (MINUS_EXPR, index_type,
TREE_TYPE (index_expr),
index_expr, minval))); index_expr, minval)));
index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0); index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
emit_queue (); emit_queue ();
index = protect_from_queue (index, 0); index = protect_from_queue (index, 0);
do_pending_stack_adjust (); do_pending_stack_adjust ();
do_tablejump (index, TYPE_MODE (TREE_TYPE (index_expr)), do_tablejump (index, TYPE_MODE (index_type),
expand_expr (range, NULL_RTX, VOIDmode, 0), expand_expr (range, NULL_RTX, VOIDmode, 0),
table_label, default_label); table_label, default_label);
win = 1; win = 1;
...@@ -4576,6 +4572,7 @@ expand_end_case (orig_index) ...@@ -4576,6 +4572,7 @@ expand_end_case (orig_index)
reorder_insns (before_case, get_last_insn (), reorder_insns (before_case, get_last_insn (),
thiscase->data.case_stmt.start); thiscase->data.case_stmt.start);
} }
if (thiscase->exit_label) if (thiscase->exit_label)
emit_label (thiscase->exit_label); emit_label (thiscase->exit_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