annotate gcc/testsuite/gcc.dg/pr10392-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 /* PR optimization/10392
kono
parents:
diff changeset
2 * Reporter: marcus@mc.pp.se
kono
parents:
diff changeset
3 * Summary: [3.3/3.4 regression] [SH] optimizer generates faulty array indexing
kono
parents:
diff changeset
4 * Description:
kono
parents:
diff changeset
5 * The address calculation of an index operation on an array on the stack
kono
parents:
diff changeset
6 * can _under some conditions_ get messed up completely
kono
parents:
diff changeset
7 *
kono
parents:
diff changeset
8 * Testcase tweaked by dank@kegel.com
kono
parents:
diff changeset
9 * Problem only happens with -O2 -m4, so it should only happen on sh4,
kono
parents:
diff changeset
10 * but what the heck, let's test other architectures, too.
kono
parents:
diff changeset
11 * Not marked as xfail since it's a regression.
kono
parents:
diff changeset
12 */
kono
parents:
diff changeset
13 /* { dg-do run } */
kono
parents:
diff changeset
14 /* { dg-options "-O2" } */
kono
parents:
diff changeset
15 /* { dg-options "-O2 -m4" { target sh4-*-* } } */
kono
parents:
diff changeset
16 extern void abort (void);
kono
parents:
diff changeset
17 const char *dont_optimize_function_away;
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 const char *use(const char *str)
kono
parents:
diff changeset
20 {
kono
parents:
diff changeset
21 dont_optimize_function_away = str;
kono
parents:
diff changeset
22 if (str[0] != 'v')
kono
parents:
diff changeset
23 abort();
kono
parents:
diff changeset
24 if (str[1] < '1' || str[1] > '6')
kono
parents:
diff changeset
25 abort();
kono
parents:
diff changeset
26 if (str[2])
kono
parents:
diff changeset
27 abort();
kono
parents:
diff changeset
28 return str[2] ? "notused" : "v6";
kono
parents:
diff changeset
29 }
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 const char *func(char *a, char *b)
kono
parents:
diff changeset
32 {
kono
parents:
diff changeset
33 char buf[128];
kono
parents:
diff changeset
34 unsigned char i;
kono
parents:
diff changeset
35 const char *result;
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 char *item[] = {
kono
parents:
diff changeset
38 "v1",
kono
parents:
diff changeset
39 "v2",
kono
parents:
diff changeset
40 };
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 buf[0] = 'v';
kono
parents:
diff changeset
43 buf[1] = '3';
kono
parents:
diff changeset
44 buf[2] = 0;
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 for (i = 0; i < 2; i++) {
kono
parents:
diff changeset
47 /* bug is: following line passes wild pointer to use() on sh4 -O2 */
kono
parents:
diff changeset
48 result = use(item[i]);
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 use(buf);
kono
parents:
diff changeset
51 use(a);
kono
parents:
diff changeset
52 use(b);
kono
parents:
diff changeset
53 result = use(result);
kono
parents:
diff changeset
54 }
kono
parents:
diff changeset
55 return result;
kono
parents:
diff changeset
56 }
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 int main()
kono
parents:
diff changeset
59 {
kono
parents:
diff changeset
60 func("v4", "v5");
kono
parents:
diff changeset
61 return 0;
kono
parents:
diff changeset
62 }
kono
parents:
diff changeset
63