/* The problem in this PR was mostly finding a suitable place to insert the reciprocals of the function arguments. This test case tries to test three possible ways of how this may go wrong. */ /* { dg-options "-O2 -ffast-math" } */ /* { dg-do compile } */ /* The original test case. */ double f1 (double a, double b, double c) { double y0; double y1; if (a == 0.0) { y0 = -c / b; return y0; } y0 = c / b; y1 = a / b; return y0 * y1; } /* Labels may end up in the middle of a block. Also bad. */ double f2 (double a, double b, double c) { double y0; double y1; a_label: another_label: if (a == 0.0) { y0 = -c / b; return y0; } y0 = c / b; y1 = a / b; return y0 * y1; } /* Uses must still be dominated by their defs. */ double f3 (double a, double b, double c) { double y0; double y1; y0 = -c / b; if (a == 0.0) { return y0; } y0 = c / b; y1 = a / b; return y0 * y1; }