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

--- Comment #1 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Thanks.  The test is rather over-specified, it seems.

x86_64 gimple for test_2 is:

  _1 = p_5(D) == 0B;
  _2 = q_6(D) == 0B;
  _3 = _1 | _2;
  if (_3 != 0)
    goto <bb 4>; [51.12%]
  else
    goto <bb 3>; [48.88%]


powerpc64le gimple for test_2 has:

  if (p_2(D) == 0B)
    goto <bb 5>; [18.09%]
  else
    goto <bb 3>; [81.91%]

  <bb 3> [local count: 879501929]:
  if (q_3(D) == 0B)
    goto <bb 5>; [30.95%]
  else
    goto <bb 4>; [69.05%]

So on x86_64, it's done both comparisons against NULL first, and optimized the
|| into:
  _3 = _1 | _2;
whereas on powerpc64le it uses control flow to do this.

The purpose of this test is to verify that the pattern-matching detects the
underlying conditionals in the presence of that "_3 = _1 | _2;" optimization,
so maybe a gimple FE test might be appropriate here.

I'm not sure where the difference between the targets originates; is there a
way to force the usage of bitwise-or here?

Reply via email to