Subject: GCC -O2 failure for mipsel

From: Fuxin Zhang <[email-masked]>
Date: Thu, 01 May 2003 13:39:53 +0800

Hello,
I've met a case where mipsel-linux-gcc -O2 fails,for both
2.96 and the fresh new 3.2.3. Maybe someone can tell me
what's wrong.

I've reduced the problem to the test case below,compile it
with mipsel-linux-gcc -O2(FROM H.J.Lu's redhat miniport,all version,
and 3.2.3 is tested too)

#define PUT_CODE(x,code) ((x)->code = (code))
union test_union {
struct test *t;
int a;
};

struct test {
unsigned short code;
union test_union u[1];
};

char memory[2000];

struct test *test_alloc(int code)
{
struct test *t;
int length=sizeof(struct test);

t = (struct test*)memory;
length = (sizeof(struct test) - sizeof(union test_union)-1)/sizeof(int);
for (;length>=0;length--)
((int*)t)[length] = 0;

PUT_CODE(t,code);

return t;
}

int main()
{
struct test *t;

t = test_alloc(4);

printf("t->code=%d\n",t->code);
}

Problem happens in test_alloc:

00400890 <test_alloc>:
400890: 3c1c0fc0 lui gp,0xfc0
400894: 279c77b0 addiu gp,gp,30640
400898: 0399e021 addu gp,gp,t9
40089c: 8f828054 lw v0,-32684(gp)
4008a0: 8f818054 lw at,-32684(gp)
4008a4: 00000000 nop
4008a8: a4240000 sh a0,0(at)
4008ac: 03e00008 jr ra
4008b0: ac400000 sw zero,0(v0)
--->the last sw is wrong,it should not be reorder to run later than 4008a8.

And gcc experts will find this is a simplfied case of rtx_alloc:).
Yes,the failure
shows up when i try to compile SPEC CPU2000 176.gcc with -O2. The const0_rtx
's code will be set to zero like above.

Thank you in advance.

Regards

---

From: Andrew Haley <[email-masked]>
Date: Thu, 1 May 2003 09:27:44 +0100

> 2.96 and the fresh new 3.2.3. Maybe someone can tell me

Your code is incorrect.

 > ((int*)t)[length] = 0;

You have declared t as a pointer to struct test, but you're using it
as a pointer to int.  If you look at Pointers, Section 6.2.2.3 in ISO
9899-1990 you'll see that this results in undefined behaviour.

-fno-strict-aliasing should generate the code you want, but it's
better to fix your source.  If you want to use a pointer as a
different type, put it in a union.

Andrew.

---

From: Fuxin Zhang <[email-masked]>
Date: Thu, 01 May 2003 16:41:42 +0800

Thanks, -fno-strict-aliasing works.
--The actual code can't be changed: because it is part of spec cpu2000:)

---

From: Andrew Haley <[email-masked]>
Date: Thu, 1 May 2003 09:46:22 +0100

> --The actual code can't be changed: because it is part of spec cpu2000:)

Perhaps SPEC need to have ISO C explained to them...

Andrew.

---

From: Greg Lindahl <[email-masked]>
Date: Thu, 1 May 2003 01:50:18 -0700

> Perhaps SPEC need to have ISO C explained to them...

It's just there so you can't turn on aliasing for reasonable base
options. It's all a conspiracy, I tell you...

greg

---

From: Andrew Pinski <[email-masked]>
Date: Thu, 1 May 2003 07:00:51 -0400

It is the gcc component of SPEC that needs explaining to, this has been 
talked about before:
<http://gcc.gnu.org/ml/gcc/2002-01/msg00711.html>

Thanks,
Andrew Pinski

---

From: "smills_ho" <[email-masked]>
Date: Fri, 9 May 2003 10:05:43 +0800

Dear All,
    I want to make a cross-compilered glibc-2.3.x and I get the source from
ftp.gun.org. GCC version is 3.2.3, binutils is 2.13.2.1. The step is as
following:

