[Bug c++/82405] Function not inlined for switch and suboptimal assembly is generated
marxin at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Oct 3 14:50:00 GMT 2017
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;
}
More information about the Gcc-bugs
mailing list