This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/30517] Inefficient address calculation on i386
- From: "ubizjak at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 21 Jan 2007 11:38:17 -0000
- Subject: [Bug target/30517] Inefficient address calculation on i386
- References: <bug-30517-10175@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #1 from ubizjak at gmail dot com 2007-01-21 11:38 -------
(In reply to comment #0)
> gcc with -Os -fno-PIC generates:
> movb $38, (%ebx,%edx) # 45 *movqi_1/7 [length = 4]
> leal (%ebx,%edx), %eax # 122 *lea_1 [length = 3]
> movb $108, 1(%eax) # 48 *movqi_1/7 [length = 4]
> movb $116, 2(%eax) # 50 *movqi_1/7 [length = 4]
> movb $59, 3(%eax) # 52 *movqi_1/7 [length = 4]
> addl $4, %edx # 54 *addsi_1/1 [length = 3]
>
> movb $38, (%ebx,%edx) # 61 *movqi_1/7 [length = 4]
> movb $103, 1(%edx,%ebx) # 64 *movqi_1/7 [length = 5]
> movb $116, 2(%edx,%ebx) # 67 *movqi_1/7 [length = 5]
> movb $59, 3(%edx,%ebx) # 70 *movqi_1/7 [length = 5]
> addl $4, %edx # 71 *addsi_1/1 [length = 3]
I think this is due to address cost calculation, which returns the same cost
for different complex addressing modes. Current costs are (taken from ivopts
tree dump):
Address costs:
index costs 2
sym + index costs 1
var + index costs 3
sym + var + index costs 2
cst + index costs 1
sym + cst + index costs 1
var + cst + index costs 2
sym + var + cst + index costs 2
rat * index costs 2
sym + rat * index costs 1
var + rat * index costs 3
sym + var + rat * index costs 2
cst + rat * index costs 1
sym + cst + rat * index costs 1
var + cst + rat * index costs 2
sym + var + cst + rat * index costs 2
Unfortunatelly, changing address costs has tendency to create worse code in
other places (for example - offset is moved into a register and reg+reg access
is used insted of reg+offset access).
> The second is the same size as the first at the moment, but should be
> transformed into the same thing.
If they are the same size (and there is no speed impact), there is actually no
point to expect that they should compile to the same thing.
BTW: similar effect of address cost can be seen in PR/24669.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30517