annotate gcc/testsuite/gcc.dg/torture/pr33848.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* &&foo should be hoisted, but on most targets, excess register pressure
kono
parents:
diff changeset
2 forces it to be rematerialized before "data != &&foo". On targets that
kono
parents:
diff changeset
3 have a "branch if registers are equal" instruction, this leads to the
kono
parents:
diff changeset
4 branch having two LABEL_REFs: one for the branch target and one for
kono
parents:
diff changeset
5 &&foo. When reloading &&foo into a register, reload would wrongly
kono
parents:
diff changeset
6 say that &&foo was the target of the branch, and the real target would
kono
parents:
diff changeset
7 then be removed as dead. */
kono
parents:
diff changeset
8 /* { dg-do link } */
kono
parents:
diff changeset
9 /* { dg-require-effective-target label_values } */
kono
parents:
diff changeset
10 #define NVARS 30
kono
parents:
diff changeset
11 #define MULTI(X) \
kono
parents:
diff changeset
12 X( 0), X( 1), X( 2), X( 3), X( 4), X( 5), X( 6), X( 7), X( 8), X( 9), \
kono
parents:
diff changeset
13 X(10), X(11), X(12), X(13), X(14), X(15), X(16), X(17), X(18), X(19), \
kono
parents:
diff changeset
14 X(20), X(21), X(22), X(23), X(24), X(25), X(26), X(27), X(28), X(29)
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 #define DECLARE(INDEX) i##INDEX = gv[INDEX]
kono
parents:
diff changeset
17 #define COPY(INDEX) gv[INDEX] = i##INDEX
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 volatile int gv[NVARS];
kono
parents:
diff changeset
20 void *volatile data;
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 int
kono
parents:
diff changeset
23 main (void)
kono
parents:
diff changeset
24 {
kono
parents:
diff changeset
25 __label__ foo;
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 if (gv[0] == 1)
kono
parents:
diff changeset
28 goto foo;
kono
parents:
diff changeset
29 data = &&foo;
kono
parents:
diff changeset
30 do
kono
parents:
diff changeset
31 {
kono
parents:
diff changeset
32 int MULTI (DECLARE);
kono
parents:
diff changeset
33 MULTI (COPY);
kono
parents:
diff changeset
34 MULTI (COPY);
kono
parents:
diff changeset
35 MULTI (COPY);
kono
parents:
diff changeset
36 if (data != &&foo)
kono
parents:
diff changeset
37 gv[0] = 1;
kono
parents:
diff changeset
38 else
kono
parents:
diff changeset
39 gv[1] = 2;
kono
parents:
diff changeset
40 }
kono
parents:
diff changeset
41 while (gv[0] > 0);
kono
parents:
diff changeset
42 foo:
kono
parents:
diff changeset
43 return 0;
kono
parents:
diff changeset
44 }