This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/39989] New: [optimization]


Compiling this code snippet with gcc for arm, 

typedef struct node node_t;
typedef struct node *node_p;
struct node
{
     int orientation;
     node_p pred;
     long depth;
};

node_t *primal_iminus(long *delta, node_t *iplus, node_t*jplus)
{
   node_t *iminus = 0;
       if( iplus->depth < jplus->depth )
       {
           if( iplus->orientation )
               iminus = iplus;
           iplus = iplus->pred;
       }
   return iminus;
}

I got:

       .save   {lr}
       push    {lr}
.LCFI0:
.LVL0:
       .loc 1 13 0
       ldr     r0, [r1, #8]
.LVL1:
       ldr     r3, [r2, #8]
       cmp     r0, r3
       bge     .L2
       .loc 1 15 0
       ldr     r2, [r1]
.LVL2:
       cmp     r2, #0
       beq     .L2
       mov     r0, r1
.LVL3:
       b       .L3
.LVL4:
.L2:
       mov     r0, #0
.LVL5:
.L3:
.LVL6:
       .loc 1 20 0
       @ sp needed for prologue
       pop     {pc}

In which lr is still live at the exit of the function,  we can simply use BX 
lr to return and avoid the prolog instruction push {lr}.

The options I used is:
-fno-exceptions -Wno-multichar -march=armv5te -mtune=xscale -msoft-float -fpic
-mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector
-fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__ -fmessage-length=0 -W -Wall -Wno-unused -DSK_RELEASE
-DNDEBUG -g -Wstrict-aliasing=2 -fgcse-after-reload -frerun-cse-after-loop
-frename-registers -DNDEBUG -UDEBUG -MD -O2 -Os -mthumb -fomit-frame-pointer
-fno-strict-aliasing -finline-limit=64 -finline-functions
-fno-inline-functions-called-once


-- 
           Summary: [optimization]
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: carrot at google dot com
 GCC build triplet: i686-linux
  GCC host triplet: i686-linux
GCC target triplet: arm-eabi


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]