public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* c/3095: gcc miscompiles __udivdi3 (libgcc2.c) for linux-m68k
@ 2001-06-08 16:46 Roman Zippel
  0 siblings, 0 replies; only message in thread
From: Roman Zippel @ 2001-06-08 16:46 UTC (permalink / raw)
  To: gcc-gnats

>Number:         3095
>Category:       c
>Synopsis:       gcc miscompiles __udivdi3 (libgcc2.c) for linux-m68k
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          wrong-code
>Submitter-Id:   net
>Arrival-Date:   Fri Jun 08 16:46:02 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     Roman Zippel
>Release:        3.0 20010606 (prerelease)
>Organization:
>Environment:
System: Linux sodom 2.2.10 #4 Sun Aug 1 14:25:38 CEST 1999 m68k unknown
Architecture: m68k

	
host: m68k-unknown-linux-gnu
build: m68k-unknown-linux-gnu
target: m68k-unknown-linux-gnu
configured with: ../gcc-3.0/configure --verbose --cache-file=../config.cache --prefix=/usr/local/egcs --enable-languages=c,c++
>Description:
The inline assembly in libgcc2.c is miscompiled, e.g.:

(insn/i 29 149 30 (parallel[ 
            (set (reg/v:SI 42)
                (asm_operands:SI ("divu%.l %4,%1:%0") ("=d") 0[ 
                        (reg/v:SI 39)
                        (reg/v:SI 40)
                        (reg/v:SI 37)
                    ] 
                    [ 
                        (asm_input:SI ("0"))
                        (asm_input:SI ("1"))
                        (asm_input:SI ("dmi"))
                    ]  ("../../gcc-3.0/gcc/libgcc2.c") 532))
            (set (reg/v:SI 39)
                (asm_operands:SI ("divu%.l %4,%1:%0") ("=d") 1[ 
                        (reg/v:SI 39)
                        (reg/v:SI 40)
                        (reg/v:SI 37)
                    ] 
                    [ 
                        (asm_input:SI ("0"))
                        (asm_input:SI ("1"))
                        (asm_input:SI ("dmi"))
                    ]  ("../../gcc-3.0/gcc/libgcc2.c") 532))
        ] ) -1 (nil)
    (expr_list:REG_DEAD (reg/v:SI 37)
        (expr_list:REG_DEAD (reg/v:SI 40)
            (expr_list:REG_UNUSED (reg/v:SI 39)
                (nil)))))

becomes after regmove:

(insn/i 29 187 30 (parallel[ 
            (set (reg/v:SI 42)
                (asm_operands:SI ("divu%.l %4,%1:%0") ("=d") 0[ 
                        (reg/v:SI 42)
                        (reg/v:SI 40)
                        (reg/v:SI 37)
                    ] 
                    [ 
                        (asm_input:SI ("0"))
                        (asm_input:SI ("1"))
                        (asm_input:SI ("dmi"))
                    ]  ("../../gcc-3.0/gcc/libgcc2.c") 532))
            (set (reg/v:SI 42)
                (asm_operands:SI ("divu%.l %4,%1:%0") ("=d") 1[ 
                        (reg/v:SI 42)
                        (reg/v:SI 40)
                        (reg/v:SI 37)
                    ] 
                    [ 
                        (asm_input:SI ("0"))
                        (asm_input:SI ("1"))
                        (asm_input:SI ("dmi"))
                    ]  ("../../gcc-3.0/gcc/libgcc2.c") 532))
        ] ) -1 (nil)
    (expr_list:REG_DEAD (reg/v:SI 37)
        (expr_list:REG_DEAD (reg/v:SI 40)
            (nil))))

Register 39 is replaced, although it's still used as input parameter.
In the end the result is put into the wrong register.

>How-To-Repeat:
Configure for linux-m68k and (cross) compile.
Note that the fixes from bootstrap/3090 and c/3092 are needed to get
at least a cross compiler.
>Fix:
Index: gcc/regmove.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/regmove.c,v
retrieving revision 1.96.2.6
diff -u -r1.96.2.6 regmove.c
--- regmove.c	2001/05/14 16:31:46	1.96.2.6
+++ regmove.c	2001/06/08 19:57:56
@@ -1355,7 +1355,8 @@
 		  continue;
 		}
 
-	      if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
+	      if (! (src_note = find_reg_note (insn, REG_DEAD, src)) &&
+		  ! (src_note = find_reg_note (insn, REG_UNUSED, src)))
 		{
 		  if (!copy_src)
 		    {
>Release-Note:
>Audit-Trail:
>Unformatted:


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2001-06-08 16:46 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-06-08 16:46 c/3095: gcc miscompiles __udivdi3 (libgcc2.c) for linux-m68k Roman Zippel

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).