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 tree-optimization/21596] New: [4.0/4.1 Regression] extra temporaries when using global register variables


register int *reg __asm__("%edi");
int test () { return *--reg <= 0; }

With -O2 -fomit-frame-pointer, 4.0,

        movl    %edi, %eax
        leal    -4(%edi), %edi
        movl    -4(%eax), %eax
        testl   %eax, %eax

With 3.4,

        subl    $4, %edi
        cmpl    $0, (%edi)

The problem appears to begin at the tree level, with extra temporaries:

  reg.0 = reg;
  reg.2 = reg.0 - 4B;
  reg = reg.2;
  return *reg.2 <= 0;

We do consider hard register variables not is_gimple_reg, due to needing
to V_MAY_DEF them at call sites.  It would be nice if we could eliminate
these temporaries during TER, or something.

-- 
           Summary: [4.0/4.1 Regression] extra temporaries when using global
                    register variables
           Product: gcc
           Version: 4.0.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: rth at gcc dot gnu dot org
                CC: amacleod at redhat dot com,gcc-bugs at gcc dot gnu dot
                    org


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


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