avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] Success running the testsuite with avrtest


From: Paulo Marques
Subject: Re: [avr-gcc-list] Success running the testsuite with avrtest
Date: Thu, 17 Jan 2008 05:31:44 +0000
User-agent: Internet Messaging Program (IMP) H3 (4.1.2)

Quoting Paulo Marques <address@hidden>:
[...]
Although there are 66 tests that FAIL, only 51 are execution failures, and 15 are compilation failures. These 51 failures correspond to just 10 programs that fail to execute, with different optimization options (-O0, -O1, etc.):

I just tried compiling these tests myself to run them one by one on avrtest and found out that most of them fail because of 32 bit integer size assumptions or other odities:

execute/20010122-1.c

This test uses __builtin_return_address.

execute/20060102-1.c
20060102-1.c:5: warning: right shift count >= width of type

execute/20061101-1.c
20061101-1.c:8: warning: comparison is always true due to limited range of data type

execute/float-floor.c

This test is very sensitive to floating point implementation and probably needs an actual 64 bit double type to work properly.

execute/pr17377.c

This test also uses __builtin_return_address.

execute/pr22493-1.c

This uses SIMD instructions.

execute/pr23135.c
pr23135.c:8: warning: integer overflow in expression
pr23135.c:8: warning: integer overflow in expression

execute/pr28651.c
pr28651.c:11: warning: large integer implicitly truncated to unsigned type

execute/pr29797-1.c
pr29797-1.c:10: warning: comparison is always true due to limited range of data type

execute/simd-1.c

This one also uses SIMD instructions.

So we're down to the following failing reasons:
- test case assumes 32 bit integers
- test case uses __builtin_return_address
- test case uses SIMD instructions

The __builtin_return_address implementation really has a bug (at least with gcc-4.2.2). It works if there is no prologue pushing stuff into the stack. Otherwise it can produce code like this:

void NOINLINE *test3 (void)
{
 void * temp;
 temp = __builtin_return_address (0);
 dummy ();
 return temp;
}

000004de <test3>:
4de:    0f 93           push    r16
4e0:    1f 93           push    r17
4e2:    ed b7           in      r30, 0x3d       ; 61
4e4:    fe b7           in      r31, 0x3e       ; 62
4e6:    01 81           ldd     r16, Z+1        ; 0x01
4e8:    12 81           ldd     r17, Z+2        ; 0x02
4ea:    0e 94 30 01     call    0x260   ; 0x260 <dummy>
4ee:    c8 01           movw    r24, r16
4f0:    1f 91           pop     r17
4f2:    0f 91           pop     r16
4f4:    08 95           ret

The "ldd r16, Z+1" and "ldd r17, Z+2" are going to fetch the 2 registers pushed into the stack instead of the return address.

I guess I need to start testing with the gcc from SVN directly so that I don't run into bugs that have already been fixed.

--
Paulo Marques


----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]