This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/50063] New: [avr]: wrong code for gcc.dg/torture/pta-ptrarith-3.c
- From: "gjl at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 12 Aug 2011 20:14:57 +0000
- Subject: [Bug target/50063] New: [avr]: wrong code for gcc.dg/torture/pta-ptrarith-3.c
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50063
Bug #: 50063
Summary: [avr]: wrong code for gcc.dg/torture/pta-ptrarith-3.c
Classification: Unclassified
Product: gcc
Version: 4.6.1
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: target
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: gjl@gcc.gnu.org
CC: eric.weddington@atmel.com
Target: avr
Testcase gcc.dg/torture/pta-ptrarith-3.c
http://gcc.gnu.org/viewcvs/trunk/gcc/testsuite/gcc.dg/torture/pta-ptrarith-3.c?revision=145490&view=markup
produces wrong code for current trunk and avr-gcc 4.6.1
struct X
{
int *p;
int *q;
int *r;
};
int __attribute__((noinline))
foo (int i, int j, int k, int off)
{
struct X x;
int **p, *q;
x.p = &i;
x.q = &j;
x.r = &k;
p = &x.q;
p += off;
/* *p points to { i, j, k } */
q = *p;
return *q;
}
With -Os -mmcu=atmega88 4.6.1 output is (wrong):
foo:
push r28 ; 42 *pushqi/1 [length = 1]
push r29 ; 43 *pushqi/1 [length = 1]
in r28,__SP_L__ ; 44 *movhi_sp/2 [length = 2]
in r29,__SP_H__
sbiw r28,12 ; 45 *addhi3/3 [length = 1]
in __tmp_reg__,__SREG__ ; 46 *movhi_sp/1 [length = 5]
cli
out __SP_H__,r29
out __SREG__,__tmp_reg__
out __SP_L__,r28
/* prologue: function */
/* frame size = 12 */
/* stack size = 14 */
.L__stack_usage = 14
std Y+8,r25 ; 2 *movhi/3 [length = 2]
std Y+7,r24
std Y+10,r23 ; 3 *movhi/3 [length = 2]
std Y+9,r22
std Y+12,r21 ; 4 *movhi/3 [length = 2]
std Y+11,r20
lsl r18 ; 55 *ashlhi3_const/2 [length = 2]
rol r19
add r18,r28 ; 16 *addhi3/1 [length = 2]
adc r19,r29
movw r26,r18 ; 41 *movhi/1 [length = 1]
adiw r26,3 ; 18 *movhi/2 [length = 4]
ld r30,X+
ld r31,X
sbiw r26,3+1
ld r24,Z ; 35 *movqi/4 [length = 1]
ldd r25,Z+1 ; 36 *movqi/4 [length = 1]
/* epilogue start */
adiw r28,12 ; 49 *addhi3/2 [length = 1]
in __tmp_reg__,__SREG__ ; 50 *movhi_sp/1 [length = 5]
cli
out __SP_H__,r29
out __SREG__,__tmp_reg__
out __SP_L__,r28
pop r29 ; 51 popqi [length = 1]
pop r28 ; 52 popqi [length = 1]
ret ; 53 return_from_epilogue [length = 1]
With 4.5.2 and same options, the test case runs on exit:
foo:
push r29 ; 42 *pushhi/1 [length = 2]
push r28
in r28,__SP_L__ ; 43 *movhi_sp/2 [length = 2]
in r29,__SP_H__
sbiw r28,12 ; 44 *addhi3/3 [length = 1]
in __tmp_reg__,__SREG__ ; 45 *movhi_sp/1 [length = 5]
cli
out __SP_H__,r29
out __SREG__,__tmp_reg__
out __SP_L__,r28
/* prologue: function */
/* frame size = 12 */
/* stack size = 14 */
.L__stack_usage = 14
std Y+8,r25 ; 2 *movhi/3 [length = 2]
std Y+7,r24
std Y+10,r23 ; 3 *movhi/3 [length = 2]
std Y+9,r22
std Y+12,r21 ; 4 *movhi/3 [length = 2]
std Y+11,r20
movw r24,r28 ; 38 *movhi/1 [length = 1]
adiw r24,7 ; 9 *addhi3/2 [length = 1]
std Y+2,r25 ; 10 *movhi/3 [length = 2]
std Y+1,r24
movw r24,r28 ; 39 *movhi/1 [length = 1]
adiw r24,9 ; 11 *addhi3/2 [length = 1]
std Y+4,r25 ; 12 *movhi/3 [length = 2]
std Y+3,r24
movw r24,r28 ; 40 *movhi/1 [length = 1]
adiw r24,11 ; 13 *addhi3/2 [length = 1]
std Y+6,r25 ; 14 *movhi/3 [length = 2]
std Y+5,r24
lsl r18 ; 53 *ashlhi3_const/2 [length = 2]
rol r19
add r18,r28 ; 16 *addhi3/1 [length = 2]
adc r19,r29
movw r26,r18 ; 41 *movhi/1 [length = 1]
adiw r26,3 ; 18 *movhi/2 [length = 4]
ld r30,X+
ld r31,X
sbiw r26,3+1
ld r24,Z ; 35 *movqi/4 [length = 1]
ldd r25,Z+1 ; 36 *movqi/4 [length = 1]
/* epilogue start */
adiw r28,12 ; 48 *addhi3/2 [length = 1]
in __tmp_reg__,__SREG__ ; 49 *movhi_sp/1 [length = 5]
cli
out __SP_H__,r29
out __SREG__,__tmp_reg__
out __SP_L__,r28
pop r28 ; 50 pophi [length = 2]
pop r29
ret ; 51 return_from_epilogue [length = 1]