https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117695
王淳洋 <koule2333 at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |UNCONFIRMED Resolution|INVALID |--- --- Comment #3 from 王淳洋 <koule2333 at gmail dot com> --- #include <signal.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> unsigned long Run_Index; void report() { fprintf(stderr,"COUNT|%ld|1|lps\n", Run_Index); exit(0); } int main (argc, argv) int argc; char *argv[]; { int duration = atoi(argv[1]); Run_Index = 0; signal(SIGALRM, report); alarm(duration); int ans = 0; for (Run_Index = 1; ; Run_Index++) { ans += Run_Index; } printf("%d\n", ans); } I have written a shorter test to describe the situation I encountered. This time it has nothing to do with LTO. gcc -O2 will eliminate the loop in test.c, resulting in the loss of calculations related to Run_Index, even though there is a use of Run_Index in the report function. I wonder if this is reasonable?