This is the mail archive of the
mailing list for the GCC project.
Re: [m68k] asm regression with 3.3/3.4/3.5
On Thu, May 13, 2004 at 01:12:51AM -0400, Ian Lance Taylor wrote:
> Richard Henderson <firstname.lastname@example.org> writes:
> [ regarding using hard register variables as an asm input ]
> > On Wed, May 12, 2004 at 02:35:54PM -0400, Ian Lance Taylor wrote:
> > > And it doesn't appear to work.
> > It *does* work on other systems. We have tests for it in the
> > testsuite, and glibc would fail to work if it didn't.
> Interesting. I think this should be documented. I looked to see how
> this is implemented in the source code, but I don't see it.
It seems, there exist different opinions about using local hard register
variables as an asm input. Such usage doesn't seem to be that uncommon.
> The appended untested patch fixes the problem at hand. When gcc finds
> a register which is invariant and is used once in a loop, it tries to
> replace it with the invariant value. This patch tells gcc not to do
> that if the register is a hard register which is used in an asm
This patch applies for GCC 3.3.3 and 3.4.0 and there it fixes the
problem. Thank you!
> But in the absence of a general principle it's hard to know why this
> is required.
> Here is a test case showing the same problem on the Alpha:
> extern void bar ();
> foo (long a)
> for (;;)
> register long b __asm ("$11") = a;
> __asm volatile ("callsys %0" : : "r" (b));
> bar ();
Maybe this should get recorded with PR/15089. Its really surprsing to
see that this problem was noticed indepently multiple times now.
> Index: loop.c
> RCS file: /cvs/gcc/gcc/gcc/loop.c,v
> retrieving revision 1.497
> diff -u -p -r1.497 loop.c
> --- loop.c 18 Mar 2004 16:42:31 -0000 1.497
> +++ loop.c 13 May 2004 04:57:42 -0000
> @@ -925,6 +925,10 @@ scan_loop (struct loop *loop, int flags)
> == INSN_UID (regs->array[regno].single_usage))
> && regs->array[regno].set_in_loop == 1
> && GET_CODE (SET_SRC (set)) != ASM_OPERANDS
> + && (regno >= FIRST_PSEUDO_REGISTER
> + || asm_noperands (PATTERN (regs->array[regno]
> + .single_usage))
> + < 0)
> && ! side_effects_p (SET_SRC (set))
> && ! find_reg_note (p, REG_RETVAL, NULL_RTX)
> && (! SMALL_REGISTER_CLASSES