gay@elde.epfl.ch (David Gay) (05/14/89)
The optimiser generates incorrect code in the following two programs:
"bug.c"
/* When compiled with lc -O, the expression
arrow1->b = y + 2 * a
is evaluated incorrectly.
The short's & long's must be left as is. */
struct s1
{
short a, b, c, d;
};
int dummy;
void r1(long x, long y)
{
long i;
long a;
struct s1 *arrow1;
long knobsize;
if ((r2(x + 5, knobsize)) &&
i/*Any expression */)
{
arrow1->a = x + 5;
/* Must be 2 * a */
arrow1->b = y + 2 * a;
if (i/*Any expression*/)
{
for (i = 0; i < 10; i++)
{
/* Must be (i + 2) */
dummy = y + (i + 2) * a;
}
}
}
}
Second program:
"bug2.c"
struct s1 {
short m1;
};
void f1(side, h)
long side, h;
{
struct s1 *v1;
int bx;
f2(side ? 4 : 0);
v1->m1 = h;
bx = side ? 0 : 4;
f3(bx - 1, h - 1 /*generates h*/) && f3(bx - 1, h - 1);
}
The comparisons below between a signed and unsigned char are done with a signed
comparison between the two bytes (causing problems with tf_HiChar = 255).
Shouldn't the chars be extended to a short(at least) first ? (I'm not quite
sure what the Ansi sign preserving rules say ...)
#include <exec/types.h>
#include <graphics/text.h>
void test(struct TextFont *font, char *text)
{
if (font->tf_CharKern && text[0] >= font->tf_LoChar && text[0] <= font->tf_H
iChar)
{
}
}
The type checking code considers a pointer to an undefined struct to be of
the same type as a pointer to any struct (defined or not). The following
program shows this:
struct a
{
int b;
} *c;
struct ok
{
char noproblem;
} *g;
struct d *e;
void t2(struct f *a, struct a *b)
{
a = b; /* No warning */
}
void t3()
{
t2(c, e); /* No warnings */
t2(c, g); /* Warning only for g */
}
I've also had problems with CodeProbe:
a) Stopping with CXERR: 202
b) It seems to forget the types/existence of structures sometimes, and thinks
that variables of these types are char's ...
a) can usually be cured by relinking with a different startup module (if I'm
using c.o, with catch.o, and if using catch.o, with c.o). Setting the stack
to 100000 doesn't help.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
David Gay 6 x 9 = 42
GAY@ELDE.EPFL.CH, or GAY%ELDE.EPFL.CH@CLSEPF51.bitnet
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~