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