1. Try to build binutils
2. Try to make static GCC
3. Try to make glibc -----> Then it is failed

Is there anybody know what's going on or somebody had successfully to build
the crossed glibc-2.3.x?

Thanks and best regs,

---

From: Eric Christopher <[email-masked]>
Date: 09 May 2003 00:21:07 -0700

> Is there anybody know what's going on or somebody had successfully to build

A host cross host compiler for linux systems is a little more involved
than this :)

However, I don't know where you went wrong since you really didn't
provide much in the way of information as to what you did or where it
failed.

-eric

-- 
Eric Christopher <[email-masked]>

---

From: Kumba <[email-masked]>
Date: Fri, 09 May 2003 03:29:10 -0400

Oddly enough, I followed these basic steps and wound up with a working 
cross-compiler from sparc64 -> mipseb (Sun Blade 100 to mips 
big-endian).  Gcc nor glibc gave me any issues.....However, when I tried 
the same exact steps on i686, glibc complained about libgcc not being 
available, among other things.  It's got me baffled, but I'm not exactly 
complaining.  Currently, it's gcc-3.2.3 (propolice patched) + 
glibc-2.3.2 + binutils-2.13.90.0.20, which it'll get rebuilt for the new 
binutils 2.14.

--Kumba

---

From: "smills_ho" <[email-masked]>
Date: Fri, 9 May 2003 16:10:59 +0800

Dear Eric,
    I follow the step that provide by Bradley
http://www.ltc.com/~brad/mips/mipsel-linux-cross-toolchain-building.txt

Thanks and best regards

---

From: "smills_ho" <[email-masked]>
Date: Fri, 9 May 2003 16:15:12 +0800

Dear Kumba,
    Should we try this binutils-2.13.90.0.20?
We try the version binutils-2.13.90.0.18 (Debian used) and it is failed on
cross-gcc step :-(

Thanks and best regards,

---

From: Kumba <[email-masked]>
Date: Fri, 09 May 2003 04:30:06 -0400

I'm not quite sure.  I don't see how trying it could hurt, maybe it 
will work, maybe it won't.  Although, 2.14.90.0.1 was just released as 
well, you might try that, or even CVS Head, as I heard that includes 
last-minute mips fixes.  I'm fairly new to the whole cross-compiler 
thing myself, and recently discovered the HOWTO mentioned in your 
previous mail, which I'm looking at to try and get an i686->mips 
cross-compiler going.  For now though, my sparc->mips cross-compiler 
works, so it's what I'll rely on the most.

--Kumba

smills_ho wrote:
>>>>   I want to make a cross-compilered glibc-2.3.x and I get the source
> 
> from
> 
>>>>Is there anybody know what's going on or somebody had successfully to
> 
> build
> 
>>>>the crossed glibc-2.3.x?
>>>
>>>

---

From: "smills_ho" <[email-masked]>
Date: Fri, 9 May 2003 17:40:58 +0800

Dear Kumba,

    After try several versions of binutils and glibc , it works in crossing
XFree86 4.2.1.
binutils 2.13.2.1 + gcc 3.2.3 + glibc 2.3.2
and some patchs come from debian's packages ( binutils 2.13.90.0.18 ,
gcc-3.2.1,glibc-2.3.1)

Thanks and best regards,

Smills_ho

---

From: Guido Guenther <[email-masked]>
Date: Fri, 9 May 2003 13:20:14 +0200

> last-minute mips fixes.  I'm fairly new to the whole cross-compiler 
I needed 2.14.90.0.1 to get the glibc testcases build right. Without
them I had lot's of unresolded "__libc_global_ctors" among others which
looked like a symbol visibility problem. 
Regards,
 -- Guido

---

From: Eric Christopher <[email-masked]>
Date: 09 May 2003 10:13:36 -0700

> http://www.ltc.com/~brad/mips/mipsel-linux-cross-toolchain-building.txt

I'd bug Brad then :)

-eric