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

--- Comment #3 from Martin Liška <marxin at gcc dot gnu.org> ---
Isolated test-case where we do not reassociate expressions:

$ cat pr82405-reduced2.c
static inline double eval_square(double r) { return r * r * 4; }
static inline double eval_circle(double r) { return r * r * 3.1415; }

static inline double eval_square2(double r) { return 4 * r * r; }
static inline double eval_circle2(double r) { return 3.1415 * r * r; }

double test_switch_native_slow(int shape, double r) {
    if (shape == 123)
      return eval_circle2(r);
    else
      return eval_square2(r);
}

double test_switch_native_fast(int shape, double r) {
    if (shape == 123)
      return eval_circle(r);
    else
      return eval_square(r);
}

=================
g++  pr82405-reduced2.c -std=c++11 -O2 -fdump-tree-optimized=/dev/stdout

double test_switch_native_slow(int, double) (int shape, double r)
{
  double _1;
  double _5;
  double _6;
  double _7;
  double _8;

  <bb 2> [100.00%]:
  if (shape_2(D) == 123)
    goto <bb 3>; [30.50%]
  else
    goto <bb 4>; [69.50%]

  <bb 3> [30.50%]:
  _5 = r_4(D) * 3.141500000000000181188397618825547397136688232421875e+0;
  _6 = r_4(D) * _5;
  goto <bb 5>; [100.00%]

  <bb 4> [69.50%]:
  _7 = r_4(D) * 4.0e+0;
  _8 = r_4(D) * _7;

  <bb 5> [100.00%]:
  # _1 = PHI <_6(3), _8(4)>
  return _1;

}

double test_switch_native_fast(int, double) (int shape, double r)
{
  double _1;
  double _6;
  double _8;
  double _9;

  <bb 2> [100.00%]:
  _9 = r_4(D) * r_4(D);
  if (shape_2(D) == 123)
    goto <bb 3>; [30.50%]
  else
    goto <bb 4>; [69.50%]

  <bb 3> [30.50%]:
  _6 = _9 * 3.141500000000000181188397618825547397136688232421875e+0;
  goto <bb 5>; [100.00%]

  <bb 4> [69.50%]:
  _8 = _9 * 4.0e+0;

  <bb 5> [100.00%]:
  # _1 = PHI <_6(3), _8(4)>
  return _1;

}

Reply via email to