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 target/30517] Inefficient address calculation on i386



------- 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


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