[Bug rtl-optimization/126270] [16/17 Regression] wrong code at -O{2,3} on x86_64-linux-gnu (nondeterministic hang)

"jakub at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126270

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
On the trunk, the distribute_subreg stuff on NOT is only triggered when doing
expand_compound_operation on
(sign_extend:SI (not:QI (subreg:QI (reg:SI 108 [ iftmp.6_16 ]) 0)))
Though, nonzero_bits ((reg:SI 108 [ iftmp.6_16 ]) 0), SImode) says 1.
And at least looking at GIMPLE
  _74 = pretmp_73 != 0;
...
  <bb 10> [local count: 399973127]:
  # iftmp.2_49 = PHI <iftmp.2_48(9), _40(6)>
  _36 = (int) _74;

  <bb 11> [local count: 606019893]:
  # iftmp.6_16 = PHI <_36(10), 0(9)>
  # iftmp.2_50 = PHI <iftmp.2_49(10), iftmp.2_48(9)>
  _9 = (char) iftmp.6_16;
  l_27 = ~_9;
  _10 = (int) l_27;
I think it shoiuld be [0, 1] ranged, so either -1 or -2 result in SImode.

But if I compile with r16-3123 with -O2 and put a breakpoint on that
=> 0x00000000004003cc <+108>:   not    %eax
   0x00000000004003ce <+110>:   movsbl %al,%eax
I see $eax is 0xf7f8bf00 initially, so garbage in the upper bits, bitwise not
turns
that into 0x80740ff and sign extension (missing since r16-3124) changes that to
the
desired 0xffffffff.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.