public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug target/37466]  New: [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands
@ 2008-09-10 19:31 aesok at gcc dot gnu dot org
  2008-09-10 19:35 ` [Bug target/37466] " aesok at gcc dot gnu dot org
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: aesok at gcc dot gnu dot org @ 2008-09-10 19:31 UTC (permalink / raw)
  To: gcc-bugs

Reported by geckosenator on avrfreaks.net


Code:

int sat; 

static volatile long data[3]; 
static volatile int datacount[3]; 

static volatile int chan; 
static volatile long val; 

int __attribute__((always_inline)) transfer(int data) 
{ 
   return (*(int *)((0x00))); 
} 

int init_status; 

long read_scale(void) 
{ 
   long val; 
   if(init_status) 
      val |= (long)transfer(0) << 16; 
   val |= (long)transfer(0) << 8; 
   return val; 
} 

void get_mode(int *mode, int *psw) 
{ 
    int val = transfer(0); 
    *psw = val & 0x10 ? 1 : 0; 
} 

long __attribute__((always_inline)) read_data(void) 
{ 
   long val; 

   val <<= 8; 
   if(init_status) 
      val |= transfer(0); 

   return val - 0x80; 
} 

void function1() 
{ 
    long data2 = read_data(); 
    sat = (data2 > 1) || (data2 < -100); 
    val += data2; 
    data[chan] += val; 
    datacount[chan] ++; 
} 

void function2(long *data) 
{ 
    int i, j; 
    data[i] += i + j; 
} 




Compile with: 

Code:

avr-gcc -std=gnu99 -fgnu89-inline -Os -mmcu=at90usb1287 -c testcase.c -o
testcase.S -S 



Then look in testcase.S for: 

Code:

.L16: 
   ldi r16,lo8(-128) 
   mov r14,r16 
   ldi r16,hi8(-128) 
   mov r15,r16 
   ldi r16,hlo8(-128) 
   mov r16,r16    <-----  bad, this does nothing! 
   ldi r16,hhi8(-128) <-- nice, we just clobbered r16 
   mov r17,r16 
   add r14,r18 
   adc r15,r19 
   adc r16,r20 
   adc r17,r21 
   sts (sat)+1,__zero_reg__ 



It looks like the compiler got confused and tried to use r16 in two different
ways at the same time. 


The bug occurs in peephole optmisation. Here avr-gcc looks for a spare register
R16-R31 that it can use to load a constant value into operands which are
located in lower register (R2-R15). 

The test for "spare" occurred before instruction. So if the instruction
happened to use that register (because it was spare), bad things
happen.Typically this will happen with long - or long long registers.


-- 
           Summary: [AVR] avr-gcc generating incorrect assembly for
                    expression with the long constant operands
           Product: gcc
           Version: 4.2.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: aesok at gcc dot gnu dot org
GCC target triplet: avr-*-*


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37466


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/37466] [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands
  2008-09-10 19:31 [Bug target/37466] New: [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands aesok at gcc dot gnu dot org
@ 2008-09-10 19:35 ` aesok at gcc dot gnu dot org
  2008-09-12 16:48 ` aesok at gcc dot gnu dot org
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: aesok at gcc dot gnu dot org @ 2008-09-10 19:35 UTC (permalink / raw)
  To: gcc-bugs



-- 

aesok at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|unassigned at gcc dot gnu   |aesok at gcc dot gnu dot org
                   |dot org                     |
             Status|UNCONFIRMED                 |ASSIGNED
     Ever Confirmed|0                           |1
   Last reconfirmed|0000-00-00 00:00:00         |2008-09-10 19:33:50
               date|                            |
            Summary|[AVR] avr-gcc generating    |[AVR] avr-gcc generating
                   |incorrect assembly for      |incorrect assembly for
                   |expression with the long    |expression with the long
                   |constant operands           |constant operands


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37466


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/37466] [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands
  2008-09-10 19:31 [Bug target/37466] New: [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands aesok at gcc dot gnu dot org
  2008-09-10 19:35 ` [Bug target/37466] " aesok at gcc dot gnu dot org
@ 2008-09-12 16:48 ` aesok at gcc dot gnu dot org
  2008-09-12 17:32 ` aesok at gcc dot gnu dot org
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: aesok at gcc dot gnu dot org @ 2008-09-12 16:48 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #1 from aesok at gcc dot gnu dot org  2008-09-12 16:46 -------
Subject: Bug 37466

Author: aesok
Date: Fri Sep 12 16:45:34 2008
New Revision: 140321

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=140321
Log:
        PR target/37466
        * config/avr/avr.md (movsi_lreg_const peephole2): Add match_dup for
        scratch register after 'set' pattern.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/avr/avr.md


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37466


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/37466] [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands
  2008-09-10 19:31 [Bug target/37466] New: [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands aesok at gcc dot gnu dot org
  2008-09-10 19:35 ` [Bug target/37466] " aesok at gcc dot gnu dot org
  2008-09-12 16:48 ` aesok at gcc dot gnu dot org
@ 2008-09-12 17:32 ` aesok at gcc dot gnu dot org
  2008-09-12 17:38 ` aesok at gcc dot gnu dot org
  2009-04-06 22:38 ` eric dot weddington at atmel dot com
  4 siblings, 0 replies; 6+ messages in thread
From: aesok at gcc dot gnu dot org @ 2008-09-12 17:32 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #2 from aesok at gcc dot gnu dot org  2008-09-12 17:30 -------
Subject: Bug 37466

Author: aesok
Date: Fri Sep 12 17:29:38 2008
New Revision: 140323

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=140323
Log:
        PR target/37466
        * config/avr/avr.md (movsi_lreg_const peephole2): Add match_dup for
        scratch register after 'set' pattern.

Modified:
    branches/gcc-4_3-branch/gcc/ChangeLog
    branches/gcc-4_3-branch/gcc/config/avr/avr.md


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37466


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/37466] [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands
  2008-09-10 19:31 [Bug target/37466] New: [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands aesok at gcc dot gnu dot org
                   ` (2 preceding siblings ...)
  2008-09-12 17:32 ` aesok at gcc dot gnu dot org
@ 2008-09-12 17:38 ` aesok at gcc dot gnu dot org
  2009-04-06 22:38 ` eric dot weddington at atmel dot com
  4 siblings, 0 replies; 6+ messages in thread
From: aesok at gcc dot gnu dot org @ 2008-09-12 17:38 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #3 from aesok at gcc dot gnu dot org  2008-09-12 17:36 -------
Fixed.


-- 

aesok at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|                            |FIXED
   Target Milestone|---                         |4.3.3


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37466


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/37466] [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands
  2008-09-10 19:31 [Bug target/37466] New: [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands aesok at gcc dot gnu dot org
                   ` (3 preceding siblings ...)
  2008-09-12 17:38 ` aesok at gcc dot gnu dot org
@ 2009-04-06 22:38 ` eric dot weddington at atmel dot com
  4 siblings, 0 replies; 6+ messages in thread
From: eric dot weddington at atmel dot com @ 2009-04-06 22:38 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #4 from eric dot weddington at atmel dot com  2009-04-06 22:38 -------
*** Bug 39593 has been marked as a duplicate of this bug. ***


-- 

eric dot weddington at atmel dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |szir at sch dot bme dot hu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37466


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-04-06 22:38 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-09-10 19:31 [Bug target/37466] New: [AVR] avr-gcc generating incorrect assembly for expression with the long constant operands aesok at gcc dot gnu dot org
2008-09-10 19:35 ` [Bug target/37466] " aesok at gcc dot gnu dot org
2008-09-12 16:48 ` aesok at gcc dot gnu dot org
2008-09-12 17:32 ` aesok at gcc dot gnu dot org
2008-09-12 17:38 ` aesok at gcc dot gnu dot org
2009-04-06 22:38 ` eric dot weddington at atmel dot com

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).