annotate gcc/testsuite/gcc.dg/20000906-1.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do run } */
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 /* Testcase distilled from glibc's nss_parse_service_list in nss/nsswitch.c
kono
parents:
diff changeset
4 It can't be distilled further. Fails with `-O2' for i[3456]86. */
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 /* this simulates a bounded-pointer type. */
kono
parents:
diff changeset
7 struct ucharp { unsigned char *v, *l, *h; };
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 /* this simulates bounded-pointer check prior to pointer dereference. */
kono
parents:
diff changeset
10 #define AREF(var, idx) ((((((((var).v+(idx)) < (var).l) \
kono
parents:
diff changeset
11 || (((var).v+(idx)+1) > (var).h))) \
kono
parents:
diff changeset
12 && (__builtin_trap (), 0)), \
kono
parents:
diff changeset
13 (var).v)[(idx)])
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 struct list
kono
parents:
diff changeset
16 {
kono
parents:
diff changeset
17 struct list *next;
kono
parents:
diff changeset
18 };
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 struct list *
kono
parents:
diff changeset
21 alloc_list (void)
kono
parents:
diff changeset
22 {
kono
parents:
diff changeset
23 static struct list l;
kono
parents:
diff changeset
24 return &l;
kono
parents:
diff changeset
25 }
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 int one = 1;
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 void
kono
parents:
diff changeset
30 foo (struct ucharp cp, struct ucharp lp, struct list **nextp)
kono
parents:
diff changeset
31 {
kono
parents:
diff changeset
32 while (1)
kono
parents:
diff changeset
33 {
kono
parents:
diff changeset
34 struct list *list;
kono
parents:
diff changeset
35 while (AREF (lp, 0) && AREF (cp, AREF (lp, 0)))
kono
parents:
diff changeset
36 ++lp.v;
kono
parents:
diff changeset
37 list = alloc_list ();
kono
parents:
diff changeset
38 while (AREF (cp, AREF (lp, 0)))
kono
parents:
diff changeset
39 ++lp.v;
kono
parents:
diff changeset
40 if (AREF (lp, 0) == one)
kono
parents:
diff changeset
41 do
kono
parents:
diff changeset
42 ++lp.v;
kono
parents:
diff changeset
43 while (AREF (lp, 0) && AREF (cp, AREF (lp, 0)));
kono
parents:
diff changeset
44 /* The above AREF (cp, ...) fails because the pseudo created to
kono
parents:
diff changeset
45 hold cp.v holds garbage, having never been set.
kono
parents:
diff changeset
46 The easiest way to see the problem is to compile wiht `-O2 -da'
kono
parents:
diff changeset
47 then look at *.09.loop. Search for something like this:
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 Hoisted regno 183 r/o from (mem/s:SI (reg:SI 16 argp) 10)
kono
parents:
diff changeset
50 Replaced reg 91, deleting init_insn (213).
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 Now, look for the use of reg 91, which has no set. */
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 *nextp = list;
kono
parents:
diff changeset
55 nextp = &list->next;
kono
parents:
diff changeset
56 if (!*lp.v)
kono
parents:
diff changeset
57 break;
kono
parents:
diff changeset
58 }
kono
parents:
diff changeset
59 }
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 extern void exit (int);
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 int
kono
parents:
diff changeset
64 main (void)
kono
parents:
diff changeset
65 {
kono
parents:
diff changeset
66 static unsigned char cp0[] = "\0\0\0\0";
kono
parents:
diff changeset
67 struct ucharp cp = { cp0, cp0, cp0 + sizeof (cp0) };
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 static unsigned char lp0[] = "\1\1\0\0";
kono
parents:
diff changeset
70 struct ucharp lp = { lp0, lp0, lp0 + sizeof (lp0) };
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 struct list list;
kono
parents:
diff changeset
73 struct list *nextp = &list;
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 foo (cp, lp, &nextp);
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 exit (0);
kono
parents:
diff changeset
78 }