This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[commit] Fix SPU breakage (Re: [patch] Stop using JUMP_INSN for jump table data)
- From: "Ulrich Weigand" <uweigand at de dot ibm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: stevenb dot gcc at gmail dot com
- Date: Wed, 3 Apr 2013 14:21:20 +0200 (CEST)
- Subject: [commit] Fix SPU breakage (Re: [patch] Stop using JUMP_INSN for jump table data)
Steven Bosscher wrote:
> GCC uses fake JUMP_INSNs as placeholders for jump table data. These
> JUMP_INSNs have an ADDR_VEC or ADDR_DIFF_VEC as PATTERN, but they are
> not real instructions and they are not inside basic blocks. This
> results in special-casing JUMP_P insns in various places throughout
> the compiler.
>
> The attached patch adds a new object, JUMP_TABLE_DATA, to hold jump
> table data. All remaining JUMP_P insns will be real insns, which helps
> simplify things a bit -- or at least make things more intuitive.
This broke the SPU target. The emit_nop_for_insn routine needs to handle
jump tables as well, but performs operations that now no longer work on
the new JUMP_TABLE_DATA object (in particular getting attributes,
inspecting INSN_LOCATION).
Fix this by handling JUMP_TABLE_DATA separately from real insns.
Tested on spu-elf. Committed to mainline.
Bye,
Ulrich
ChangeLog:
* config/spu/spu.c (emit_nop_for_insn): Handle JUMP_TABLE_DATA.
Index: gcc/config/spu/spu.c
===================================================================
*** gcc/config/spu/spu.c (revision 197352)
--- gcc/config/spu/spu.c (working copy)
*************** static struct spu_bb_info *spu_bb_info;
*** 1978,1990 ****
/* Emit a nop for INSN such that the two will dual issue. This assumes
INSN is 8-byte aligned. When INSN is inline asm we emit an lnop.
We check for TImode to handle a MULTI1 insn which has dual issued its
! first instruction. get_pipe returns -1 for MULTI0, inline asm, or
! ADDR_VEC insns. */
static void
emit_nop_for_insn (rtx insn)
{
int p;
rtx new_insn;
p = get_pipe (insn);
if ((CALL_P (insn) || JUMP_P (insn)) && SCHED_ON_EVEN_P (insn))
new_insn = emit_insn_after (gen_lnop (), insn);
--- 1978,1999 ----
/* Emit a nop for INSN such that the two will dual issue. This assumes
INSN is 8-byte aligned. When INSN is inline asm we emit an lnop.
We check for TImode to handle a MULTI1 insn which has dual issued its
! first instruction. get_pipe returns -1 for MULTI0 or inline asm. */
static void
emit_nop_for_insn (rtx insn)
{
int p;
rtx new_insn;
+
+ /* We need to handle JUMP_TABLE_DATA separately. */
+ if (JUMP_TABLE_DATA_P (insn))
+ {
+ new_insn = emit_insn_after (gen_lnop(), insn);
+ recog_memoized (new_insn);
+ INSN_LOCATION (new_insn) = UNKNOWN_LOCATION;
+ return;
+ }
+
p = get_pipe (insn);
if ((CALL_P (insn) || JUMP_P (insn)) && SCHED_ON_EVEN_P (insn))
new_insn = emit_insn_after (gen_lnop (), insn);
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
Ulrich.Weigand@de.ibm.com