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; }