https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121714

            Bug ID: 121714
           Summary: memcmp == 0 optimization should use
                    MAX_FIXED_MODE_SIZE rather than word_mode
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: pinskia at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---

Currently strlen_pass::handle_builtin_memcmp uses:
&& (leni = tree_to_uhwi (len)) <= GET_MODE_SIZE (word_mode)

But I think this should be changed to use MAX_FIXED_MODE_SIZE  instead.

This at least could optimize:
```
#include <vector>
struct s1
{
  long a[2];
  bool operator==(const s1 &o) const
  {
        return __builtin_memcmp(this, &o, sizeof(o));
  }
};
bool test_(std::vector<s1>  &in) {
#if 1
  if (in.size() != 1)
    return false;
  if (in.begin() == in.end())
    __builtin_unreachable();
  if (in.begin()+1 != in.end())
    __builtin_unreachable();
#endif
  return in == std::vector<s1>{{0,0}};
}
```

Note the __builtin_unreachables there is give GCC hints; see PR 121712 and PR
121710 on why those are needed.

Reply via email to