Unreviewed patch: eliminate_regs_in_insn

Ulrich Weigand Ulrich.Weigand@de.ibm.com
Fri Jan 25 12:33:00 GMT 2002


Richard Henderson wrote:

>Ok except,
>
>!                   if (GET_CODE (base) == PLUS
>!                       && GET_CODE (XEXP (base, 0)) == CONST_INT)
>!                     {
>!                       offset += INTVAL (XEXP (base, 0));
>!                       base = XEXP (base, 1);
>!                     }
>
>Eliminate this hunk.  This is non-canonical rtl -- there should be
>no need to check for it.

Ok, I just left it in because the old code had it as well ..

I've now committed the version below.
(Bootstrapped/regtested again on s390-ibm-linux.)

Thanks,
Ulrich



Index: gcc/reload1.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/reload1.c,v
retrieving revision 1.323
diff -c -p -r1.323 reload1.c
*** reload1.c  2002/01/15 13:38:02 1.323
--- reload1.c  2002/01/25 19:18:44
*************** eliminate_regs_in_insn (insn, replace)
*** 2932,2969 ****
         if (ep->from == FRAME_POINTER_REGNUM
          && ep->to == HARD_FRAME_POINTER_REGNUM)
           {
!         rtx src = SET_SRC (old_set);
!         int offset = 0, ok = 0;
!         rtx prev_insn, prev_set;

!         if (src == ep->to_rtx)
!           offset = 0, ok = 1;
!         else if (GET_CODE (src) == PLUS
!               && GET_CODE (XEXP (src, 0)) == CONST_INT
!               && XEXP (src, 1) == ep->to_rtx)
!           offset = INTVAL (XEXP (src, 0)), ok = 1;
!         else if (GET_CODE (src) == PLUS
!               && GET_CODE (XEXP (src, 1)) == CONST_INT
!               && XEXP (src, 0) == ep->to_rtx)
!           offset = INTVAL (XEXP (src, 1)), ok = 1;
!         else if ((prev_insn = prev_nonnote_insn (insn)) != 0
!               && (prev_set = single_set (prev_insn)) != 0
!               && rtx_equal_p (SET_DEST (prev_set), src))
            {
!             src = SET_SRC (prev_set);
!             if (src == ep->to_rtx)
!               offset = 0, ok = 1;
!             else if (GET_CODE (src) == PLUS
!                   && GET_CODE (XEXP (src, 0)) == CONST_INT
!                   && XEXP (src, 1) == ep->to_rtx)
!               offset = INTVAL (XEXP (src, 0)), ok = 1;
!             else if (GET_CODE (src) == PLUS
!                   && GET_CODE (XEXP (src, 1)) == CONST_INT
!                   && XEXP (src, 0) == ep->to_rtx)
!               offset = INTVAL (XEXP (src, 1)), ok = 1;
            }

!         if (ok)
            {
              rtx src
                = plus_constant (ep->to_rtx, offset - ep->offset);
--- 2932,2963 ----
         if (ep->from == FRAME_POINTER_REGNUM
          && ep->to == HARD_FRAME_POINTER_REGNUM)
           {
!         rtx base = SET_SRC (old_set);
!         rtx base_insn = insn;
!         int offset = 0;

!         while (base != ep->to_rtx)
            {
!             rtx prev_insn, prev_set;
!
!             if (GET_CODE (base) == PLUS
!                 && GET_CODE (XEXP (base, 1)) == CONST_INT)
!               {
!                 offset += INTVAL (XEXP (base, 1));
!                 base = XEXP (base, 0);
!               }
!             else if ((prev_insn = prev_nonnote_insn (base_insn)) != 0
!                   && (prev_set = single_set (prev_insn)) != 0
!                   && rtx_equal_p (SET_DEST (prev_set), base))
!               {
!                 base = SET_SRC (prev_set);
!                 base_insn = prev_insn;
!               }
!             else
!               break;
            }

!         if (base == ep->to_rtx)
            {
              rtx src
                = plus_constant (ep->to_rtx, offset - ep->offset);




More information about the Gcc-patches mailing list