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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2023-07-08
             Status|UNCONFIRMED                 |NEW
   Target Milestone|---                         |14.0
           Keywords|                            |wrong-code
            Summary|[14 Regression] wrong code  |[14 Regression] wrong code
                   |on llvm-14.0.6              |on llvm-14.0.6 due to
                   |                            |memcmp being miscompiled
     Ever confirmed|0                           |1
          Component|c++                         |target

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Confirmed looks like a target issue dealing with memcmp.
Take:
```

// $ cat bug.cpp
#include <iterator>

typedef unsigned long long u64;

const unsigned MAX_SUBTARGET_WORDS = 4;

[[gnu::noipa]]
int notequal(const void *a, const void *b)
{
        return __builtin_memcmp(a,b,MAX_SUBTARGET_WORDS*sizeof(u64)) != 0;
}

struct FeatureBitset {
  u64 Bits[MAX_SUBTARGET_WORDS] = {0, 0, 0, 0};

  constexpr FeatureBitset() = default;
  constexpr FeatureBitset(std::initializer_list<unsigned> Init) {
    for (auto I : Init) {
      Bits[I] = 1;
    }
  }

  constexpr FeatureBitset operator&(const FeatureBitset &RHS) const {
    FeatureBitset Result = *this;
    for (unsigned I = 0, E = MAX_SUBTARGET_WORDS; I != E; ++I) {
      Result.Bits[I] &= RHS.Bits[I];
    }
    return Result;
  }

  bool operator!=(const FeatureBitset &RHS) const {
      return notequal(Bits, RHS.Bits);
  }
};

static constexpr const FeatureBitset TargetFeatures = { 0, 0, 0, 0, };

__attribute__((noipa))
bool is_eq_buggy (const FeatureBitset & lf, const FeatureBitset & rf) {
  if ((lf & TargetFeatures) != (rf & TargetFeatures))
    return false;
  return true;
}

__attribute__((noipa))
void bug(void) {
    FeatureBitset lf, rf;
    lf.Bits[0] = rf.Bits[0] = 1;
    lf.Bits[1] = rf.Bits[1] = 1;
    lf.Bits[2] = rf.Bits[2] = 1;
    lf.Bits[3] = rf.Bits[3] = 1;

    bool r = is_eq_buggy (lf, rf);
    if (!r) __builtin_trap();
}

__attribute__((noipa))
int main(void) {
    bug();
}
```

The above is not miscompiled but once the gnu::noipa on the notequal is
removed, it is.

Reply via email to