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