correctness in localized global variable between setjmp and longjmp

I noticed that c code below failed with -O3 :

#include <setjmp.h>

#include <stdio.h>

static int cnt;

int main(){

int var;

jmp_buf buffer;

cnt = 0;

if ((var = setjmp(buffer)) == 0) {

printf(" if true, var: %d, .count:%d , increase count !\n",var, cnt);

cnt++;

longjmp(buffer, 2);

} else {

if (cnt == 1)

printf(" Pass var: %d, .count:%d \n",var, cnt);

else

printf(" Fail !!! var: %d, .count:%d \n",var, cnt);

}

return 0;

}

The documentation of setjmp/longjmp says that the values of objects of automatic storage duration which are local to the function containing the invocation of the corresponding setjmp() which do not have volatile-qualified type and which are changed between the setjmp() invocation and longjmp() call are indeterminate.

Even though “cnt” is a global variable, above c code failed because the globalopt pass localizes the global value (cnt) in main(), causing that the value of the global variable becomes indeterminate between setjmp() and longjmp. I believe the globalopt pass need to check this case before localizing global variables. Is there any better solution about it?

Thanks,

Balaram

No, looks like it has to check it.

This is a very specific optimization, but it looks like it is still
important in old benchmarks.

Cheers,
Rafael

Balaram,
Perhaps you should file a bug report here:
http://llvm.org/bugs/

Chad