This is the mail archive of the gcc@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]

Volatile qualification on pointer and data


Hi,

I am noticing a very concerning change of behaviour from GCC45 to GCC46 on our applications.

The following code:
static const unsigned int foo = 1;
unsigned int test( void )
{
  const volatile unsigned int *bar = &foo;
  return ( *bar );
}

in GCC45 works as expected:
$test:
  ld AL,#foo  ;; AL is return register
  bra 0,X     ;; end function

in GCC46:
$test:
  ld AL,0
  bra 0,X

This is worrying because qualifying the data as volatile should be enough to prevent these sort of optimizations. It did until GCC46.

I noticed that this seems to be implementation dependent according to C99 6.7.3.6, however, this change of implementation is unexpected and I don't see a reason for it. Is there any reason for this change?

The correct code is generated is both the pointer and data are qualified as volatile even it is not straightforward code since it has some moves to and from the stack pointer.

This is easily reproducible in i386 so, it's definitely not backend specific.

Cheers,
--
PMatos


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