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

            Bug ID: 117890
           Summary: Wrong code with -fvect-cost-model=unlimited
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: lin1.hu at intel dot com
  Target Milestone: ---

Created attachment 59774
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59774&action=edit
A short case

Compile the test file using the option -O2 -march=x86-64-v3
-fvect-cost-model=unlimited will generate wrong code.

Without -fvect-cost-model=unlimited, the output should be 4, but the output is
currently 0.

According to my investigation, in case.c.183t.cunroll.

  <bb 23> [local count: 761014530]:
  _63 = _29 >> 2;
  _64 = ~_63;
  _65 = (_Bool) _64;
  if (_65 != 0)
    goto <bb 18>; [5.50%]
  else
    goto <bb 3>; [94.50%]

  <bb 18> [local count: 223857727]:
  # vect_vec_iv_.29_45 = PHI <{ 5, 6 }(3), { 1, 2 }(7), { 3, 4 }(23)>
  # vect_vec_iv_.31_50 = PHI <{ 3, 2 }(3), { 7, 6 }(7), { 5, 4 }(23)>
  _51 = BIT_FIELD_REF <vect_vec_iv_.31_50, 32, 0>;
  _46 = BIT_FIELD_REF <vect_vec_iv_.29_45, 32, 0>;
  goto <bb 17>; [100.00%]

when the program jump from bb 23. _46 will be 3. 

  <bb 17> [local count: 563714454]:
  # i_38 = PHI <7(3), _46(18)>
  # ivtmp_40 = PHI <1(3), _51(18)>

  <bb 14> [local count: 1127428908]:
  # i_9 = PHI <i_35(15), i_38(17)>
  # ivtmp_17 = PHI <ivtmp_36(15), ivtmp_40(17)>
  _32 = _29 >> i_9;
  _33 = ~_32;
  _34 = (_Bool) _33;
  if (_34 != 0)
    goto <bb 4>; [5.50%]
  else
    goto <bb 16>; [94.50%]

  <bb 4> [local count: 51673825]:
  # i_4 = PHI <i_1(11)>
  _2 = 1 << i_4;
  _19 = (unsigned char) _2;
  goto <bb 6>; [100.00%]


Hence, i_9 will be 3. It's strange. The program jump because the 2nd bit
(counting from 0) is 0, i_9 should be 2, _2 will be 4. But i_9 starts at 3,
making the program semantics change.

Reply via email to