annotate gcc/testsuite/gcc.dg/Wreturn-local-addr-9.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* PR c/71924 - missing -Wreturn-local-addr returning alloca result
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 Test derived from gcc.c-torture/execute/20071108-1.c. It shows
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 a false positive at -Os caused by the jump threading/vrp1 pass.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 { dg-do compile }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 { dg-options "-Os -fdump-tree-optimized" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 struct S
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 void* f (void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 __attribute__ ((noinline))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 struct S* g (int i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 struct S *p = f (), q;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 if (p == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 p = &q;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 p->i = i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 if (p == &q)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 p = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 /* With -Os the warning pass sees:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 ...
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 <bb 4>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 # p_1 = PHI <&q(2), p_5(3)>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 p_1->i = i_6(D);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 if (&q == p_1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 goto <bb 6>; [14.90%]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 goto <bb 5>; [85.10%]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 <bb 5>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 <bb 6>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 # p_2 = PHI <0B(4), p_1(5)>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 q ={v} {CLOBBER};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 return p_2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 which leads to: */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 return p; /* { dg-bogus "may return address of local variable" "" { xfail *-*-* } } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 /* Whereas as -O2 the pass sees:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 <bb 2>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 p_5 = f ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 if (p_5 == 0B)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 goto <bb 4>; [30.00%]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 goto <bb 3>; [70.00%]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 <bb 3>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 # p_2 = PHI <0B(5), p_5(4)>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 q ={v} {CLOBBER};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 return p_2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 <bb 4>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 p_5->i = i_6(D);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 goto <bb 3>; [100.00%]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 <bb 5>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 q.i = i_6(D);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 goto <bb 3>; [100.00%]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 and no warning. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 }