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

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
It's a missed PRE:

ANTIC_OUT[3] := { iftmp.0_6 (0006), {min_expr,iftmp.0_6,-1} (0011),
{nop_expr,pretmp_10} (0012) }
[changed] ANTIC_IN[3] := { {mem_ref<0B>,addr_expr<&m>}@.MEM_5(D) (0001),
{nop_expr,m.1_1} (0006), {min_expr,iftmp.0_6,-1} (0011), {nop_expr,pretmp_10}
(0012) }

  <bb 3> [local count: 536870912]:
  m.1_1 = m;
  iftmp.0_6 = (int) m.1_1;

  <bb 4> [local count: 1073741824]:
  # iftmp.0_2 = PHI <iftmp.0_6(3), a_4(D)(5)>
  _7 = MIN_EXPR <iftmp.0_2, -1>;

we fail to fully simplify MIN_EXPR <iftmp.0_6, -1> because we lack a pattern
for MIN ((int)ushrtvar, -1)

Adding a lame

(simplify
 (min (convert @0) INTEGER_CST@1)
 (if (TYPE_UNSIGNED (TREE_TYPE (@0))
      && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (@0))
      && tree_int_cst_sgn (@1) == -1)
  @1))

makes us PRE the MIN to

  <bb 2> [local count: 1073741824]:
  if (f_3(D) != 0)
    goto <bb 4>; [50.00%]
  else
    goto <bb 3>; [50.00%]

  <bb 3> [local count: 536870912]:
  _10 = MIN_EXPR <a_4(D), -1>;
  _12 = (short unsigned int) _10;
  goto <bb 5>; [100.00%]

  <bb 4> [local count: 536870912]:

  <bb 5> [local count: 1073741824]:
  # prephitmp_13 = PHI <65535(4), _12(3)>
  return prephitmp_13;

which produces

_Z4funcii:
.LFB1:
        .cfi_startproc
        testl   %edi, %edi
        movl    $-1, %eax
        cmovns  %eax, %edi
        testl   %esi, %esi
        movl    $65535, %eax
        cmove   %edi, %eax
        ret

which looks even worse.

Reply via email to