| // This testcase resulted in invalid code generation on x86_64 targets |
| // due to a bug in fold_rtx. For a "true" value, fold_rtx represented it |
| // as const_true_rtx in floating-point mode, if the FLOAT_STORE_FLAG_VALUE |
| // macro is not defined. |
| |
| // { dg-do run } |
| // { dg-options "-O1 -fno-guess-branch-probability -fcse-follow-jumps -fgcse -frerun-cse-after-loop" } |
| |
| class StatVal { |
| |
| public: |
| |
| StatVal(double ev, double va) |
| : m(ev), |
| v(va) {} |
| |
| StatVal(const StatVal& other) |
| : m(other.m), |
| v(other.v) {} |
| |
| StatVal& operator*=(const StatVal& other) { |
| double A = m == 0 ? 1.0 : v / (m * m); |
| double B = other.m == 0 ? 1.0 : other.v / (other.m * other.m); |
| m = m * other.m; |
| v = m * m * (A + B); |
| return *this; |
| } |
| |
| double m; |
| double v; |
| }; |
| |
| extern "C" void abort (void); |
| |
| const StatVal two_dot_three(2, 0.3); |
| |
| int main(int argc, char **argv) { |
| |
| StatVal product3(two_dot_three); |
| |
| product3 *= two_dot_three; |
| |
| if (product3.v > 2.5) |
| { |
| abort(); |
| } |
| return 0; |
| } |