https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117126
Bug ID: 117126 Summary: GCC 14 generates redundant movq xmm1, xmm1 instructions with -O2 optimization, leading to code bloat (regression from GCC 13.x) Product: gcc Version: 14.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: peter.fors at mindkiller dot com Target Milestone: --- This is a regression from GCC 13.x to GCC 14. The generated code contains redundant movq xmm1, xmm1 and movq xmm0, xmm0 instructions when using -O2 optimization. The issue occurs in all GCC 14 releases, including the current trunk. Steps to Reproduce: Compile the following code using gcc -O2: Example code: #include <stdint.h> float velocityX = 0; float velocityY = 0; const float maxSpeed = 3.0; const float rampSpeed = 4.0; float velocity[2] = {0.0f, 0.0f} ; float position[2] = {0.0f, 0.0f}; void update(float analog[2], float deltaTime) { float targetVelocity[2] = {analog[0] * maxSpeed, analog[1] * maxSpeed}; velocity[0] += (targetVelocity[0] - velocity[0]) * rampSpeed * deltaTime; velocity[1] += (targetVelocity[1] - velocity[1]) * rampSpeed * deltaTime; position[0] += velocity[0] * deltaTime; position[1] += velocity[1] * deltaTime; } Godbolt Example: https://godbolt.org/z/j5xKxbasf (same code as above with gcc14.1 and 13.3 assembly output set up with -O2). Expected Behavior: The code should not contain redundant movq xmm1, xmm1 and movq xmm0, xmm0 instructions. Actual Behavior: GCC 14 generates redundant move-to-self instructions (movq xmm1, xmm1 and movq xmm0, xmm0) around functional instructions. Regression Window: Last tested GCC 13.1 13.2 13.3 (no issue) First release of GCC 14 shows the issue Issue persists in all GCC 14 versions including trunk Additional Info: Using -march=native reduces the number of redundant instructions, but they are still present.