https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67507

            Bug ID: 67507
           Summary: Code size increase with -Os from GCC 4.8.x to GCC
                    4.9.x for ARM thumb1
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fredrik.hederstie...@securitas-direct.com
  Target Milestone: ---

Created attachment 36308
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36308&action=edit
Example code

Starting with GCC 4.9.x the code size increase with arm-eabi thumb for attached
example code. It seems related to alignment and is still present in GCC 5.2.0.

Example C Code (see attachment for more and list):
The code does cause possible alignment data abort, but still it should compile
consistent and fine assuming user give aligned data. Example 5 gives
type-punned warning for all compilations, neither of the other examples gives
warnings.

extern void func(int data);
char global_data_unaligned[4];
void test_unaligned_1(void) {
  int *idata = (int*)global_data_unaligned;
  func(*idata);
}

Compiles to GCC 4.8.5 arm-none-eabi cortex-m0  -Os

00000000 <test_unaligned_1>:
   0:   b508            push    {r3, lr}
   2:   4b07            ldr     r3, [pc, #28]   ; (20 <test_unaligned_1+0x20>)
   4:   7858            ldrb    r0, [r3, #1]
   6:   781a            ldrb    r2, [r3, #0]
   8:   0200            lsls    r0, r0, #8
   a:   4310            orrs    r0, r2
   c:   789a            ldrb    r2, [r3, #2]
   e:   78db            ldrb    r3, [r3, #3]
  10:   0412            lsls    r2, r2, #16
  12:   4310            orrs    r0, r2
  14:   061b            lsls    r3, r3, #24
  16:   4318            orrs    r0, r3
  18:   f7ff fffe       bl      0 <func>
  1c:   bd08            pop     {r3, pc}
  1e:   46c0            nop                     ; (mov r8, r8)
  20:   00000000        .word   0x00000000

Compiles GCC 5.2.0 arm-none-eabi cortex-m0 -Os,  +4 bytes

00000000 <test_unaligned_1>:
   0:   b510            push    {r4, lr}
   2:   4c08            ldr     r4, [pc, #32]   ; (24 <test_unaligned_1+0x24>)
   4:   7863            ldrb    r3, [r4, #1]
   6:   7821            ldrb    r1, [r4, #0]
   8:   78a0            ldrb    r0, [r4, #2]
   a:   021b            lsls    r3, r3, #8
   c:   430b            orrs    r3, r1
   e:   0400            lsls    r0, r0, #16
  10:   001a            movs    r2, r3      // ???
  12:   0003            movs    r3, r0      // ???
  14:   78e0            ldrb    r0, [r4, #3]
  16:   4313            orrs    r3, r2
  18:   0600            lsls    r0, r0, #24
  1a:   4318            orrs    r0, r3
  1c:   f7ff fffe       bl      0 <func>
  20:   bd10            pop     {r4, pc}
  22:   46c0            nop                     ; (mov r8, r8)
  24:   00000000        .word   0x00000000

With GCC 4.8.5 arm-none-eabi cortex-m0  -O2, code gets shorter,
no alignment check when compile for speed?

00000000 <test_unaligned_1>:
   0:   b508            push    {r3, lr}
   2:   4b02            ldr     r3, [pc, #8]    ; (c <test_unaligned_1+0xc>)
   4:   6818            ldr     r0, [r3, #0]
   6:   f7ff fffe       bl      0 <func>
   a:   bd08            pop     {r3, pc}
   c:   00000000        .word   0x00000000

------------------------------

Example3 compiled with GCC 4.8.5 arm-none-eabi cortex-m0 -Os

00000048 <test_unaligned_3>:
  48:   b508            push    {r3, lr}
  4a:   4b03            ldr     r3, [pc, #12]   ; (58 <test_unaligned_3+0x10>)
  4c:   2201            movs    r2, #1
  4e:   4393            bics    r3, r2
  50:   6818            ldr     r0, [r3, #0]
  52:   f7ff fffe       bl      0 <func>
  56:   bd08            pop     {r3, pc}
  58:   00000000        .word   0x00000000

Same code compiled with GCC 5.2.0 arm-none-eabi cortex-m0 -Os

00000028 <test_unaligned_3>:
  28:   2201            movs    r2, #1
  2a:   4b05            ldr     r3, [pc, #20]   ; (40 <test_unaligned_3+0x18>)
  2c:   b510            push    {r4, lr}
  2e:   4393            bics    r3, r2
  30:   8858            ldrh    r0, [r3, #2]    // ?? why ldrh
  32:   881a            ldrh    r2, [r3, #0]    // ?? why ldrh
  34:   0400            lsls    r0, r0, #16
  36:   4310            orrs    r0, r2
  38:   f7ff fffe       bl      0 <func>
  3c:   bd10            pop     {r4, pc}
  3e:   46c0            nop                     ; (mov r8, r8)
  40:   00000000        .word   0x00000000

Seems to be some issue with assumtions on alignment, causing larger code size.
I checked IRA dump for IRA-coloring/build and some examples seems to assign
more hardregs with new threads code added in GCC 4.9. Though I haven't digged
further into this yet.

Toolchain was build with GNU Build Buddy for arm-none-eabi, softfloat, see
scripts at https://github.com/fredrikhederstierna/buildbuddy

/Fredrik

Reply via email to