tree-optimization/54498 - testcase for the bug

Message ID 20230327123159.5B75713482@imap2.suse-dmz.suse.de
State Accepted
Headers
Series tree-optimization/54498 - testcase for the bug |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Richard Biener March 27, 2023, 12:31 p.m. UTC
  I realized I never added a testcase for the fix of this bug.  Now done
after verifying it still fails when reverting the fix.

tested on x86_64-unknown-linux-gnu, pushed.

	PR tree-optimization/54498
	* g++.dg/torture/pr54498.C: New testcase.
---
 gcc/testsuite/g++.dg/torture/pr54498.C | 57 ++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/torture/pr54498.C
  

Patch

diff --git a/gcc/testsuite/g++.dg/torture/pr54498.C b/gcc/testsuite/g++.dg/torture/pr54498.C
new file mode 100644
index 00000000000..74651f9063a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr54498.C
@@ -0,0 +1,57 @@ 
+// { dg-do run }
+// { dg-additional-options "-fno-tree-sra" }
+
+#include <complex>
+
+using namespace std;
+
+class bar_src {
+ public:
+  bar_src() : next(0) {}
+  virtual ~bar_src() { delete next; }
+
+  bar_src *next;
+};
+
+class foo_src : public bar_src {
+ public:
+  foo_src(double f, double fwidth, double s = 5.0);
+  virtual ~foo_src() {}
+
+ private:
+  double freq, width, peak_time, cutoff;
+};
+
+
+foo_src::foo_src(double f, double fwidth, double s) {
+  freq = f; width = 1/fwidth; cutoff = s*width; peak_time = cutoff;
+}
+
+complex<double> do_ft2(int i) __attribute__ ((noinline));
+
+complex<double> do_ft2(int i) {
+  return i == 0 ? complex<double>(-491.697,887.05) : complex<double>(-491.692,887.026);
+}
+
+void foo(void) {
+  complex<double> prev_ft = 0.0, ft = 0.0;
+  for (int i=0; i < 2; i++) {
+    prev_ft = ft;
+    {
+      foo_src src(1.0, 1.0 / 20);
+      ft = do_ft2(i);
+    }
+    if (i > 0)
+      {
+        double a = abs(ft - prev_ft);
+        if (a < 0.024 || a > 0.025)
+          __builtin_abort ();
+      }
+  }
+}
+
+int main()
+{
+  foo();
+  return 0;
+}