Why the compiler can not recognize what variables are volatile?

Xi Ruoyao xry111@mengyan1223.wang
Thu Feb 7 02:18:00 GMT 2019


On 2019-02-06 18:44 -0600, Peng Yu wrote:
> Hi,
> 
> If I compile the following program without -O*, it will print this.
> 
> $ ./main.exe
> 2
> 20
> 
> If I compile it with -O1 or any other number > 1, it will print this.
> 
> $ ./main.exe
> 2
> 10
> 
> The optimization clearly changes the semantics of the program. Why the
> compiler can not figure out local_var2 is volatile on its own to
> reduce the burdens of the programmers in having to figure out what
> variables should be specified as volatile?
> 
> Thanks.
> 
> #include <stdio.h>
> #include <setjmp.h>
> 
> static jmp_buf buf;
> 
> int main() {
>     volatile int local_var = 1;
>     int local_var2 = 10;
>     if(!setjmp(buf)) {
>         local_var = 2;
>         local_var2 = 20;
>         longjmp(buf, 1);
>     } else {
>         printf("%d\n", local_var);
>         printf("%d\n", local_var2);
>     }
> 
>     return 0;
> }

"I'm a compiler, not a programmer!"

If the setjmp/longjmp can be refactored to some semantical thing, the
programmer should do it and remove the usage of setjmp/longjmp.

Otherwise, the compiler can not see which variable should be volatile,
because control flow analysis is useless.
-- 
Xi Ruoyao <xry111@mengyan1223.wang>
School of Aerospace Science and Technology, Xidian University



More information about the Gcc-help mailing list