This is the mail archive of the gcc@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]

combine versus hard reg loads/stores fix fix


Hi Bernd,
The hardreg<->reg moves may contain SUBREGs making gcc to crash on certain testcases.
For x86_64 it is:

extern void * ext2_bread (void *, int, int, int *);
static int empty_dir (unsigned long offset, int bs)
{
        ext2_bread (0, offset >> bs, 0, 0);
        return 1;
}

In this case the offset>>bs is computed 64bit and then SUBREGed for i386.  On
i386 this is quite dificult, since we can't force SUBREG on the operand,
because all arguments are promoted to the widest mode.

OK?

Honza

Tue Dec 12 12:41:51 MET 2000  Jan Hubicka  <jh@suse.cz>

	* combine.c (cant_combine_insn_p): Get around SUBREGs when determining
	hardreg<->reg moves.

Index: gcc/gcc/combine.c
===================================================================
RCS file: /home/cvs/Repository/gcc/gcc/combine.c,v
retrieving revision 1.6
diff -c -3 -p -r1.6 combine.c
*** gcc/gcc/combine.c	2000/12/07 17:40:41	1.6
--- gcc/gcc/combine.c	2000/12/12 11:02:21
*************** cant_combine_insn_p (insn)
*** 1465,1470 ****
--- 1465,1474 ----
      return 0;
    src = SET_SRC (set);
    dest = SET_DEST (set);
+   if (GET_CODE (src) == SUBREG)
+     src = SUBREG_REG (src);
+   if (GET_CODE (dest) == SUBREG)
+     dest = SUBREG_REG (dest);
    if (REG_P (src) && REG_P (dest)
        && ((REGNO (src) < FIRST_PSEUDO_REGISTER
  	   && ! fixed_regs[REGNO (src)])

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