Commit c1ceaaa6 by Richard Kenner

(copy_for_inline, case LABEL_REF): Properly copy LABEL_REF with LABEL_REF_NONLOCAL_P set.

(copy_for_inline, case LABEL_REF): Properly copy LABEL_REF
with LABEL_REF_NONLOCAL_P set.
Copy LABEL_OUTSIDE_LOOP_P flag.
(copy_rtx_and_substitute, case LABEL_REF): Likewise.
(copy_rtx_and_substitute, case CONST): Make recursive call for a LABEL_REF in
the constant pool.

From-SVN: r5034
parent a0a34f94
...@@ -988,11 +988,14 @@ copy_for_inline (orig) ...@@ -988,11 +988,14 @@ copy_for_inline (orig)
break; break;
case LABEL_REF: case LABEL_REF:
{ /* If this is a non-local label, just make a new LABEL_REF.
/* Must point to the new insn. */ Otherwise, use the new label as well. */
return gen_rtx (LABEL_REF, GET_MODE (orig), x = gen_rtx (LABEL_REF, GET_MODE (orig),
label_map[CODE_LABEL_NUMBER (XEXP (orig, 0))]); LABEL_REF_NONLOCAL_P (orig) ? XEXP (orig, 0)
} : label_map[CODE_LABEL_NUMBER (XEXP (orig, 0))]);
LABEL_REF_NONLOCAL_P (x) = LABEL_REF_NONLOCAL_P (orig);
LABEL_OUTSIDE_LOOP_P (x) = LABEL_OUTSIDE_LOOP_P (orig);
return x;
case REG: case REG:
if (REGNO (x) > LAST_VIRTUAL_REGISTER) if (REGNO (x) > LAST_VIRTUAL_REGISTER)
...@@ -2037,10 +2040,18 @@ copy_rtx_and_substitute (orig, map) ...@@ -2037,10 +2040,18 @@ copy_rtx_and_substitute (orig, map)
return map->label_map[CODE_LABEL_NUMBER (orig)]; return map->label_map[CODE_LABEL_NUMBER (orig)];
case LABEL_REF: case LABEL_REF:
copy = rtx_alloc (LABEL_REF); copy = gen_rtx (LABEL_REF, mode,
PUT_MODE (copy, mode); LABEL_REF_NONLOCAL_P (orig) ? XEXP (orig, 0)
XEXP (copy, 0) = map->label_map[CODE_LABEL_NUMBER (XEXP (orig, 0))]; : map->label_map[CODE_LABEL_NUMBER (XEXP (orig, 0))]);
LABEL_OUTSIDE_LOOP_P (copy) = LABEL_OUTSIDE_LOOP_P (orig); LABEL_OUTSIDE_LOOP_P (copy) = LABEL_OUTSIDE_LOOP_P (orig);
/* The fact that this label was previously nonlocal does not mean
it still is, so we must check if it is within the range of
this function's labels. */
LABEL_REF_NONLOCAL_P (copy)
= (LABEL_REF_NONLOCAL_P (orig)
&& ! (CODE_LABEL_NUMBER (XEXP (copy, 0)) >= get_first_label_num ()
&& CODE_LABEL_NUMBER (XEXP (copy, 0)) < max_label_num ()));
return copy; return copy;
case PC: case PC:
...@@ -2056,16 +2067,12 @@ copy_rtx_and_substitute (orig, map) ...@@ -2056,16 +2067,12 @@ copy_rtx_and_substitute (orig, map)
{ {
rtx constant = get_pool_constant (orig); rtx constant = get_pool_constant (orig);
if (GET_CODE (constant) == LABEL_REF) if (GET_CODE (constant) == LABEL_REF)
{ return XEXP (force_const_mem (Pmode,
copy = rtx_alloc (LABEL_REF); copy_rtx_and_substitute (constant,
PUT_MODE (copy, mode); map)),
XEXP (copy, 0) 0);
= map->label_map[CODE_LABEL_NUMBER (XEXP (constant, 0))];
LABEL_OUTSIDE_LOOP_P (copy) = LABEL_OUTSIDE_LOOP_P (orig);
copy = force_const_mem (Pmode, copy);
return XEXP (copy, 0);
}
} }
return orig; return orig;
case CONST_DOUBLE: case CONST_DOUBLE:
......
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