https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119028
Bug ID: 119028 Summary: Inconsistent behavior across optimization levels in GCC 14.2.0 Product: gcc Version: 14.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: xieym3 at zohomail dot com Target Milestone: --- I have encountered an issue where a specific C source file exhibits different behaviors when compiled with different optimization levels in GCC 14.2.0. When compiling with -O0 or -Os, I get the following linker error: undefined reference to `sqrt' However, when compiling with -O1, -O2, or -Ofast, the compilation and linking complete successfully without errors. I am uncertain whether this is a bug in GCC or a misconfiguration on my part. It can be reproduced on https://godbolt.org/z/599neq67z. $ gcc --verbose Using built-in specs. COLLECT_GCC=/data/xieym/llm/install/gcc-14.2.0/bin/gcc COLLECT_LTO_WRAPPER=/data/xieym/llm/install/gcc-14.2.0/libexec/gcc/x86_64-pc-linux-gnu/14.2.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: /data/xieym/llm/src/gcc-14.2.0/configure --enable-coverage --enable-checking --disable-multilib --disable-shared --disable-bootstrap --enable-languages=c,c++ --prefix=/data/xieym/llm/install/gcc-14.2.0 Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 14.2.0 (GCC) $ cat file.c #include <stdio.h> #include <math.h> // Function to be always inlined static inline __attribute__((always_inline)) double square(double x) { return x * x; } // Function to perform vectorizable operations void process_data(double* data, size_t size) { for (size_t i = 0; i < size; i++) { data[i] = sqrt(square(data[i]) + 1.0); // Vectorizable operation } } int compute_sum(int* array, size_t size) { int sum = 0; for (size_t i = 0; i < size; i++) { for (size_t j = 0; j < size; j++) { if (array[i] > array[j]) { sum += array[i] - array[j]; // Nested loops creating cycles } } } return sum; } int main() { const size_t array_size = 100; double data[array_size]; int array[array_size]; // Initialize data for processing for (size_t i = 0; i < array_size; i++) { data[i] = (double)i / 10.0; array[i] = i % 10; } // Process data with vectorizable operations process_data(data, array_size); // Compute sum with nested loops int result = compute_sum(array, array_size); printf("Computed sum: %d\n", result); #ifdef _WIN32 __try { // Windows-specific exception handling with catchswitch printf("Try block\n"); if (result < 5000) { *(int*)0 = 0; // Force an exception } } __except(1) { printf("Exception caught\n"); } #endif return 0; }