https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120034
Bug ID: 120034 Summary: Fails to recognize bzhi consistently Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: rguenth at gcc dot gnu.org Target Milestone: --- The following testcases manage to emit bzhi only for the first case, not the others: #define uint64_t unsigned long #define uint32_t unsigned int uint64_t bzhi_emulation(uint64_t value, uint32_t index) { if (index >= 64) { return value; // No change if index is out of range } uint64_t mask = (1ULL << index) - 1; return value & mask; } uint32_t bzhi_emulation1(uint32_t value, uint32_t index) { return value & ((1ULL << index) - 1); } void foo(uint32_t value1, uint32_t value2); void bzhi_emulation2(uint32_t value1, uint32_t index, const unsigned char* const a, const unsigned char* const b) { uint32_t value; const uint32_t btMask = (1 << index) - 1; const uint32_t check = (unsigned int) (a-b); value = 2*(check&btMask); value1 = 2*(value1&btMask); foo(value1, value); } uint32_t bzhi_emulation3(uint32_t value1, uint32_t value2, uint32_t index ) { uint32_t lvalue1; uint32_t lvalue2; const uint32_t btMask = (1 << index) - 1; lvalue1 = 2*(value1&btMask); lvalue2 = 2*(value2&btMask); return lvalue1 + lvalue2; } void bzhi_emulation4(uint32_t value1, uint32_t value2, uint32_t index ) { uint32_t lvalue1; uint32_t lvalue2; const uint32_t btMask = (1 << index) - 1; lvalue1 = (value1&btMask); lvalue2 = (value2&btMask); foo(lvalue1 , lvalue2); }