房陈 <fancyfl...@gmail.com> writes:

>     I really want to how does gcc compile code like *(ptr base +
> offset), where ptr base is the initial address of a pointer variable
> and offset is any legal integer expression. There is a example here:
>
>     int i = 1;
>     int j = 1;
>     int *buf = (int*)malloc(10 *sizeof(int));
>     *(buf + i + j) = 7;
>
>     And the correspondent assembly code is :
>     ......
>         int i = 1;
>  80483b5:       c7 45 f0 01 00 00 00    movl   $0x1,-0x10(%ebp)
>         int j = 1;
>  80483bc:       c7 45 f4 01 00 00 00    movl   $0x1,-0xc(%ebp)
>         int *buf = (int*)malloc(10 * sizeof(int));
>  80483c3:       c7 04 24 28 00 00 00    movl   $0x28,(%esp)
>  80483ca:       e8 09 ff ff ff          call   80482d8 <mal...@plt>
>  80483cf:       89 45 f8                mov    %eax,-0x8(%ebp)
>
>         *(buf + i + j) = 7;
>  80483d2:       8b 55 f0                mov    -0x10(%ebp),%edx
>  80483d5:       8b 45 f4                mov    -0xc(%ebp),%eax
>  80483d8:       8d 04 02                lea    (%edx,%eax,1),%eax
>  80483db:       c1 e0 02                shl    $0x2,%eax
>  80483de:       03 45 f8                add    -0x8(%ebp),%eax
>  80483e1:       c7 00 07 00 00 00       movl   $0x7,(%eax)
>    ......
> So I guess that gcc would always compute offset "i+j" first, and then
> add the result of "i + j" to the base address of buf to obtain the
> final address. Do I guess right? Is there any exception?
> ps: My gcc version is 4.3.3.

Unless you plan to modify gcc itself, this question would be more
appropriate for the gcc-help mailing list.  Please take any followups
there.

If you compile at -O0, gcc will probably generate code more or less as
you describe.  However, there is no guarantee of that.  If you compile
with optimization, then the instructions can and will be completely
changed.  In particular, for your example, gcc will most likely forward
propagate i + j, fold the constant, and simply use buf + 2.

One way to see what gcc does is to use -fdump-tree-all and examine the
generated dump files.

Ian

Reply via email to