aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2005-02-23 22:20:48 +0000
committerHans-Peter Nilsson <hp@gcc.gnu.org>2005-02-23 22:20:48 +0000
commitc5625c0c5d6a44589b01f213282fe0ecfe3cd80b (patch)
treeba96c6e7fc269a019c371ebe3c6278f51b1c21de
parent79e4e6a60be010e665edf8644e424dd9eec5bb30 (diff)
downloadgcc-c5625c0c5d6a44589b01f213282fe0ecfe3cd80b.zip
gcc-c5625c0c5d6a44589b01f213282fe0ecfe3cd80b.tar.gz
gcc-c5625c0c5d6a44589b01f213282fe0ecfe3cd80b.tar.bz2
re PR tree-optimization/20100 (LIM is pulling out a pure function even though there is something which can modify global memory)
PR tree-optimization/20100 * gcc.c-torture/execute/pr20100-1.c: New test. From-SVN: r95474
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr20100-1.c76
2 files changed, 81 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 199acc1..ed9f719 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..8782edc
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr20100-1.c
@@ -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);
+}