why the barrier() can not take effect?

Andrew Haley aph@redhat.com
Fri Dec 24 10:07:00 GMT 2010


On 12/24/2010 08:32 AM, Parmenides wrote:
> I have modified the code as follows:
>
> #include<stdio.h>
>
> #define barrier() __asm__ __volatile__("": : :"memory")
>
> int main()
> {
>       int i, n;
>       int s = 0;
>       int *p;
>
>       scanf("%d",&n);
>       for (i = 0; i<  n; i++)
>            s += i;
>       barrier();
>       p =&s;<--- for s, the&  operator is used
>       printf("%d %d %d\n", i, n, *p);<--- the s is referenced through a pointer
>
>       return 0;
> }
>
> and the corresponding asm code is as follows:
>
>          leal    -8(%ebp), %eax
>          pushl   %eax
>          pushl   $.LC0
>          call    scanf
>          movl    -8(%ebp), %edx
>          addl    $16, %esp
>          testl   %edx, %edx
>          jg      .L2
>          movl    $0, %eax
>          movl    $0, %ecx
>          jmp     .L4
> .L2:
>          movl    $0, %eax
>          movl    $0, %ecx
> .L5:
>          addl    %eax, %ecx
>          incl    %eax
>          cmpl    %edx, %eax
>          jne     .L5
> .L4:
>         <---  after the barrier(()
>          pushl   %ecx<---  In spite of using the '&' operator, the
> value of s is still gotten from the register rather than the
> corresponding memory location.
>          pushl   -8(%ebp)<--- the value of n is gotten from its
> memory location indeed
>          pushl   %eax
>          pushl   $.LC1
>          call    printf
>
> Alough the '&' operator is used for both 's' and 'n', gcc deals with
> them differently. The former's value is in a register, while the
> latter's value is retrieved from the corresponding memory location. I
> wonder the difference.

Please don't top-post.

I don't know why you'd expect a difference, really.  Try this:

#include <stdio.h>

#define barrier() __asm__ __volatile__(";": : :"memory")

int s = 0;

int main()
{
      int i, n;
      int *p;

      scanf("%d", &n);
      for (i = 0; i < n; i++)
           s += i;
      p = &s;  // <--- for s, the & operator is used
      barrier();
      printf("%d %d %d\n", i, n, *p);  // <--- the s is referenced through a pointer

      return 0;
}

Andrew.



More information about the Gcc-help mailing list