http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60313

            Bug ID: 60313
           Summary: volatile prevents optimizing logic on memory
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hjl.tools at gmail dot com

[hjl@gnu-6 rib86-1]$ cat q6.i
volatile unsigned char result;

void foo (void)
{
    result |= 0x1;
}
[hjl@gnu-6 rib86-1]$ gcc -S -O2 q6.i
[hjl@gnu-6 rib86-1]$ cat q6.s
    .file    "q6.i"
    .text
    .p2align 4,,15
    .globl    foo
    .type    foo, @function
foo:
.LFB0:
    .cfi_startproc
    movzbl    result(%rip), %eax
    orl    $1, %eax
    movb    %al, result(%rip)
    ret
    .cfi_endproc
.LFE0:
    .size    foo, .-foo

Remove volatile leads to:

foo:
.LFB0:
    .cfi_startproc
    orb    $1, result(%rip)
    ret

Reply via email to