public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* Re: c/4134: inline assembly - gcc fails to work around register pressure
@ 2002-04-25  6:56 J.D.
  0 siblings, 0 replies; 3+ messages in thread
From: J.D. @ 2002-04-25  6:56 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c/4134; it has been noted by GNATS.

From: "J.D." <jodaman@cegt201.bradley.edu>
To: rth@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org,
   jodaman@cegt201.bradley.edu, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org
Cc:  
Subject: Re: c/4134: inline assembly - gcc fails to work around register pressure
Date: Thu, 25 Apr 2002 08:50:27 -0500

 In retrospect, egcs failed to avoid using the clobbered
 register, just as you suggested.  Thus, what I initially
 interpreted as a bug in the later gcc versions now seems
 better classified as the lack of a feature.
 
 A compiler could work around the register pressure by
 copying the 32-bit integer in memory to the stack.  Thus,
 an offset to the stack pointer could serve for the memory
 parameter, instead of a separate address register.
 
 Given the ease of manually copying input memory parameters
 from any memory location to the local stack in C, an
 automatic feature may be primarily useful to less 
 experienced or sleep-deprived programmers under specific 
 conditions.  Instead of implementing an automatic feature, a
 satisfactory improvement might be realized by simply
 adding to the documentation that gcc will not automatically
 copy memory parameters to the stack in an effort to work
 around scarce registers.  An automatic copy-memory-to
 stack-under-pressure feature may sometimes need to be
 disabled anyway.
 
 Most convenient would be an automatic feature that issues a 
 warning whenever utilized, but that works around the scarce
 registers and still creates working code (for the usual
 case).  A programmer may then remove the warning by an
 explicit copy to the loca
 explicit attention will be required.
 
 rth@gcc.gnu.org wrote:
 > 
 > Synopsis: inline assembly - gcc fails to work around register pressure
 > 
 > State-Changed-From-To: open->closed
 > State-Changed-By: rth
 > State-Changed-When: Tue Apr 23 01:18:11 2002
 > State-Changed-Why:
 >     Not a bug.  You really have run out of registers.
 > 
 >     Your ifdef BUG example requires 7 registers: 3 for
 >     each of the "r" inputs, 1 for the address of the
 >     input memory parameter, and 3 are clobbered and thus
 >     cannot be used.
 > 
 >     The i386 has 8 registers one is reserved for the stack pointer, and one is reserved for the frame pointer (at least
 >     without -fomit-frame-pointer), leaving only 6, one short
 >     of the required 7.
 > 
 >     As a guess, egcs failed to properly not use one of the
 >     registers marked clobbered.
 >


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: c/4134: inline assembly - gcc fails to work around register pressure
@ 2002-04-23  1:18 rth
  0 siblings, 0 replies; 3+ messages in thread
From: rth @ 2002-04-23  1:18 UTC (permalink / raw)
  To: gcc-bugs, gcc-prs, jodaman, nobody

Synopsis: inline assembly - gcc fails to work around register pressure

State-Changed-From-To: open->closed
State-Changed-By: rth
State-Changed-When: Tue Apr 23 01:18:11 2002
State-Changed-Why:
    Not a bug.  You really have run out of registers.
    
    Your ifdef BUG example requires 7 registers: 3 for
    each of the "r" inputs, 1 for the address of the
    input memory parameter, and 3 are clobbered and thus 
    cannot be used.
    
    The i386 has 8 registers one is reserved for the stack pointer, and one is reserved for the frame pointer (at least
    without -fomit-frame-pointer), leaving only 6, one short
    of the required 7.
    
    As a guess, egcs failed to properly not use one of the
    registers marked clobbered.

http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4134


^ permalink raw reply	[flat|nested] 3+ messages in thread

* c/4134: inline assembly - gcc fails to work around register pressure
@ 2001-08-27  2:16 jodaman
  0 siblings, 0 replies; 3+ messages in thread
From: jodaman @ 2001-08-27  2:16 UTC (permalink / raw)
  To: gcc-gnats

>Number:         4134
>Category:       c
>Synopsis:       inline assembly - gcc fails to work around register pressure
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          rejects-legal
>Submitter-Id:   net
>Arrival-Date:   Mon Aug 27 02:16:01 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     jodaman@cegt201.bradley.edu
>Release:        gcc version 3.0.2 20010825 (Debian prerelease)
>Organization:
>Environment:
Linux version 2.2.18 #1 Thu Dec 21 18:49:41 CST 2000
arch: i686
>Description:
The demonstration code attached reveals that gcc may fail
to fold in inline assembly code when most all the registers
are used.  Here is the error message:

test_asm.c: In function `test_asm':
test_asm.c:6: Can't find a register in class `GENERAL_REGS' while reloading `asm'.

Just in guessing, it seems that the compiler fails to copy
a piece of data to the stack when it otherwise runs out of
registers.  The compiler should be able to figure out how
to pass the data to the assembly block without help,
especially since older gcc compilers (like egcs-2.91.66),
handle the code fine.
>How-To-Repeat:
/* compile with "-DBUG" for demonstration */
int
test_asm( int in0, int in1, int in2, int *t )
{
  int out[1];
#ifdef BUG        
  __asm__ (
           ""
           : "=m" (out)
           : "r" (in0)
           , "r" (in1)
           , "r" (in2)
           , "m" (t[0])
           : "%eax", "%ecx", "%edx"
           );
#else
  int workaround_t0 = t[0];
  __asm__ (
           ""
           : "=m" (out)
           : "r" (in0)
           , "r" (in1)
           , "r" (in2)
           , "m" (workaround_t0)
           : "%eax", "%ecx", "%edx"
           );
#endif
  return(*out);
}
>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2002-04-25 13:56 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-04-25  6:56 c/4134: inline assembly - gcc fails to work around register pressure J.D.
  -- strict thread matches above, loose matches on Subject: below --
2002-04-23  1:18 rth
2001-08-27  2:16 jodaman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).