This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Committed] S/390: PR57609 fix - use next_active_insn instead of next_real_insn
- From: Andreas Krebbel <krebbel at linux dot vnet dot ibm dot com>
- To: Steven Bosscher <stevenb dot gcc at gmail dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 18 Jun 2013 14:17:54 +0200
- Subject: Re: [Committed] S/390: PR57609 fix - use next_active_insn instead of next_real_insn
- References: <20130618085730 dot GA17947 at bart> <CABu31nN--z7tOCLEbvicg1+J6m0_ZSscaRtnhNxW3oMKn1nfDA at mail dot gmail dot com>
On Tue, Jun 18, 2013 at 10:59:56AM +0200, Steven Bosscher wrote:
> On Tue, Jun 18, 2013 at 10:57 AM, Andreas Krebbel
> <krebbel@linux.vnet.ibm.com> wrote:
> > Hi,
> >
> > the patch replaces next_real_insn with next_active_insn when checking
> > for JUMP TABLE insns.
> >
> > This fixes ESA mode bootstrap on s390 which broke with r197266.
> >
> > Comitted to mainline
>
> Please revert this and find another solution. JUMP_TABLE_DATA is not
> an active insn, and I will be removing it soon from active_insn_p.
I don't see which of the other iterators would fit here. So I'll need
my own. How do you intend to fix this for the other targets? Will
there be a new iterator available?
If you don't want me to use next_active_insn I probably have to do
something like this instead:
---
gcc/config/s390/s390.c | 30 ++++++++++++++++++++++!!!!!!!!
1 file changed, 22 insertions(+), 8 modifications(!)
Index: gcc/config/s390/s390.c
===================================================================
*** gcc/config/s390/s390.c.orig
--- gcc/config/s390/s390.c
*************** s390_mainpool_cancel (struct constant_po
*** 6792,6797 ****
--- 6792,6819 ----
s390_free_pool (pool);
}
+ /* Return true if LABEL is directly followed by a jump table insn. If
+ JUMP_TABLE_INSN is non-null the jump table insn is returned
+ there. */
+ static bool
+ s390_is_jumptable_label_p (rtx label, rtx *jump_table_insn)
+ {
+ while (label)
+ {
+ label = NEXT_INSN (label);
+
+ if (label == NULL_RTX || NONDEBUG_INSN_P (label))
+ return false;
+
+ if (JUMP_TABLE_DATA_P (label))
+ {
+ if (jump_table_insn != NULL)
+ *jump_table_insn = label;
+ return true;
+ }
+ }
+ return false;
+ }
/* Chunkify the literal pool. */
*************** s390_chunkify_start (void)
*** 7012,7019 ****
if (LABEL_P (insn)
&& (LABEL_PRESERVE_P (insn) || LABEL_NAME (insn)))
{
! rtx vec_insn = next_active_insn (insn);
! if (! vec_insn || ! JUMP_TABLE_DATA_P (vec_insn))
bitmap_set_bit (far_labels, CODE_LABEL_NUMBER (insn));
}
--- 7034,7040 ----
if (LABEL_P (insn)
&& (LABEL_PRESERVE_P (insn) || LABEL_NAME (insn)))
{
! if (!s390_is_jumptable_label_p (insn, NULL))
bitmap_set_bit (far_labels, CODE_LABEL_NUMBER (insn));
}
*************** s390_chunkify_start (void)
*** 7043,7050 ****
{
/* Find the jump table used by this casesi jump. */
rtx vec_label = XEXP (XEXP (XVECEXP (pat, 0, 1), 0), 0);
! rtx vec_insn = next_active_insn (vec_label);
! if (vec_insn && JUMP_TABLE_DATA_P (vec_insn))
{
rtx vec_pat = PATTERN (vec_insn);
int i, diff_p = GET_CODE (vec_pat) == ADDR_DIFF_VEC;
--- 7064,7072 ----
{
/* Find the jump table used by this casesi jump. */
rtx vec_label = XEXP (XEXP (XVECEXP (pat, 0, 1), 0), 0);
! rtx vec_insn;
!
! if (s390_is_jumptable_label_p (vec_label, &vec_insn))
{
rtx vec_pat = PATTERN (vec_insn);
int i, diff_p = GET_CODE (vec_pat) == ADDR_DIFF_VEC;