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

--- Comment #1 from brag <unixoid2003 at mail dot ru> 2012-04-23 12:58:17 UTC 
---
struct aa{
    volatile unsigned short a;
    unsigned short b;
    volatile unsigned short c;
    unsigned short d;
};

#define AAmem ((struct aa *) 256)

static inline unsigned int tx(unsigned int v){
    while(AAmem->a&1);
    AAmem->c=v;
    while(AAmem->a&2);
    v=AAmem->c;
    return v;
}

void f(){
    tx(0xff);
    tx(0xff);
}

Compiled by:
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O2 -fomit-frame-pointer
-ffreestanding -fno-common -Wall -Wextra -x c -c test.cpp
OR
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O2 -fomit-frame-pointer
-ffreestanding -fno-common -Wall -Wextra -x c++ -c test.cpp

The code generated is wrong. There should be two writes to AAmem->c bute there
is one write (strh    r3, [r2, #4])

arm-none-eabi-objdump -d test.o :
test.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <f>:
   0:    f44f 7180     mov.w    r1, #256    ; 0x100
   4:    880b          ldrh    r3, [r1, #0]
   6:    f44f 7280     mov.w    r2, #256    ; 0x100
   a:    07d8          lsls    r0, r3, #31
   c:    d4fa          bmi.n    4 <f+0x4>
   e:    23ff          movs    r3, #255    ; 0xff
  10:    8093          strh    r3, [r2, #4]
  12:    4611          mov    r1, r2
  14:    880b          ldrh    r3, [r1, #0]
  16:    f44f 7280     mov.w    r2, #256    ; 0x100
  1a:    f003 0302     and.w    r3, r3, #2
  1e:    b29b          uxth    r3, r3
  20:    2b00          cmp    r3, #0
  22:    d1f7          bne.n    14 <f+0x14>
  24:    8893          ldrh    r3, [r2, #4]
  26:    8813          ldrh    r3, [r2, #0]
  28:    07db          lsls    r3, r3, #31
  2a:    d4fc          bmi.n    26 <f+0x26>
  2c:    f44f 7280     mov.w    r2, #256    ; 0x100
  30:    8813          ldrh    r3, [r2, #0]
  32:    f003 0302     and.w    r3, r3, #2
  36:    b29b          uxth    r3, r3
  38:    2b00          cmp    r3, #0
  3a:    d1f9          bne.n    30 <f+0x30>
  3c:    f44f 7380     mov.w    r3, #256    ; 0x100
  40:    889b          ldrh    r3, [r3, #4]
  42:    4770          bx    lr

Reply via email to