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

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
So the actual testcase (from CPU 2017 leela) is more like the following where
IMO hoisting of the data start pointer should be OK since 'this' should be
a valid object.

#include <vector>

class Foo
{
public:
    void fun (std::vector<int>& blacksq);
    std::vector<int> m_mcowner;
};

void Foo::fun(std::vector<int>& blacksq)
{
  for (unsigned int i = 0; i < blacksq.size(); i++)
    if (blacksq[i])
      m_mcowner[i]++;
}


and the IL we get into if-coversion before vectorization is

  <bb 3> [local count: 1014280150]:
  # _18 = PHI <_4(12), 0(13)>
  # i_17 = PHI <i_14(12), 0(13)>
  _12 = _18 * 4;
  _10 = _26 + _12;
  _1 = *_10;
  if (_1 != 0)
    goto <bb 4>; [50.00%]
  else
    goto <bb 5>; [50.00%]

  <bb 4> [local count: 507140075]:
  _15 = MEM[(struct vector *)this_11(D)].D.27775._M_impl.D.27090._M_start;
  _16 = _15 + _12;
  _2 = *_16;
  _3 = _2 + 1;
  *_16 = _3;

  <bb 5> [local count: 1014280150]:
  i_14 = i_17 + 1;
  _4 = (long unsigned int) i_14;
  if (_4 < _21)
    goto <bb 12>; [94.50%]

here hoisting of MEM[(struct vector
*)this_11(D)].D.27775._M_impl.D.27090._M_start out of the loop should be OK.

Reply via email to