barrett@jhunix.HCF.JHU.EDU (Dan Barrett) (02/11/91)
I have found a bug in Manx 5.0d. The optimizer can produce
incorrect code with the -sr option ("compiler picks which local variables
get assigned to registers"). Enclosed is a minimal code example that
illustrates the bug. Please someone verify this for me. I have an
Amiga 1000 running 1.3.2.
This prints the right answer:
Compile: cc bug.c
Link: ln bug.o -lc
Run: 1> bug
Did you know that 3276476 + 8 - 1 == 3276483?
This prints the wrong answer:
Compile: cc -sr bug.c
Link: ln bug.o -lc
Run: 1> bug
Did you know that 3276480 + 8 - 1 == 3276488?
The problem is in the address arithmetic:
p = buf + strlen(buf) - 1;
The "- 1" is ignored by the compiler. It doesn't matter what the constant
is, as long as it is NOT stored in a variable.
Code is below my signature. I hope I saved somebody some
frustration by hunting this down!!
Dan
//////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
| Dan Barrett, Department of Computer Science Johns Hopkins University |
| INTERNET: barrett@cs.jhu.edu | |
| COMPUSERVE: >internet:barrett@cs.jhu.edu | UUCP: barrett@jhunix.UUCP |
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/////////////////////////////////////
#include <stdio.h>
#include <string.h>
main()
{
char *p;
char buf[BUFSIZ];
strcpy(buf, "Anything"); /* Any string. */
p = buf + strlen(buf) - 1;
printf("Did you know that %ld + %d - 1 == %ld?\n",
buf, strlen(buf), p);
}umueller@iiic.ethz.ch (Urban Dominik Mueller) (02/16/91)
Recently, a Manx 5.0d bug report was posted on this net. Before I
explain what happened, a short summary:
==> Make sure your Manx 5.0d compiler 'cc' is dated Sep 28 <==
( The version of 5.0d dated Sep 20 has a *nasty* bug )
The rest is only for the interested. What happens is the following:
Whenever the destination an addition with a constant in it is an address
register (this is why the mentioned bug only occured when -sr was turned
on), Manx tries the following trick (-sr always set, but it can also
happen when it's not set):
Source code Correct assembler code 5.0d (both versions)
-----------------------+--------------------------------------------
main() | move.l d2,a0 ; i moved to a0
{ | add.l d2,a0 ; i added to a0
int i; | pea 99(a0) ; a0 + 99 pushed to stack
| jsr _func ; function call
func( i+i+99 ); | add.w 4,sp ; argument popping
} |
So far, so good. But when when one part of the addition is a pointer,
this happens with Manx 5.0d Sep 20:
Source code Buggy assembler code by 5.0d Sep 20
-----------------------+------------------------------------
main() | move.l d2,a0 ; i moved to a0
{ | add.l a2,a0 ; p added to a0
char *p; | move.l a0,-(sp) ; result pushed, but 99 forgotten
int i; | jsr _func
| add.w 4,sp
func( p+i+99 ); |
}
The 5.0d version dated Sep 28 does a nice job again (by just forgetting
about that 'pea' trick in that special case):
Same source code Correct assembler code by 5.0d Sep 28
-----------------------+--------------------------------------
main() | move.l d2,a0 ; i moved to a0
{ | add.l a2,a0 ; p added to a0
char *p; | add.l 99,a0 ; 99 added to a0
int i; | move.l a0,-(sp) ; a0 pushed
| jsr _func
func( p+i+99 ); | add.w 4,sp
} |
Hope this helped some people. IMHO it's up to Manx to tell you bugs like
this one. There are many people who can't call their BBS. At least I must
say that their update service is good, I got that special update for free
(hadn't even got to pay any postage).
__
| Urban Mueller | / / | Urban Mueller |
| USENET: umueller@iiic.ethz.ch | __ / / | Schulhausstr. 83 |
| FIDONET: 2:302/906 (AUGL) | \ \/ / | CH-6312 Steinhausen |
| "Don't tell my employer" | \__/ | SWITZERLAND |Ata@system-m.phx.bull.com (John G. Ata) (02/23/91)
I tried your test case with my version of Manx 5.0d and could not get it
to fail as you describe. It always gave arithmetically correct answers
regardless of whether -sr was used. Which version of 5.0d are you
using? The correct version should be dated September 28, 1990 (printed
when cc is called) as there was a preliminary version of 5.0d that was
distributed over the BB with errors.
JohnAnthon_Pang@mindlink.UUCP (Anthon Pang) (02/24/91)
Ata@system-m.phx.bull.com (John G. Ata) writes: > I tried your test case with my version of Manx 5.0d and could not get it > to fail as you describe. It always gave arithmetically correct answers > regardless of whether -sr was used. Which version of 5.0d are you > using? The correct version should be dated September 28, 1990 (printed > when cc is called) as there was a preliminary version of 5.0d that was > distributed over the BB with errors. *ick* My version is dated September 20th and I got my version mailed to me through the update department. This is ridiculous...I would expect better quality control, before announcing and releasing an update. One now worries whether one's version was the latest version where they added one more feature, or fixed one more bug. *sigh*