https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100884
Bug ID: 100884 Summary: Comparing unsigned 32 bit integer values generates 64 bit compare instructions when optimized Product: gcc Version: 10.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: mfarazma.ext at gmail dot com Target Milestone: --- **0.c** ``` #include <iostream> uint32_t codegen(); int main(){ uint32_t expected = (codegen()) != 0 ? -1 : -2; bool check_eq = expected == codegen(); if (!(check_eq)){ std::cout << "Check failed" << std::endl; } return 0; } ``` **1.cc** ``` #include <iostream> uint32_t codegen(){ volatile int64_t a = -1; return a; } ``` Compile it with optimization enabled: g++ -O3 0.cc 1.cc Checking the generate code shows this instruction is generated for ` if (!(check_eq)){...}`: ``` cmpd r31,r3 ``` Compiling the same code with gcc version 8.4.0 emits this instead which is correct: ``` cmpw cr7,r3,r31 ``` This issue is causing failures as the returned value from `codegen()` may not have its upper 32 bits cleared and using `cmpd` on it will create the wrong output.