This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Committed] S/390: PR57609 fix - use next_active_insn instead of next_real_insn


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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]