re PR tree-optimization/20100 (LIM is pulling out a pure function even though there...
authorHans-Peter Nilsson <hp@axis.com>
Wed, 23 Feb 2005 22:20:48 +0000 (22:20 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Wed, 23 Feb 2005 22:20:48 +0000 (22:20 +0000)
PR tree-optimization/20100
* gcc.c-torture/execute/pr20100-1.c: New test.

From-SVN: r95474

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr20100-1.c [new file with mode: 0644]

index 199acc114b74c1cce69dd8673c6c4fe516a7a60f..ed9f71941010e1a719d0639375fee84b0a7bd291 100644 (file)
@@ -1,3 +1,8 @@
+2005-02-23  Hans-Peter Nilsson  <hp@axis.com>
+
+       PR tree-optimization/20100
+       * gcc.c-torture/execute/pr20100-1.c: New test.
+
 2005-02-23  Tobias Schl"uter  <tobias.schlueter@physik.uni-muenchen.de>
 
        * gfortran.dg/implicit_3.f90: New test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr20100-1.c b/gcc/testsuite/gcc.c-torture/execute/pr20100-1.c
new file mode 100644 (file)
index 0000000..8782edc
--- /dev/null
@@ -0,0 +1,76 @@
+/* PR tree-optimization/20100
+   Pure function being treated as const.
+   Author: Hans-Peter Nilsson.  */
+
+static unsigned short g = 0;
+static unsigned short p = 0;
+unsigned char e;
+
+static unsigned short
+next_g (void)
+{
+  return g == e - 1 ? 0 : g + 1;
+}
+
+static unsigned short
+curr_p (void)
+{
+  return p;
+}
+
+static unsigned short
+inc_g (void)
+{
+  return g = next_g ();
+}
+
+static unsigned short
+curr_g (void)
+{
+  return g;
+}
+
+static char
+ring_empty (void)
+{
+  if (curr_p () == curr_g ())
+    return 1;
+  else
+    return 0;
+}
+
+char
+frob (unsigned short a, unsigned short b)
+{
+  g = a;
+  p = b;
+  inc_g ();
+  return ring_empty ();
+}
+
+unsigned short
+get_n (void)
+{
+  unsigned short n = 0;
+  unsigned short org_g;
+  org_g = curr_g ();
+  while (!ring_empty () && n < 5)
+    {
+      inc_g ();
+      n++;
+    }
+
+  return n;
+}
+
+void abort (void);
+void exit (int);
+int main (void)
+{
+  e = 3;
+  if (frob (0, 2) != 0 || g != 1 || p != 2 || e != 3
+      || get_n () != 1
+      || g != 2 || p != 2)
+    abort ();
+  exit (0);
+}