Re: aliasing with char*

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Wouter Vermaelen wrote:
> Hi,
> 
> Consider the following code fragment:
> 
> -----------------------
> //typedef char T;
> typedef short T;
> 
> int count;
> 
> T f(T* p) {
>     count += 2;
>     T t = *p;
>     count += 3;
>     return t;
> }
> -----------------------
> 
> If T is defined as short this generates the following code (compiled
> with -O3 with recent gcc-4.3 snapshot on linux x86_64):
> 
>     movswl (%rdi),%eax
>     addl   $0x5,0x0(%rip)
>     retq
> 
> With T defined as char it generates this:
> 
>     mov    0x0(%rip),%edx
>     lea    0x2(%rdx),%eax
>     add    $0x5,%edx
>     mov    %eax,0x0(%rip)
>     movzbl (%rdi),%eax
>     mov    %edx,0x0(%rip)
>     retq
> 
> I believe this is because gcc must assume that 'char* p' can potentially
> point to the 'int count' variable.
> 
> However in my program I know for sure that the two don't alias (of
> course this is a much simplified version, just to show the problem). I
> tried adding the restrict keyword, but without success. I also couldn't
> find a useful type or variable attribute.

Previous discussions indicate there is a bug in gcc which makes restrict
ineffective for scalars (I don't remember if there is an accepted C
terminology).  In my examples, the recommended -fargument-noalias is
effective.  I guess it's there to implement Fortran syntax.

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux