[Info-vax] LLVM, volatile and async VMS I/O and system calls
Jan-Erik Söderholm
jan-erik.soderholm at telia.com
Sun Oct 3 11:16:04 EDT 2021
Den 2021-10-03 kl. 16:21, skrev Bill Gunshannon:
> On 10/3/21 8:29 AM, chris wrote:
>> On 10/03/21 10:21, Jan-Erik Söderholm wrote:
>>> Den 2021-10-03 kl. 01:06, skrev chris:
>>>>
>>>> So, it really comes down to optimiser choice of instruction, depending
>>>> on the use of the volatile keyword. Perhaps optimisers might optimise
>>>> such reads out, but that common ?.
>>>
>>> Optimizing out code not needed is one of the most common things that
>>> optimizers does. A very short example.
>>>
>>> int a;
>>> int b;
>>> void main() {
>>> a = 10;
>>> b = a;
>>> b = a;
>>> }
>>>
>>> The second assignment to b will simply be removed since it is
>>> a duplicate of the first and the value of a has not changed, at
>>> least not as far as the compiler can see.
>>>
>>> Compare with:
>>>
>>> int volatile a;
>>> int b;
>>> void main() {
>>> a = 10;
>>> b = a;
>>> b = a;
>>> }
>>>
>>> This tells the compiler that the value of a can change outside of
>>> the current compile unit and both assignments will be left to be
>>> done and the value of b could be different after each assignment.
>>>
>>> The first generates 7 Alpha instructions and the second 9 instructions.
>>
>> Would be interesting to see instructions generated, so we can see what
>> is happening. Instruction count alone doesn't say much.
>
> More interesting than you might thnk. Here's an x86 version.
>
> .text
> .globl main
> .type main, @function
> main:
> .LFB0:
> .cfi_startproc
> movl $10, a(%rip)
> movl $10, b(%rip)
> ret
> .cfi_endproc
> .LFE0:
> .size main, .-main
> .comm b,4,4
> .comm a,4,4
> .ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
> .section .note.GNU-stack,"", at progbits
>
> ---------------------------------------
>
> .text
> .globl main
> .type main, @function
> main:
> .LFB0:
> .cfi_startproc
> movl $10, a(%rip)
> movl a(%rip), %eax
> movl a(%rip), %eax
> movl %eax, b(%rip)
> ret
> .cfi_endproc
> .LFE0:
> .size main, .-main
> .comm b,4,4
> .comm a,4,4
> .ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
> .section .note.GNU-stack,"", at progbits
>
> ------------------------------------------
>
> And the diff:
>
> < movl $10, b(%rip)
> ---
> > movl a(%rip), %eax
> > movl a(%rip), %eax
> > movl %eax, b(%rip)
>
>
> Most interesting.
>
> bill
OK. since b isn't used for anything between the two assignments,
the first movl is removed. But the final value is still frmo the
second read of a, anyway.
Try with using b for something in between the assignments.
int a;
int b;
int c, d;
void main() {
a = 10;
b = a;
c = b;
b = a; (Probably removed by the optimizer...)
d = b;
}
int volatile a;
int b;
int c, d;
void main() {
a = 10;
b = a;
c = b;
b = a;
d = b;
}
Anyway, it is obvious that "volatile" does change the way the
compiler/optimizer builds the code. As expected, of course.
More information about the Info-vax
mailing list