This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

PATCH: New c-torture test


I just committed this:

2000-09-06  Greg McGary  <greg@mcgary.org>

	* gcc.c-torture/20000906.c: New test.
	* gcc.c-torture/20000906.x: Expect failure for ix86 at `-O2'.

Index: gcc/testsuite/gcc.c-torture/execute/20000906-1.c
===================================================================
RCS file: 20000906-1.c
diff -N 20000906-1.c
--- /dev/null	Tue May  5 13:32:27 1998
+++ 20000906-1.c	Wed Sep  6 01:24:33 2000
@@ -0,0 +1,76 @@
+/* Testcase distilled from glibc's nss_parse_service_list in nss/nsswitch.c
+   It can't be distilled further.  Fails with `-O2' for i[3456]86.  */
+
+/* this simulates a bounded-pointer type.  */
+struct ucharp { unsigned char *v, *l, *h; };
+
+/* this simulates bounded-pointer check prior to pointer dereference.  */
+#define AREF(var, idx) ((((((((var).v+(idx)) < (var).l) \
+			   || (((var).v+(idx)+1) > (var).h))) \
+			  && (__builtin_trap (), 0)), \
+			 (var).v)[(idx)])
+
+struct list
+{
+  struct list *next;
+};
+
+struct list *
+alloc_list (void)
+{
+  static struct list l;
+  return &l;
+}
+
+int one = 1;
+
+void
+foo (struct ucharp cp, struct ucharp lp, struct list **nextp)
+{
+  while (1)
+    {
+      struct list *list;
+      while (AREF (lp, 0) && AREF (cp, AREF (lp, 0)))
+        ++lp.v;
+      list = alloc_list ();
+      while (AREF (cp, AREF (lp, 0)))
+        ++lp.v;
+      if (AREF (lp, 0) == one)
+	do
+	  ++lp.v;
+	while (AREF (lp, 0) && AREF (cp, AREF (lp, 0)));
+      /* The above AREF (cp, ...) fails because the pseudo created to
+	 hold cp.v holds garbage, having never been set.
+	 The easiest way to see the problem is to compile wiht `-O2 -da'
+	 then look at *.09.loop.  Search for something like this:
+
+	 Hoisted regno 183 r/o from (mem/s:SI (reg:SI 16 argp) 10)
+	   Replaced reg 91, deleting init_insn (213).
+
+	 Now, look for the use of reg 91, which has no set.  */
+
+      *nextp = list;
+      nextp = &list->next;
+      if (!*lp.v)
+	break;
+    }
+}
+
+extern void exit (int);
+
+int
+main (void)
+{
+  static unsigned char cp0[] = "\0\0\0\0";
+  struct ucharp cp = { cp0, cp0, cp0 + sizeof (cp0) };
+
+  static unsigned char lp0[] = "\1\1\0\0";
+  struct ucharp lp = { lp0, lp0, lp0 + sizeof (lp0) };
+
+  struct list list;
+  struct list *nextp = &list;
+
+  foo (cp, lp, &nextp);
+
+  exit (0);
+}
Index: gcc/testsuite/gcc.c-torture/execute/20000906-1.x
===================================================================
RCS file: 20000906-1.x
diff -N 20000906-1.x
--- /dev/null	Tue May  5 13:32:27 1998
+++ 20000906-1.x	Wed Sep  6 01:24:33 2000
@@ -0,0 +1,14 @@
+# This only fails for `-O2', but not `-O3' or `-Os'
+# as I had expected.   See clues in testcase source file.
+
+set torture_eval_before_execute {
+
+    set compiler_conditional_xfail_data {
+        "loop optimizer leaves dangling pseudo" \
+	"i?86-*-*" \
+	{ "-O2" } \
+	{ "" }
+	}
+}
+
+return 0

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]