https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117545
Bug ID: 117545
Summary: Addition of two integers incorrectly "optimized" to 16
SIMD instructions instead of a single "lea"
Product: gcc
Version: 14.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: svetli97 at gmail dot com
Target Milestone: ---
In some cases passing two numbers to a function as a struct, adding them, and
returning the result causes the compiler to "optimize" the code to a complex
sequence of 16 SIMD instructions instead of a single "lea" as it does in the
other similar examples provided. The same bug happens for both C and C++
equivalent code. I also tested it with clang for reference and the bug doesn't
occur with that compiler.
The code that causes the problem in C++
(also at https://godbolt.org/z/orxa86KMW):
#include<cstdint>
struct S {
uint64_t a;
uint64_t b;
};
uint64_t add(uint64_t a, uint64_t b) {
return a + b;
}
uint32_t add2(S vals) {
return vals.a + vals.b;
}
uint64_t add3(S vals) {
return vals.a + vals.b;
}
int main() {
return 0;
}
// end of example
The functions "add" and "add2" are compiled to a single "lea" instruction, as
expected. But the function "add3" gets optimized to 16 SIMD instructions. I
suppose there is an error with evaluating the cost of certain instructions?
This bug occurs for gcc version 14 but not for 13. And only for optimization
levels -O2 and -O3, but not for -O1.