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