annotate gcc/tree-ssa-alias.c @ 143:76e1cf5455ef

add cbc_gc test
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 19:24:05 +0900
parents 84e7813d76e9
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Alias analysis for trees.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2004-2018 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 Contributed by Diego Novillo <dnovillo@redhat.com>
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 This file is part of GCC.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 the Free Software Foundation; either version 3, or (at your option)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 any later version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 GNU General Public License for more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 #include "coretypes.h"
111
kono
parents: 67
diff changeset
24 #include "backend.h"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
25 #include "target.h"
111
kono
parents: 67
diff changeset
26 #include "rtl.h"
kono
parents: 67
diff changeset
27 #include "tree.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 #include "gimple.h"
111
kono
parents: 67
diff changeset
29 #include "timevar.h" /* for TV_ALIAS_STMT_WALK */
kono
parents: 67
diff changeset
30 #include "ssa.h"
kono
parents: 67
diff changeset
31 #include "cgraph.h"
kono
parents: 67
diff changeset
32 #include "tree-pretty-print.h"
kono
parents: 67
diff changeset
33 #include "alias.h"
kono
parents: 67
diff changeset
34 #include "fold-const.h"
kono
parents: 67
diff changeset
35 #include "langhooks.h"
kono
parents: 67
diff changeset
36 #include "dumpfile.h"
kono
parents: 67
diff changeset
37 #include "tree-eh.h"
kono
parents: 67
diff changeset
38 #include "tree-dfa.h"
kono
parents: 67
diff changeset
39 #include "ipa-reference.h"
kono
parents: 67
diff changeset
40 #include "varasm.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
42 /* Broad overview of how alias analysis on gimple works:
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
44 Statements clobbering or using memory are linked through the
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
45 virtual operand factored use-def chain. The virtual operand
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
46 is unique per function, its symbol is accessible via gimple_vop (cfun).
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
47 Virtual operands are used for efficiently walking memory statements
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
48 in the gimple IL and are useful for things like value-numbering as
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
49 a generation count for memory references.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
51 SSA_NAME pointers may have associated points-to information
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
52 accessible via the SSA_NAME_PTR_INFO macro. Flow-insensitive
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
53 points-to information is (re-)computed by the TODO_rebuild_alias
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
54 pass manager todo. Points-to information is also used for more
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
55 precise tracking of call-clobbered and call-used variables and
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
56 related disambiguations.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
58 This file contains functions for disambiguating memory references,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
59 the so called alias-oracle and tools for walking of the gimple IL.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
61 The main alias-oracle entry-points are
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
111
kono
parents: 67
diff changeset
63 bool stmt_may_clobber_ref_p (gimple *, tree)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
65 This function queries if a statement may invalidate (parts of)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
66 the memory designated by the reference tree argument.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
111
kono
parents: 67
diff changeset
68 bool ref_maybe_used_by_stmt_p (gimple *, tree)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
70 This function queries if a statement may need (parts of) the
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
71 memory designated by the reference tree argument.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
73 There are variants of these functions that only handle the call
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
74 part of a statement, call_may_clobber_ref_p and ref_maybe_used_by_call_p.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
75 Note that these do not disambiguate against a possible call lhs.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
77 bool refs_may_alias_p (tree, tree)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
79 This function tries to disambiguate two reference trees.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
81 bool ptr_deref_may_alias_global_p (tree)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
83 This function queries if dereferencing a pointer variable may
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
84 alias global memory.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
86 More low-level disambiguators are available and documented in
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
87 this file. Low-level disambiguators dealing with points-to
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
88 information are in tree-ssa-structalias.c. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
91 /* Query statistics for the different low-level disambiguators.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
92 A high-level query may trigger multiple of them. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
94 static struct {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
95 unsigned HOST_WIDE_INT refs_may_alias_p_may_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
96 unsigned HOST_WIDE_INT refs_may_alias_p_no_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
97 unsigned HOST_WIDE_INT ref_maybe_used_by_call_p_may_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
98 unsigned HOST_WIDE_INT ref_maybe_used_by_call_p_no_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
99 unsigned HOST_WIDE_INT call_may_clobber_ref_p_may_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
100 unsigned HOST_WIDE_INT call_may_clobber_ref_p_no_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
101 } alias_stats;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 void
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
104 dump_alias_stats (FILE *s)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
106 fprintf (s, "\nAlias oracle query stats:\n");
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
107 fprintf (s, " refs_may_alias_p: "
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
108 HOST_WIDE_INT_PRINT_DEC" disambiguations, "
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
109 HOST_WIDE_INT_PRINT_DEC" queries\n",
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
110 alias_stats.refs_may_alias_p_no_alias,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
111 alias_stats.refs_may_alias_p_no_alias
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
112 + alias_stats.refs_may_alias_p_may_alias);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
113 fprintf (s, " ref_maybe_used_by_call_p: "
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
114 HOST_WIDE_INT_PRINT_DEC" disambiguations, "
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
115 HOST_WIDE_INT_PRINT_DEC" queries\n",
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
116 alias_stats.ref_maybe_used_by_call_p_no_alias,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
117 alias_stats.refs_may_alias_p_no_alias
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
118 + alias_stats.ref_maybe_used_by_call_p_may_alias);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
119 fprintf (s, " call_may_clobber_ref_p: "
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
120 HOST_WIDE_INT_PRINT_DEC" disambiguations, "
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
121 HOST_WIDE_INT_PRINT_DEC" queries\n",
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
122 alias_stats.call_may_clobber_ref_p_no_alias,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
123 alias_stats.call_may_clobber_ref_p_no_alias
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
124 + alias_stats.call_may_clobber_ref_p_may_alias);
111
kono
parents: 67
diff changeset
125 dump_alias_stats_in_alias_c (s);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
129 /* Return true, if dereferencing PTR may alias with a global variable. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
131 bool
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
132 ptr_deref_may_alias_global_p (tree ptr)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
133 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
134 struct ptr_info_def *pi;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
136 /* If we end up with a pointer constant here that may point
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
137 to global memory. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
138 if (TREE_CODE (ptr) != SSA_NAME)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
139 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
141 pi = SSA_NAME_PTR_INFO (ptr);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
143 /* If we do not have points-to information for this variable,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
144 we have to punt. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
145 if (!pi)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
146 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
148 /* ??? This does not use TBAA to prune globals ptr may not access. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
149 return pt_solution_includes_global (&pi->pt);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
152 /* Return true if dereferencing PTR may alias DECL.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
153 The caller is responsible for applying TBAA to see if PTR
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
154 may access DECL at all. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
156 static bool
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
157 ptr_deref_may_alias_decl_p (tree ptr, tree decl)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
158 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
159 struct ptr_info_def *pi;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
161 /* Conversions are irrelevant for points-to information and
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
162 data-dependence analysis can feed us those. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
163 STRIP_NOPS (ptr);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
165 /* Anything we do not explicilty handle aliases. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
166 if ((TREE_CODE (ptr) != SSA_NAME
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
167 && TREE_CODE (ptr) != ADDR_EXPR
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
168 && TREE_CODE (ptr) != POINTER_PLUS_EXPR)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
169 || !POINTER_TYPE_P (TREE_TYPE (ptr))
111
kono
parents: 67
diff changeset
170 || (!VAR_P (decl)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
171 && TREE_CODE (decl) != PARM_DECL
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
172 && TREE_CODE (decl) != RESULT_DECL))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
173 return true;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
174
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
175 /* Disregard pointer offsetting. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
176 if (TREE_CODE (ptr) == POINTER_PLUS_EXPR)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
177 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
178 do
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
179 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
180 ptr = TREE_OPERAND (ptr, 0);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
181 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
182 while (TREE_CODE (ptr) == POINTER_PLUS_EXPR);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
183 return ptr_deref_may_alias_decl_p (ptr, decl);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
184 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
186 /* ADDR_EXPR pointers either just offset another pointer or directly
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
187 specify the pointed-to set. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
188 if (TREE_CODE (ptr) == ADDR_EXPR)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
190 tree base = get_base_address (TREE_OPERAND (ptr, 0));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
191 if (base
111
kono
parents: 67
diff changeset
192 && (TREE_CODE (base) == MEM_REF
kono
parents: 67
diff changeset
193 || TREE_CODE (base) == TARGET_MEM_REF))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
194 ptr = TREE_OPERAND (base, 0);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
195 else if (base
111
kono
parents: 67
diff changeset
196 && DECL_P (base))
kono
parents: 67
diff changeset
197 return compare_base_decls (base, decl) != 0;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
198 else if (base
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
199 && CONSTANT_CLASS_P (base))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
200 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
201 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
202 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
205 /* Non-aliased variables can not be pointed to. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
206 if (!may_be_aliased (decl))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
207 return false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
209 /* If we do not have useful points-to information for this pointer
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
210 we cannot disambiguate anything else. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
211 pi = SSA_NAME_PTR_INFO (ptr);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
212 if (!pi)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
213 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
215 return pt_solution_includes (&pi->pt, decl);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
218 /* Return true if dereferenced PTR1 and PTR2 may alias.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
219 The caller is responsible for applying TBAA to see if accesses
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
220 through PTR1 and PTR2 may conflict at all. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
222 bool
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
223 ptr_derefs_may_alias_p (tree ptr1, tree ptr2)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
225 struct ptr_info_def *pi1, *pi2;
47
3bfb6c00c1e0 update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
226
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
227 /* Conversions are irrelevant for points-to information and
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
228 data-dependence analysis can feed us those. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
229 STRIP_NOPS (ptr1);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
230 STRIP_NOPS (ptr2);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
231
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
232 /* Disregard pointer offsetting. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
233 if (TREE_CODE (ptr1) == POINTER_PLUS_EXPR)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
234 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
235 do
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
236 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
237 ptr1 = TREE_OPERAND (ptr1, 0);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
238 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
239 while (TREE_CODE (ptr1) == POINTER_PLUS_EXPR);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
240 return ptr_derefs_may_alias_p (ptr1, ptr2);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
241 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
242 if (TREE_CODE (ptr2) == POINTER_PLUS_EXPR)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
243 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
244 do
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
245 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
246 ptr2 = TREE_OPERAND (ptr2, 0);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
247 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
248 while (TREE_CODE (ptr2) == POINTER_PLUS_EXPR);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
249 return ptr_derefs_may_alias_p (ptr1, ptr2);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
250 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
252 /* ADDR_EXPR pointers either just offset another pointer or directly
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
253 specify the pointed-to set. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
254 if (TREE_CODE (ptr1) == ADDR_EXPR)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
256 tree base = get_base_address (TREE_OPERAND (ptr1, 0));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
257 if (base
111
kono
parents: 67
diff changeset
258 && (TREE_CODE (base) == MEM_REF
kono
parents: 67
diff changeset
259 || TREE_CODE (base) == TARGET_MEM_REF))
kono
parents: 67
diff changeset
260 return ptr_derefs_may_alias_p (TREE_OPERAND (base, 0), ptr2);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
261 else if (base
111
kono
parents: 67
diff changeset
262 && DECL_P (base))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
263 return ptr_deref_may_alias_decl_p (ptr2, base);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
264 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
265 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
267 if (TREE_CODE (ptr2) == ADDR_EXPR)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
269 tree base = get_base_address (TREE_OPERAND (ptr2, 0));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
270 if (base
111
kono
parents: 67
diff changeset
271 && (TREE_CODE (base) == MEM_REF
kono
parents: 67
diff changeset
272 || TREE_CODE (base) == TARGET_MEM_REF))
kono
parents: 67
diff changeset
273 return ptr_derefs_may_alias_p (ptr1, TREE_OPERAND (base, 0));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
274 else if (base
111
kono
parents: 67
diff changeset
275 && DECL_P (base))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
276 return ptr_deref_may_alias_decl_p (ptr1, base);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
277 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
278 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
280
111
kono
parents: 67
diff changeset
281 /* From here we require SSA name pointers. Anything else aliases. */
kono
parents: 67
diff changeset
282 if (TREE_CODE (ptr1) != SSA_NAME
kono
parents: 67
diff changeset
283 || TREE_CODE (ptr2) != SSA_NAME
kono
parents: 67
diff changeset
284 || !POINTER_TYPE_P (TREE_TYPE (ptr1))
kono
parents: 67
diff changeset
285 || !POINTER_TYPE_P (TREE_TYPE (ptr2)))
kono
parents: 67
diff changeset
286 return true;
kono
parents: 67
diff changeset
287
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
288 /* We may end up with two empty points-to solutions for two same pointers.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
289 In this case we still want to say both pointers alias, so shortcut
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
290 that here. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
291 if (ptr1 == ptr2)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
292 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
293
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
294 /* If we do not have useful points-to information for either pointer
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
295 we cannot disambiguate anything else. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
296 pi1 = SSA_NAME_PTR_INFO (ptr1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
297 pi2 = SSA_NAME_PTR_INFO (ptr2);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
298 if (!pi1 || !pi2)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
299 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
300
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
301 /* ??? This does not use TBAA to prune decls from the intersection
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
302 that not both pointers may access. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
303 return pt_solutions_intersect (&pi1->pt, &pi2->pt);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
305
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
306 /* Return true if dereferencing PTR may alias *REF.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
307 The caller is responsible for applying TBAA to see if PTR
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
308 may access *REF at all. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
309
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
310 static bool
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
311 ptr_deref_may_alias_ref_p_1 (tree ptr, ao_ref *ref)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
313 tree base = ao_ref_base (ref);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
314
111
kono
parents: 67
diff changeset
315 if (TREE_CODE (base) == MEM_REF
kono
parents: 67
diff changeset
316 || TREE_CODE (base) == TARGET_MEM_REF)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
317 return ptr_derefs_may_alias_p (ptr, TREE_OPERAND (base, 0));
111
kono
parents: 67
diff changeset
318 else if (DECL_P (base))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
319 return ptr_deref_may_alias_decl_p (ptr, base);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
323
111
kono
parents: 67
diff changeset
324 /* Returns true if PTR1 and PTR2 compare unequal because of points-to. */
kono
parents: 67
diff changeset
325
kono
parents: 67
diff changeset
326 bool
kono
parents: 67
diff changeset
327 ptrs_compare_unequal (tree ptr1, tree ptr2)
kono
parents: 67
diff changeset
328 {
kono
parents: 67
diff changeset
329 /* First resolve the pointers down to a SSA name pointer base or
kono
parents: 67
diff changeset
330 a VAR_DECL, PARM_DECL or RESULT_DECL. This explicitely does
kono
parents: 67
diff changeset
331 not yet try to handle LABEL_DECLs, FUNCTION_DECLs, CONST_DECLs
kono
parents: 67
diff changeset
332 or STRING_CSTs which needs points-to adjustments to track them
kono
parents: 67
diff changeset
333 in the points-to sets. */
kono
parents: 67
diff changeset
334 tree obj1 = NULL_TREE;
kono
parents: 67
diff changeset
335 tree obj2 = NULL_TREE;
kono
parents: 67
diff changeset
336 if (TREE_CODE (ptr1) == ADDR_EXPR)
kono
parents: 67
diff changeset
337 {
kono
parents: 67
diff changeset
338 tree tem = get_base_address (TREE_OPERAND (ptr1, 0));
kono
parents: 67
diff changeset
339 if (! tem)
kono
parents: 67
diff changeset
340 return false;
kono
parents: 67
diff changeset
341 if (VAR_P (tem)
kono
parents: 67
diff changeset
342 || TREE_CODE (tem) == PARM_DECL
kono
parents: 67
diff changeset
343 || TREE_CODE (tem) == RESULT_DECL)
kono
parents: 67
diff changeset
344 obj1 = tem;
kono
parents: 67
diff changeset
345 else if (TREE_CODE (tem) == MEM_REF)
kono
parents: 67
diff changeset
346 ptr1 = TREE_OPERAND (tem, 0);
kono
parents: 67
diff changeset
347 }
kono
parents: 67
diff changeset
348 if (TREE_CODE (ptr2) == ADDR_EXPR)
kono
parents: 67
diff changeset
349 {
kono
parents: 67
diff changeset
350 tree tem = get_base_address (TREE_OPERAND (ptr2, 0));
kono
parents: 67
diff changeset
351 if (! tem)
kono
parents: 67
diff changeset
352 return false;
kono
parents: 67
diff changeset
353 if (VAR_P (tem)
kono
parents: 67
diff changeset
354 || TREE_CODE (tem) == PARM_DECL
kono
parents: 67
diff changeset
355 || TREE_CODE (tem) == RESULT_DECL)
kono
parents: 67
diff changeset
356 obj2 = tem;
kono
parents: 67
diff changeset
357 else if (TREE_CODE (tem) == MEM_REF)
kono
parents: 67
diff changeset
358 ptr2 = TREE_OPERAND (tem, 0);
kono
parents: 67
diff changeset
359 }
kono
parents: 67
diff changeset
360
kono
parents: 67
diff changeset
361 /* Canonicalize ptr vs. object. */
kono
parents: 67
diff changeset
362 if (TREE_CODE (ptr1) == SSA_NAME && obj2)
kono
parents: 67
diff changeset
363 {
kono
parents: 67
diff changeset
364 std::swap (ptr1, ptr2);
kono
parents: 67
diff changeset
365 std::swap (obj1, obj2);
kono
parents: 67
diff changeset
366 }
kono
parents: 67
diff changeset
367
kono
parents: 67
diff changeset
368 if (obj1 && obj2)
kono
parents: 67
diff changeset
369 /* Other code handles this correctly, no need to duplicate it here. */;
kono
parents: 67
diff changeset
370 else if (obj1 && TREE_CODE (ptr2) == SSA_NAME)
kono
parents: 67
diff changeset
371 {
kono
parents: 67
diff changeset
372 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr2);
kono
parents: 67
diff changeset
373 /* We may not use restrict to optimize pointer comparisons.
kono
parents: 67
diff changeset
374 See PR71062. So we have to assume that restrict-pointed-to
kono
parents: 67
diff changeset
375 may be in fact obj1. */
kono
parents: 67
diff changeset
376 if (!pi
kono
parents: 67
diff changeset
377 || pi->pt.vars_contains_restrict
kono
parents: 67
diff changeset
378 || pi->pt.vars_contains_interposable)
kono
parents: 67
diff changeset
379 return false;
kono
parents: 67
diff changeset
380 if (VAR_P (obj1)
kono
parents: 67
diff changeset
381 && (TREE_STATIC (obj1) || DECL_EXTERNAL (obj1)))
kono
parents: 67
diff changeset
382 {
kono
parents: 67
diff changeset
383 varpool_node *node = varpool_node::get (obj1);
kono
parents: 67
diff changeset
384 /* If obj1 may bind to NULL give up (see below). */
kono
parents: 67
diff changeset
385 if (! node
kono
parents: 67
diff changeset
386 || ! node->nonzero_address ()
kono
parents: 67
diff changeset
387 || ! decl_binds_to_current_def_p (obj1))
kono
parents: 67
diff changeset
388 return false;
kono
parents: 67
diff changeset
389 }
kono
parents: 67
diff changeset
390 return !pt_solution_includes (&pi->pt, obj1);
kono
parents: 67
diff changeset
391 }
kono
parents: 67
diff changeset
392
kono
parents: 67
diff changeset
393 /* ??? We'd like to handle ptr1 != NULL and ptr1 != ptr2
kono
parents: 67
diff changeset
394 but those require pt.null to be conservatively correct. */
kono
parents: 67
diff changeset
395
kono
parents: 67
diff changeset
396 return false;
kono
parents: 67
diff changeset
397 }
kono
parents: 67
diff changeset
398
kono
parents: 67
diff changeset
399 /* Returns whether reference REF to BASE may refer to global memory. */
kono
parents: 67
diff changeset
400
kono
parents: 67
diff changeset
401 static bool
kono
parents: 67
diff changeset
402 ref_may_alias_global_p_1 (tree base)
kono
parents: 67
diff changeset
403 {
kono
parents: 67
diff changeset
404 if (DECL_P (base))
kono
parents: 67
diff changeset
405 return is_global_var (base);
kono
parents: 67
diff changeset
406 else if (TREE_CODE (base) == MEM_REF
kono
parents: 67
diff changeset
407 || TREE_CODE (base) == TARGET_MEM_REF)
kono
parents: 67
diff changeset
408 return ptr_deref_may_alias_global_p (TREE_OPERAND (base, 0));
kono
parents: 67
diff changeset
409 return true;
kono
parents: 67
diff changeset
410 }
kono
parents: 67
diff changeset
411
kono
parents: 67
diff changeset
412 bool
kono
parents: 67
diff changeset
413 ref_may_alias_global_p (ao_ref *ref)
kono
parents: 67
diff changeset
414 {
kono
parents: 67
diff changeset
415 tree base = ao_ref_base (ref);
kono
parents: 67
diff changeset
416 return ref_may_alias_global_p_1 (base);
kono
parents: 67
diff changeset
417 }
kono
parents: 67
diff changeset
418
kono
parents: 67
diff changeset
419 bool
kono
parents: 67
diff changeset
420 ref_may_alias_global_p (tree ref)
kono
parents: 67
diff changeset
421 {
kono
parents: 67
diff changeset
422 tree base = get_base_address (ref);
kono
parents: 67
diff changeset
423 return ref_may_alias_global_p_1 (base);
kono
parents: 67
diff changeset
424 }
kono
parents: 67
diff changeset
425
kono
parents: 67
diff changeset
426 /* Return true whether STMT may clobber global memory. */
kono
parents: 67
diff changeset
427
kono
parents: 67
diff changeset
428 bool
kono
parents: 67
diff changeset
429 stmt_may_clobber_global_p (gimple *stmt)
kono
parents: 67
diff changeset
430 {
kono
parents: 67
diff changeset
431 tree lhs;
kono
parents: 67
diff changeset
432
kono
parents: 67
diff changeset
433 if (!gimple_vdef (stmt))
kono
parents: 67
diff changeset
434 return false;
kono
parents: 67
diff changeset
435
kono
parents: 67
diff changeset
436 /* ??? We can ask the oracle whether an artificial pointer
kono
parents: 67
diff changeset
437 dereference with a pointer with points-to information covering
kono
parents: 67
diff changeset
438 all global memory (what about non-address taken memory?) maybe
kono
parents: 67
diff changeset
439 clobbered by this call. As there is at the moment no convenient
kono
parents: 67
diff changeset
440 way of doing that without generating garbage do some manual
kono
parents: 67
diff changeset
441 checking instead.
kono
parents: 67
diff changeset
442 ??? We could make a NULL ao_ref argument to the various
kono
parents: 67
diff changeset
443 predicates special, meaning any global memory. */
kono
parents: 67
diff changeset
444
kono
parents: 67
diff changeset
445 switch (gimple_code (stmt))
kono
parents: 67
diff changeset
446 {
kono
parents: 67
diff changeset
447 case GIMPLE_ASSIGN:
kono
parents: 67
diff changeset
448 lhs = gimple_assign_lhs (stmt);
kono
parents: 67
diff changeset
449 return (TREE_CODE (lhs) != SSA_NAME
kono
parents: 67
diff changeset
450 && ref_may_alias_global_p (lhs));
kono
parents: 67
diff changeset
451 case GIMPLE_CALL:
kono
parents: 67
diff changeset
452 return true;
kono
parents: 67
diff changeset
453 default:
kono
parents: 67
diff changeset
454 return true;
kono
parents: 67
diff changeset
455 }
kono
parents: 67
diff changeset
456 }
kono
parents: 67
diff changeset
457
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
458
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
459 /* Dump alias information on FILE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
460
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
461 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
462 dump_alias_info (FILE *file)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
463 {
111
kono
parents: 67
diff changeset
464 unsigned i;
kono
parents: 67
diff changeset
465 tree ptr;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 const char *funcname
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 = lang_hooks.decl_printable_name (current_function_decl, 2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
468 tree var;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
469
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
470 fprintf (file, "\n\nAlias information for %s\n\n", funcname);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
471
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
472 fprintf (file, "Aliased symbols\n\n");
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
473
111
kono
parents: 67
diff changeset
474 FOR_EACH_LOCAL_DECL (cfun, i, var)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
475 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 if (may_be_aliased (var))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 dump_variable (file, var);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
478 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
479
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
480 fprintf (file, "\nCall clobber information\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
481
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
482 fprintf (file, "\nESCAPED");
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
483 dump_points_to_solution (file, &cfun->gimple_df->escaped);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
484
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
485 fprintf (file, "\n\nFlow-insensitive points-to information\n\n");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
486
111
kono
parents: 67
diff changeset
487 FOR_EACH_SSA_NAME (i, ptr, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
488 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
489 struct ptr_info_def *pi;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
490
111
kono
parents: 67
diff changeset
491 if (!POINTER_TYPE_P (TREE_TYPE (ptr))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
492 || SSA_NAME_IN_FREE_LIST (ptr))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 continue;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
494
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
495 pi = SSA_NAME_PTR_INFO (ptr);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
496 if (pi)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
497 dump_points_to_info_for (file, ptr);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
498 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
499
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
500 fprintf (file, "\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
501 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
502
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
503
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
504 /* Dump alias information on stderr. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
505
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
506 DEBUG_FUNCTION void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
507 debug_alias_info (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
508 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
509 dump_alias_info (stderr);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
511
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
512
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
513 /* Dump the points-to set *PT into FILE. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
514
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
515 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
516 dump_points_to_solution (FILE *file, struct pt_solution *pt)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
517 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
518 if (pt->anything)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
519 fprintf (file, ", points-to anything");
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
520
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
521 if (pt->nonlocal)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
522 fprintf (file, ", points-to non-local");
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
523
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
524 if (pt->escaped)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
525 fprintf (file, ", points-to escaped");
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
526
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
527 if (pt->ipa_escaped)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
528 fprintf (file, ", points-to unit escaped");
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
529
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
530 if (pt->null)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
531 fprintf (file, ", points-to NULL");
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
532
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
533 if (pt->vars)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
534 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
535 fprintf (file, ", points-to vars: ");
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
536 dump_decl_set (file, pt->vars);
111
kono
parents: 67
diff changeset
537 if (pt->vars_contains_nonlocal
kono
parents: 67
diff changeset
538 || pt->vars_contains_escaped
kono
parents: 67
diff changeset
539 || pt->vars_contains_escaped_heap
kono
parents: 67
diff changeset
540 || pt->vars_contains_restrict)
kono
parents: 67
diff changeset
541 {
kono
parents: 67
diff changeset
542 const char *comma = "";
kono
parents: 67
diff changeset
543 fprintf (file, " (");
kono
parents: 67
diff changeset
544 if (pt->vars_contains_nonlocal)
kono
parents: 67
diff changeset
545 {
kono
parents: 67
diff changeset
546 fprintf (file, "nonlocal");
kono
parents: 67
diff changeset
547 comma = ", ";
kono
parents: 67
diff changeset
548 }
kono
parents: 67
diff changeset
549 if (pt->vars_contains_escaped)
kono
parents: 67
diff changeset
550 {
kono
parents: 67
diff changeset
551 fprintf (file, "%sescaped", comma);
kono
parents: 67
diff changeset
552 comma = ", ";
kono
parents: 67
diff changeset
553 }
kono
parents: 67
diff changeset
554 if (pt->vars_contains_escaped_heap)
kono
parents: 67
diff changeset
555 {
kono
parents: 67
diff changeset
556 fprintf (file, "%sescaped heap", comma);
kono
parents: 67
diff changeset
557 comma = ", ";
kono
parents: 67
diff changeset
558 }
kono
parents: 67
diff changeset
559 if (pt->vars_contains_restrict)
kono
parents: 67
diff changeset
560 {
kono
parents: 67
diff changeset
561 fprintf (file, "%srestrict", comma);
kono
parents: 67
diff changeset
562 comma = ", ";
kono
parents: 67
diff changeset
563 }
kono
parents: 67
diff changeset
564 if (pt->vars_contains_interposable)
kono
parents: 67
diff changeset
565 fprintf (file, "%sinterposable", comma);
kono
parents: 67
diff changeset
566 fprintf (file, ")");
kono
parents: 67
diff changeset
567 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
568 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
569 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
570
111
kono
parents: 67
diff changeset
571
kono
parents: 67
diff changeset
572 /* Unified dump function for pt_solution. */
kono
parents: 67
diff changeset
573
kono
parents: 67
diff changeset
574 DEBUG_FUNCTION void
kono
parents: 67
diff changeset
575 debug (pt_solution &ref)
kono
parents: 67
diff changeset
576 {
kono
parents: 67
diff changeset
577 dump_points_to_solution (stderr, &ref);
kono
parents: 67
diff changeset
578 }
kono
parents: 67
diff changeset
579
kono
parents: 67
diff changeset
580 DEBUG_FUNCTION void
kono
parents: 67
diff changeset
581 debug (pt_solution *ptr)
kono
parents: 67
diff changeset
582 {
kono
parents: 67
diff changeset
583 if (ptr)
kono
parents: 67
diff changeset
584 debug (*ptr);
kono
parents: 67
diff changeset
585 else
kono
parents: 67
diff changeset
586 fprintf (stderr, "<nil>\n");
kono
parents: 67
diff changeset
587 }
kono
parents: 67
diff changeset
588
kono
parents: 67
diff changeset
589
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
590 /* Dump points-to information for SSA_NAME PTR into FILE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
591
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
592 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
593 dump_points_to_info_for (FILE *file, tree ptr)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
594 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
595 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
596
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
597 print_generic_expr (file, ptr, dump_flags);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
598
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
599 if (pi)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
600 dump_points_to_solution (file, &pi->pt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
601 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
602 fprintf (file, ", points-to anything");
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
603
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
604 fprintf (file, "\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
605 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
606
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
607
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
608 /* Dump points-to information for VAR into stderr. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
609
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
610 DEBUG_FUNCTION void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
611 debug_points_to_info_for (tree var)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
612 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
613 dump_points_to_info_for (stderr, var);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
614 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
615
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
616
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
617 /* Initializes the alias-oracle reference representation *R from REF. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
618
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
619 void
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
620 ao_ref_init (ao_ref *r, tree ref)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
621 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
622 r->ref = ref;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
623 r->base = NULL_TREE;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
624 r->offset = 0;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
625 r->size = -1;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
626 r->max_size = -1;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
627 r->ref_alias_set = -1;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
628 r->base_alias_set = -1;
111
kono
parents: 67
diff changeset
629 r->volatile_p = ref ? TREE_THIS_VOLATILE (ref) : false;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
630 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
631
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
632 /* Returns the base object of the memory reference *REF. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
633
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
634 tree
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
635 ao_ref_base (ao_ref *ref)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
636 {
111
kono
parents: 67
diff changeset
637 bool reverse;
kono
parents: 67
diff changeset
638
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
639 if (ref->base)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
640 return ref->base;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
641 ref->base = get_ref_base_and_extent (ref->ref, &ref->offset, &ref->size,
111
kono
parents: 67
diff changeset
642 &ref->max_size, &reverse);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
643 return ref->base;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
644 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
645
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
646 /* Returns the base object alias set of the memory reference *REF. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
647
111
kono
parents: 67
diff changeset
648 alias_set_type
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
649 ao_ref_base_alias_set (ao_ref *ref)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
650 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
651 tree base_ref;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
652 if (ref->base_alias_set != -1)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
653 return ref->base_alias_set;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
654 if (!ref->ref)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
655 return 0;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
656 base_ref = ref->ref;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
657 while (handled_component_p (base_ref))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
658 base_ref = TREE_OPERAND (base_ref, 0);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
659 ref->base_alias_set = get_alias_set (base_ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
660 return ref->base_alias_set;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
661 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
662
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
663 /* Returns the reference alias set of the memory reference *REF. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
664
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
665 alias_set_type
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
666 ao_ref_alias_set (ao_ref *ref)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
667 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
668 if (ref->ref_alias_set != -1)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
669 return ref->ref_alias_set;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
670 ref->ref_alias_set = get_alias_set (ref->ref);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
671 return ref->ref_alias_set;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
672 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
673
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
674 /* Init an alias-oracle reference representation from a gimple pointer
111
kono
parents: 67
diff changeset
675 PTR and a gimple size SIZE in bytes. If SIZE is NULL_TREE then the
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
676 size is assumed to be unknown. The access is assumed to be only
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
677 to or after of the pointer target, not before it. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
678
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
679 void
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
680 ao_ref_init_from_ptr_and_size (ao_ref *ref, tree ptr, tree size)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
681 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
682 poly_int64 t, size_hwi, extra_offset = 0;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
683 ref->ref = NULL_TREE;
111
kono
parents: 67
diff changeset
684 if (TREE_CODE (ptr) == SSA_NAME)
kono
parents: 67
diff changeset
685 {
kono
parents: 67
diff changeset
686 gimple *stmt = SSA_NAME_DEF_STMT (ptr);
kono
parents: 67
diff changeset
687 if (gimple_assign_single_p (stmt)
kono
parents: 67
diff changeset
688 && gimple_assign_rhs_code (stmt) == ADDR_EXPR)
kono
parents: 67
diff changeset
689 ptr = gimple_assign_rhs1 (stmt);
kono
parents: 67
diff changeset
690 else if (is_gimple_assign (stmt)
kono
parents: 67
diff changeset
691 && gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
692 && ptrdiff_tree_p (gimple_assign_rhs2 (stmt), &extra_offset))
111
kono
parents: 67
diff changeset
693 {
kono
parents: 67
diff changeset
694 ptr = gimple_assign_rhs1 (stmt);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
695 extra_offset *= BITS_PER_UNIT;
111
kono
parents: 67
diff changeset
696 }
kono
parents: 67
diff changeset
697 }
kono
parents: 67
diff changeset
698
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
699 if (TREE_CODE (ptr) == ADDR_EXPR)
111
kono
parents: 67
diff changeset
700 {
kono
parents: 67
diff changeset
701 ref->base = get_addr_base_and_unit_offset (TREE_OPERAND (ptr, 0), &t);
kono
parents: 67
diff changeset
702 if (ref->base)
kono
parents: 67
diff changeset
703 ref->offset = BITS_PER_UNIT * t;
kono
parents: 67
diff changeset
704 else
kono
parents: 67
diff changeset
705 {
kono
parents: 67
diff changeset
706 size = NULL_TREE;
kono
parents: 67
diff changeset
707 ref->offset = 0;
kono
parents: 67
diff changeset
708 ref->base = get_base_address (TREE_OPERAND (ptr, 0));
kono
parents: 67
diff changeset
709 }
kono
parents: 67
diff changeset
710 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
711 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
712 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
713 ref->base = build2 (MEM_REF, char_type_node,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
714 ptr, null_pointer_node);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
715 ref->offset = 0;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
716 }
111
kono
parents: 67
diff changeset
717 ref->offset += extra_offset;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
718 if (size
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
719 && poly_int_tree_p (size, &size_hwi)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
720 && coeffs_in_range_p (size_hwi, 0, HOST_WIDE_INT_MAX / BITS_PER_UNIT))
111
kono
parents: 67
diff changeset
721 ref->max_size = ref->size = size_hwi * BITS_PER_UNIT;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
722 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
723 ref->max_size = ref->size = -1;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
724 ref->ref_alias_set = 0;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
725 ref->base_alias_set = 0;
111
kono
parents: 67
diff changeset
726 ref->volatile_p = false;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
727 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
728
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
729 /* Return 1 if TYPE1 and TYPE2 are to be considered equivalent for the
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
730 purpose of TBAA. Return 0 if they are distinct and -1 if we cannot
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
731 decide. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
732
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
733 static inline int
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
734 same_type_for_tbaa (tree type1, tree type2)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
735 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
736 type1 = TYPE_MAIN_VARIANT (type1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
737 type2 = TYPE_MAIN_VARIANT (type2);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
738
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
739 /* If we would have to do structural comparison bail out. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
740 if (TYPE_STRUCTURAL_EQUALITY_P (type1)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
741 || TYPE_STRUCTURAL_EQUALITY_P (type2))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
742 return -1;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
743
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
744 /* Compare the canonical types. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
745 if (TYPE_CANONICAL (type1) == TYPE_CANONICAL (type2))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
746 return 1;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
747
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
748 /* ??? Array types are not properly unified in all cases as we have
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
749 spurious changes in the index types for example. Removing this
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
750 causes all sorts of problems with the Fortran frontend. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
751 if (TREE_CODE (type1) == ARRAY_TYPE
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
752 && TREE_CODE (type2) == ARRAY_TYPE)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
753 return -1;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
754
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
755 /* ??? In Ada, an lvalue of an unconstrained type can be used to access an
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
756 object of one of its constrained subtypes, e.g. when a function with an
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
757 unconstrained parameter passed by reference is called on an object and
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
758 inlined. But, even in the case of a fixed size, type and subtypes are
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
759 not equivalent enough as to share the same TYPE_CANONICAL, since this
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
760 would mean that conversions between them are useless, whereas they are
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
761 not (e.g. type and subtypes can have different modes). So, in the end,
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
762 they are only guaranteed to have the same alias set. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
763 if (get_alias_set (type1) == get_alias_set (type2))
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
764 return -1;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
765
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
766 /* The types are known to be not equal. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
767 return 0;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
768 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
769
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
770 /* Determine if the two component references REF1 and REF2 which are
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
771 based on access types TYPE1 and TYPE2 and of which at least one is based
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
772 on an indirect reference may alias. REF2 is the only one that can
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
773 be a decl in which case REF2_IS_DECL is true.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
774 REF1_ALIAS_SET, BASE1_ALIAS_SET, REF2_ALIAS_SET and BASE2_ALIAS_SET
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
775 are the respective alias sets. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
776
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
777 static bool
111
kono
parents: 67
diff changeset
778 aliasing_component_refs_p (tree ref1,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
779 alias_set_type ref1_alias_set,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
780 alias_set_type base1_alias_set,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
781 poly_int64 offset1, poly_int64 max_size1,
111
kono
parents: 67
diff changeset
782 tree ref2,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
783 alias_set_type ref2_alias_set,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
784 alias_set_type base2_alias_set,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
785 poly_int64 offset2, poly_int64 max_size2,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
786 bool ref2_is_decl)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
787 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
788 /* If one reference is a component references through pointers try to find a
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
789 common base and apply offset based disambiguation. This handles
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
790 for example
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
791 struct A { int i; int j; } *q;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
792 struct B { struct A a; int k; } *p;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
793 disambiguating q->i and p->a.j. */
111
kono
parents: 67
diff changeset
794 tree base1, base2;
kono
parents: 67
diff changeset
795 tree type1, type2;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
796 tree *refp;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
797 int same_p;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
798
111
kono
parents: 67
diff changeset
799 /* Choose bases and base types to search for. */
kono
parents: 67
diff changeset
800 base1 = ref1;
kono
parents: 67
diff changeset
801 while (handled_component_p (base1))
kono
parents: 67
diff changeset
802 base1 = TREE_OPERAND (base1, 0);
kono
parents: 67
diff changeset
803 type1 = TREE_TYPE (base1);
kono
parents: 67
diff changeset
804 base2 = ref2;
kono
parents: 67
diff changeset
805 while (handled_component_p (base2))
kono
parents: 67
diff changeset
806 base2 = TREE_OPERAND (base2, 0);
kono
parents: 67
diff changeset
807 type2 = TREE_TYPE (base2);
kono
parents: 67
diff changeset
808
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
809 /* Now search for the type1 in the access path of ref2. This
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
810 would be a common base for doing offset based disambiguation on. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
811 refp = &ref2;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
812 while (handled_component_p (*refp)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
813 && same_type_for_tbaa (TREE_TYPE (*refp), type1) == 0)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
814 refp = &TREE_OPERAND (*refp, 0);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
815 same_p = same_type_for_tbaa (TREE_TYPE (*refp), type1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
816 /* If we couldn't compare types we have to bail out. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
817 if (same_p == -1)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
818 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
819 else if (same_p == 1)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
820 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
821 poly_int64 offadj, sztmp, msztmp;
111
kono
parents: 67
diff changeset
822 bool reverse;
kono
parents: 67
diff changeset
823 get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp, &reverse);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
824 offset2 -= offadj;
111
kono
parents: 67
diff changeset
825 get_ref_base_and_extent (base1, &offadj, &sztmp, &msztmp, &reverse);
kono
parents: 67
diff changeset
826 offset1 -= offadj;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
827 return ranges_maybe_overlap_p (offset1, max_size1, offset2, max_size2);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
828 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
829 /* If we didn't find a common base, try the other way around. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
830 refp = &ref1;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
831 while (handled_component_p (*refp)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
832 && same_type_for_tbaa (TREE_TYPE (*refp), type2) == 0)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
833 refp = &TREE_OPERAND (*refp, 0);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
834 same_p = same_type_for_tbaa (TREE_TYPE (*refp), type2);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
835 /* If we couldn't compare types we have to bail out. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
836 if (same_p == -1)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
837 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
838 else if (same_p == 1)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
839 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
840 poly_int64 offadj, sztmp, msztmp;
111
kono
parents: 67
diff changeset
841 bool reverse;
kono
parents: 67
diff changeset
842 get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp, &reverse);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
843 offset1 -= offadj;
111
kono
parents: 67
diff changeset
844 get_ref_base_and_extent (base2, &offadj, &sztmp, &msztmp, &reverse);
kono
parents: 67
diff changeset
845 offset2 -= offadj;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
846 return ranges_maybe_overlap_p (offset1, max_size1, offset2, max_size2);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
847 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
848
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
849 /* If we have two type access paths B1.path1 and B2.path2 they may
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
850 only alias if either B1 is in B2.path2 or B2 is in B1.path1.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
851 But we can still have a path that goes B1.path1...B2.path2 with
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
852 a part that we do not see. So we can only disambiguate now
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
853 if there is no B2 in the tail of path1 and no B1 on the
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
854 tail of path2. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
855 if (base1_alias_set == ref2_alias_set
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
856 || alias_set_subset_of (base1_alias_set, ref2_alias_set))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
857 return true;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
858 /* If this is ptr vs. decl then we know there is no ptr ... decl path. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
859 if (!ref2_is_decl)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
860 return (base2_alias_set == ref1_alias_set
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
861 || alias_set_subset_of (base2_alias_set, ref1_alias_set));
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
862 return false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
863 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
864
111
kono
parents: 67
diff changeset
865 /* Return true if we can determine that component references REF1 and REF2,
kono
parents: 67
diff changeset
866 that are within a common DECL, cannot overlap. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
867
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
868 static bool
111
kono
parents: 67
diff changeset
869 nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2)
kono
parents: 67
diff changeset
870 {
kono
parents: 67
diff changeset
871 auto_vec<tree, 16> component_refs1;
kono
parents: 67
diff changeset
872 auto_vec<tree, 16> component_refs2;
kono
parents: 67
diff changeset
873
kono
parents: 67
diff changeset
874 /* Create the stack of handled components for REF1. */
kono
parents: 67
diff changeset
875 while (handled_component_p (ref1))
kono
parents: 67
diff changeset
876 {
kono
parents: 67
diff changeset
877 component_refs1.safe_push (ref1);
kono
parents: 67
diff changeset
878 ref1 = TREE_OPERAND (ref1, 0);
kono
parents: 67
diff changeset
879 }
kono
parents: 67
diff changeset
880 if (TREE_CODE (ref1) == MEM_REF)
kono
parents: 67
diff changeset
881 {
kono
parents: 67
diff changeset
882 if (!integer_zerop (TREE_OPERAND (ref1, 1)))
kono
parents: 67
diff changeset
883 return false;
kono
parents: 67
diff changeset
884 ref1 = TREE_OPERAND (TREE_OPERAND (ref1, 0), 0);
kono
parents: 67
diff changeset
885 }
kono
parents: 67
diff changeset
886
kono
parents: 67
diff changeset
887 /* Create the stack of handled components for REF2. */
kono
parents: 67
diff changeset
888 while (handled_component_p (ref2))
kono
parents: 67
diff changeset
889 {
kono
parents: 67
diff changeset
890 component_refs2.safe_push (ref2);
kono
parents: 67
diff changeset
891 ref2 = TREE_OPERAND (ref2, 0);
kono
parents: 67
diff changeset
892 }
kono
parents: 67
diff changeset
893 if (TREE_CODE (ref2) == MEM_REF)
kono
parents: 67
diff changeset
894 {
kono
parents: 67
diff changeset
895 if (!integer_zerop (TREE_OPERAND (ref2, 1)))
kono
parents: 67
diff changeset
896 return false;
kono
parents: 67
diff changeset
897 ref2 = TREE_OPERAND (TREE_OPERAND (ref2, 0), 0);
kono
parents: 67
diff changeset
898 }
kono
parents: 67
diff changeset
899
kono
parents: 67
diff changeset
900 /* Bases must be either same or uncomparable. */
kono
parents: 67
diff changeset
901 gcc_checking_assert (ref1 == ref2
kono
parents: 67
diff changeset
902 || (DECL_P (ref1) && DECL_P (ref2)
kono
parents: 67
diff changeset
903 && compare_base_decls (ref1, ref2) != 0));
kono
parents: 67
diff changeset
904
kono
parents: 67
diff changeset
905 /* Pop the stacks in parallel and examine the COMPONENT_REFs of the same
kono
parents: 67
diff changeset
906 rank. This is sufficient because we start from the same DECL and you
kono
parents: 67
diff changeset
907 cannot reference several fields at a time with COMPONENT_REFs (unlike
kono
parents: 67
diff changeset
908 with ARRAY_RANGE_REFs for arrays) so you always need the same number
kono
parents: 67
diff changeset
909 of them to access a sub-component, unless you're in a union, in which
kono
parents: 67
diff changeset
910 case the return value will precisely be false. */
kono
parents: 67
diff changeset
911 while (true)
kono
parents: 67
diff changeset
912 {
kono
parents: 67
diff changeset
913 do
kono
parents: 67
diff changeset
914 {
kono
parents: 67
diff changeset
915 if (component_refs1.is_empty ())
kono
parents: 67
diff changeset
916 return false;
kono
parents: 67
diff changeset
917 ref1 = component_refs1.pop ();
kono
parents: 67
diff changeset
918 }
kono
parents: 67
diff changeset
919 while (!RECORD_OR_UNION_TYPE_P (TREE_TYPE (TREE_OPERAND (ref1, 0))));
kono
parents: 67
diff changeset
920
kono
parents: 67
diff changeset
921 do
kono
parents: 67
diff changeset
922 {
kono
parents: 67
diff changeset
923 if (component_refs2.is_empty ())
kono
parents: 67
diff changeset
924 return false;
kono
parents: 67
diff changeset
925 ref2 = component_refs2.pop ();
kono
parents: 67
diff changeset
926 }
kono
parents: 67
diff changeset
927 while (!RECORD_OR_UNION_TYPE_P (TREE_TYPE (TREE_OPERAND (ref2, 0))));
kono
parents: 67
diff changeset
928
kono
parents: 67
diff changeset
929 /* Beware of BIT_FIELD_REF. */
kono
parents: 67
diff changeset
930 if (TREE_CODE (ref1) != COMPONENT_REF
kono
parents: 67
diff changeset
931 || TREE_CODE (ref2) != COMPONENT_REF)
kono
parents: 67
diff changeset
932 return false;
kono
parents: 67
diff changeset
933
kono
parents: 67
diff changeset
934 tree field1 = TREE_OPERAND (ref1, 1);
kono
parents: 67
diff changeset
935 tree field2 = TREE_OPERAND (ref2, 1);
kono
parents: 67
diff changeset
936
kono
parents: 67
diff changeset
937 /* ??? We cannot simply use the type of operand #0 of the refs here
kono
parents: 67
diff changeset
938 as the Fortran compiler smuggles type punning into COMPONENT_REFs
kono
parents: 67
diff changeset
939 for common blocks instead of using unions like everyone else. */
kono
parents: 67
diff changeset
940 tree type1 = DECL_CONTEXT (field1);
kono
parents: 67
diff changeset
941 tree type2 = DECL_CONTEXT (field2);
kono
parents: 67
diff changeset
942
kono
parents: 67
diff changeset
943 /* We cannot disambiguate fields in a union or qualified union. */
kono
parents: 67
diff changeset
944 if (type1 != type2 || TREE_CODE (type1) != RECORD_TYPE)
kono
parents: 67
diff changeset
945 return false;
kono
parents: 67
diff changeset
946
kono
parents: 67
diff changeset
947 if (field1 != field2)
kono
parents: 67
diff changeset
948 {
kono
parents: 67
diff changeset
949 /* A field and its representative need to be considered the
kono
parents: 67
diff changeset
950 same. */
kono
parents: 67
diff changeset
951 if (DECL_BIT_FIELD_REPRESENTATIVE (field1) == field2
kono
parents: 67
diff changeset
952 || DECL_BIT_FIELD_REPRESENTATIVE (field2) == field1)
kono
parents: 67
diff changeset
953 return false;
kono
parents: 67
diff changeset
954 /* Different fields of the same record type cannot overlap.
kono
parents: 67
diff changeset
955 ??? Bitfields can overlap at RTL level so punt on them. */
kono
parents: 67
diff changeset
956 if (DECL_BIT_FIELD (field1) && DECL_BIT_FIELD (field2))
kono
parents: 67
diff changeset
957 return false;
kono
parents: 67
diff changeset
958 return true;
kono
parents: 67
diff changeset
959 }
kono
parents: 67
diff changeset
960 }
kono
parents: 67
diff changeset
961
kono
parents: 67
diff changeset
962 return false;
kono
parents: 67
diff changeset
963 }
kono
parents: 67
diff changeset
964
kono
parents: 67
diff changeset
965 /* qsort compare function to sort FIELD_DECLs after their
kono
parents: 67
diff changeset
966 DECL_FIELD_CONTEXT TYPE_UID. */
kono
parents: 67
diff changeset
967
kono
parents: 67
diff changeset
968 static inline int
kono
parents: 67
diff changeset
969 ncr_compar (const void *field1_, const void *field2_)
kono
parents: 67
diff changeset
970 {
kono
parents: 67
diff changeset
971 const_tree field1 = *(const_tree *) const_cast <void *>(field1_);
kono
parents: 67
diff changeset
972 const_tree field2 = *(const_tree *) const_cast <void *>(field2_);
kono
parents: 67
diff changeset
973 unsigned int uid1 = TYPE_UID (DECL_FIELD_CONTEXT (field1));
kono
parents: 67
diff changeset
974 unsigned int uid2 = TYPE_UID (DECL_FIELD_CONTEXT (field2));
kono
parents: 67
diff changeset
975 if (uid1 < uid2)
kono
parents: 67
diff changeset
976 return -1;
kono
parents: 67
diff changeset
977 else if (uid1 > uid2)
kono
parents: 67
diff changeset
978 return 1;
kono
parents: 67
diff changeset
979 return 0;
kono
parents: 67
diff changeset
980 }
kono
parents: 67
diff changeset
981
kono
parents: 67
diff changeset
982 /* Return true if we can determine that the fields referenced cannot
kono
parents: 67
diff changeset
983 overlap for any pair of objects. */
kono
parents: 67
diff changeset
984
kono
parents: 67
diff changeset
985 static bool
kono
parents: 67
diff changeset
986 nonoverlapping_component_refs_p (const_tree x, const_tree y)
kono
parents: 67
diff changeset
987 {
kono
parents: 67
diff changeset
988 if (!flag_strict_aliasing
kono
parents: 67
diff changeset
989 || !x || !y
kono
parents: 67
diff changeset
990 || TREE_CODE (x) != COMPONENT_REF
kono
parents: 67
diff changeset
991 || TREE_CODE (y) != COMPONENT_REF)
kono
parents: 67
diff changeset
992 return false;
kono
parents: 67
diff changeset
993
kono
parents: 67
diff changeset
994 auto_vec<const_tree, 16> fieldsx;
kono
parents: 67
diff changeset
995 while (TREE_CODE (x) == COMPONENT_REF)
kono
parents: 67
diff changeset
996 {
kono
parents: 67
diff changeset
997 tree field = TREE_OPERAND (x, 1);
kono
parents: 67
diff changeset
998 tree type = DECL_FIELD_CONTEXT (field);
kono
parents: 67
diff changeset
999 if (TREE_CODE (type) == RECORD_TYPE)
kono
parents: 67
diff changeset
1000 fieldsx.safe_push (field);
kono
parents: 67
diff changeset
1001 x = TREE_OPERAND (x, 0);
kono
parents: 67
diff changeset
1002 }
kono
parents: 67
diff changeset
1003 if (fieldsx.length () == 0)
kono
parents: 67
diff changeset
1004 return false;
kono
parents: 67
diff changeset
1005 auto_vec<const_tree, 16> fieldsy;
kono
parents: 67
diff changeset
1006 while (TREE_CODE (y) == COMPONENT_REF)
kono
parents: 67
diff changeset
1007 {
kono
parents: 67
diff changeset
1008 tree field = TREE_OPERAND (y, 1);
kono
parents: 67
diff changeset
1009 tree type = DECL_FIELD_CONTEXT (field);
kono
parents: 67
diff changeset
1010 if (TREE_CODE (type) == RECORD_TYPE)
kono
parents: 67
diff changeset
1011 fieldsy.safe_push (TREE_OPERAND (y, 1));
kono
parents: 67
diff changeset
1012 y = TREE_OPERAND (y, 0);
kono
parents: 67
diff changeset
1013 }
kono
parents: 67
diff changeset
1014 if (fieldsy.length () == 0)
kono
parents: 67
diff changeset
1015 return false;
kono
parents: 67
diff changeset
1016
kono
parents: 67
diff changeset
1017 /* Most common case first. */
kono
parents: 67
diff changeset
1018 if (fieldsx.length () == 1
kono
parents: 67
diff changeset
1019 && fieldsy.length () == 1)
kono
parents: 67
diff changeset
1020 return ((DECL_FIELD_CONTEXT (fieldsx[0])
kono
parents: 67
diff changeset
1021 == DECL_FIELD_CONTEXT (fieldsy[0]))
kono
parents: 67
diff changeset
1022 && fieldsx[0] != fieldsy[0]
kono
parents: 67
diff changeset
1023 && !(DECL_BIT_FIELD (fieldsx[0]) && DECL_BIT_FIELD (fieldsy[0])));
kono
parents: 67
diff changeset
1024
kono
parents: 67
diff changeset
1025 if (fieldsx.length () == 2)
kono
parents: 67
diff changeset
1026 {
kono
parents: 67
diff changeset
1027 if (ncr_compar (&fieldsx[0], &fieldsx[1]) == 1)
kono
parents: 67
diff changeset
1028 std::swap (fieldsx[0], fieldsx[1]);
kono
parents: 67
diff changeset
1029 }
kono
parents: 67
diff changeset
1030 else
kono
parents: 67
diff changeset
1031 fieldsx.qsort (ncr_compar);
kono
parents: 67
diff changeset
1032
kono
parents: 67
diff changeset
1033 if (fieldsy.length () == 2)
kono
parents: 67
diff changeset
1034 {
kono
parents: 67
diff changeset
1035 if (ncr_compar (&fieldsy[0], &fieldsy[1]) == 1)
kono
parents: 67
diff changeset
1036 std::swap (fieldsy[0], fieldsy[1]);
kono
parents: 67
diff changeset
1037 }
kono
parents: 67
diff changeset
1038 else
kono
parents: 67
diff changeset
1039 fieldsy.qsort (ncr_compar);
kono
parents: 67
diff changeset
1040
kono
parents: 67
diff changeset
1041 unsigned i = 0, j = 0;
kono
parents: 67
diff changeset
1042 do
kono
parents: 67
diff changeset
1043 {
kono
parents: 67
diff changeset
1044 const_tree fieldx = fieldsx[i];
kono
parents: 67
diff changeset
1045 const_tree fieldy = fieldsy[j];
kono
parents: 67
diff changeset
1046 tree typex = DECL_FIELD_CONTEXT (fieldx);
kono
parents: 67
diff changeset
1047 tree typey = DECL_FIELD_CONTEXT (fieldy);
kono
parents: 67
diff changeset
1048 if (typex == typey)
kono
parents: 67
diff changeset
1049 {
kono
parents: 67
diff changeset
1050 /* We're left with accessing different fields of a structure,
kono
parents: 67
diff changeset
1051 no possible overlap. */
kono
parents: 67
diff changeset
1052 if (fieldx != fieldy)
kono
parents: 67
diff changeset
1053 {
kono
parents: 67
diff changeset
1054 /* A field and its representative need to be considered the
kono
parents: 67
diff changeset
1055 same. */
kono
parents: 67
diff changeset
1056 if (DECL_BIT_FIELD_REPRESENTATIVE (fieldx) == fieldy
kono
parents: 67
diff changeset
1057 || DECL_BIT_FIELD_REPRESENTATIVE (fieldy) == fieldx)
kono
parents: 67
diff changeset
1058 return false;
kono
parents: 67
diff changeset
1059 /* Different fields of the same record type cannot overlap.
kono
parents: 67
diff changeset
1060 ??? Bitfields can overlap at RTL level so punt on them. */
kono
parents: 67
diff changeset
1061 if (DECL_BIT_FIELD (fieldx) && DECL_BIT_FIELD (fieldy))
kono
parents: 67
diff changeset
1062 return false;
kono
parents: 67
diff changeset
1063 return true;
kono
parents: 67
diff changeset
1064 }
kono
parents: 67
diff changeset
1065 }
kono
parents: 67
diff changeset
1066 if (TYPE_UID (typex) < TYPE_UID (typey))
kono
parents: 67
diff changeset
1067 {
kono
parents: 67
diff changeset
1068 i++;
kono
parents: 67
diff changeset
1069 if (i == fieldsx.length ())
kono
parents: 67
diff changeset
1070 break;
kono
parents: 67
diff changeset
1071 }
kono
parents: 67
diff changeset
1072 else
kono
parents: 67
diff changeset
1073 {
kono
parents: 67
diff changeset
1074 j++;
kono
parents: 67
diff changeset
1075 if (j == fieldsy.length ())
kono
parents: 67
diff changeset
1076 break;
kono
parents: 67
diff changeset
1077 }
kono
parents: 67
diff changeset
1078 }
kono
parents: 67
diff changeset
1079 while (1);
kono
parents: 67
diff changeset
1080
kono
parents: 67
diff changeset
1081 return false;
kono
parents: 67
diff changeset
1082 }
kono
parents: 67
diff changeset
1083
kono
parents: 67
diff changeset
1084
kono
parents: 67
diff changeset
1085 /* Return true if two memory references based on the variables BASE1
kono
parents: 67
diff changeset
1086 and BASE2 constrained to [OFFSET1, OFFSET1 + MAX_SIZE1) and
kono
parents: 67
diff changeset
1087 [OFFSET2, OFFSET2 + MAX_SIZE2) may alias. REF1 and REF2
kono
parents: 67
diff changeset
1088 if non-NULL are the complete memory reference trees. */
kono
parents: 67
diff changeset
1089
kono
parents: 67
diff changeset
1090 static bool
kono
parents: 67
diff changeset
1091 decl_refs_may_alias_p (tree ref1, tree base1,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1092 poly_int64 offset1, poly_int64 max_size1,
111
kono
parents: 67
diff changeset
1093 tree ref2, tree base2,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1094 poly_int64 offset2, poly_int64 max_size2)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1095 {
111
kono
parents: 67
diff changeset
1096 gcc_checking_assert (DECL_P (base1) && DECL_P (base2));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1097
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1098 /* If both references are based on different variables, they cannot alias. */
111
kono
parents: 67
diff changeset
1099 if (compare_base_decls (base1, base2) == 0)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1100 return false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1101
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1102 /* If both references are based on the same variable, they cannot alias if
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1103 the accesses do not overlap. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1104 if (!ranges_maybe_overlap_p (offset1, max_size1, offset2, max_size2))
111
kono
parents: 67
diff changeset
1105 return false;
kono
parents: 67
diff changeset
1106
kono
parents: 67
diff changeset
1107 /* For components with variable position, the above test isn't sufficient,
kono
parents: 67
diff changeset
1108 so we disambiguate component references manually. */
kono
parents: 67
diff changeset
1109 if (ref1 && ref2
kono
parents: 67
diff changeset
1110 && handled_component_p (ref1) && handled_component_p (ref2)
kono
parents: 67
diff changeset
1111 && nonoverlapping_component_refs_of_decl_p (ref1, ref2))
kono
parents: 67
diff changeset
1112 return false;
kono
parents: 67
diff changeset
1113
kono
parents: 67
diff changeset
1114 return true;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1115 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1116
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1117 /* Return true if an indirect reference based on *PTR1 constrained
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1118 to [OFFSET1, OFFSET1 + MAX_SIZE1) may alias a variable based on BASE2
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1119 constrained to [OFFSET2, OFFSET2 + MAX_SIZE2). *PTR1 and BASE2 have
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1120 the alias sets BASE1_ALIAS_SET and BASE2_ALIAS_SET which can be -1
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1121 in which case they are computed on-demand. REF1 and REF2
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1122 if non-NULL are the complete memory reference trees. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1123
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1124 static bool
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1125 indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1126 poly_int64 offset1, poly_int64 max_size1,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1127 alias_set_type ref1_alias_set,
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1128 alias_set_type base1_alias_set,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1129 tree ref2 ATTRIBUTE_UNUSED, tree base2,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1130 poly_int64 offset2, poly_int64 max_size2,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1131 alias_set_type ref2_alias_set,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1132 alias_set_type base2_alias_set, bool tbaa_p)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1133 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1134 tree ptr1;
111
kono
parents: 67
diff changeset
1135 tree ptrtype1, dbase2;
kono
parents: 67
diff changeset
1136
kono
parents: 67
diff changeset
1137 gcc_checking_assert ((TREE_CODE (base1) == MEM_REF
kono
parents: 67
diff changeset
1138 || TREE_CODE (base1) == TARGET_MEM_REF)
kono
parents: 67
diff changeset
1139 && DECL_P (base2));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1140
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1141 ptr1 = TREE_OPERAND (base1, 0);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1142 poly_offset_int moff = mem_ref_offset (base1) << LOG2_BITS_PER_UNIT;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1143
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1144 /* If only one reference is based on a variable, they cannot alias if
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1145 the pointer access is beyond the extent of the variable access.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1146 (the pointer base cannot validly point to an offset less than zero
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1147 of the variable).
111
kono
parents: 67
diff changeset
1148 ??? IVOPTs creates bases that do not honor this restriction,
kono
parents: 67
diff changeset
1149 so do not apply this optimization for TARGET_MEM_REFs. */
kono
parents: 67
diff changeset
1150 if (TREE_CODE (base1) != TARGET_MEM_REF
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1151 && !ranges_maybe_overlap_p (offset1 + moff, -1, offset2, max_size2))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1152 return false;
111
kono
parents: 67
diff changeset
1153 /* They also cannot alias if the pointer may not point to the decl. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1154 if (!ptr_deref_may_alias_decl_p (ptr1, base2))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1155 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1156
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1157 /* Disambiguations that rely on strict aliasing rules follow. */
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1158 if (!flag_strict_aliasing || !tbaa_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1159 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1160
111
kono
parents: 67
diff changeset
1161 ptrtype1 = TREE_TYPE (TREE_OPERAND (base1, 1));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1162
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1163 /* If the alias set for a pointer access is zero all bets are off. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1164 if (base1_alias_set == 0)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1165 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1166
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1167 /* When we are trying to disambiguate an access with a pointer dereference
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1168 as base versus one with a decl as base we can use both the size
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1169 of the decl and its dynamic type for extra disambiguation.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1170 ??? We do not know anything about the dynamic type of the decl
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1171 other than that its alias-set contains base2_alias_set as a subset
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1172 which does not help us here. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1173 /* As we know nothing useful about the dynamic type of the decl just
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1174 use the usual conflict check rather than a subset test.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1175 ??? We could introduce -fvery-strict-aliasing when the language
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1176 does not allow decls to have a dynamic type that differs from their
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1177 static type. Then we can check
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1178 !alias_set_subset_of (base1_alias_set, base2_alias_set) instead. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1179 if (base1_alias_set != base2_alias_set
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1180 && !alias_sets_conflict_p (base1_alias_set, base2_alias_set))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1181 return false;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1182 /* If the size of the access relevant for TBAA through the pointer
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1183 is bigger than the size of the decl we can't possibly access the
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1184 decl via that pointer. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1185 if (DECL_SIZE (base2) && COMPLETE_TYPE_P (TREE_TYPE (ptrtype1))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1186 && poly_int_tree_p (DECL_SIZE (base2))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1187 && poly_int_tree_p (TYPE_SIZE (TREE_TYPE (ptrtype1)))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1188 /* ??? This in turn may run afoul when a decl of type T which is
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1189 a member of union type U is accessed through a pointer to
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1190 type U and sizeof T is smaller than sizeof U. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1191 && TREE_CODE (TREE_TYPE (ptrtype1)) != UNION_TYPE
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1192 && TREE_CODE (TREE_TYPE (ptrtype1)) != QUAL_UNION_TYPE
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1193 && known_lt (wi::to_poly_widest (DECL_SIZE (base2)),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1194 wi::to_poly_widest (TYPE_SIZE (TREE_TYPE (ptrtype1)))))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1195 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1196
111
kono
parents: 67
diff changeset
1197 if (!ref2)
kono
parents: 67
diff changeset
1198 return true;
kono
parents: 67
diff changeset
1199
kono
parents: 67
diff changeset
1200 /* If the decl is accessed via a MEM_REF, reconstruct the base
kono
parents: 67
diff changeset
1201 we can use for TBAA and an appropriately adjusted offset. */
kono
parents: 67
diff changeset
1202 dbase2 = ref2;
kono
parents: 67
diff changeset
1203 while (handled_component_p (dbase2))
kono
parents: 67
diff changeset
1204 dbase2 = TREE_OPERAND (dbase2, 0);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1205 poly_int64 doffset1 = offset1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1206 poly_offset_int doffset2 = offset2;
111
kono
parents: 67
diff changeset
1207 if (TREE_CODE (dbase2) == MEM_REF
kono
parents: 67
diff changeset
1208 || TREE_CODE (dbase2) == TARGET_MEM_REF)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1209 doffset2 -= mem_ref_offset (dbase2) << LOG2_BITS_PER_UNIT;
111
kono
parents: 67
diff changeset
1210
kono
parents: 67
diff changeset
1211 /* If either reference is view-converted, give up now. */
kono
parents: 67
diff changeset
1212 if (same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) != 1
kono
parents: 67
diff changeset
1213 || same_type_for_tbaa (TREE_TYPE (dbase2), TREE_TYPE (base2)) != 1)
kono
parents: 67
diff changeset
1214 return true;
kono
parents: 67
diff changeset
1215
kono
parents: 67
diff changeset
1216 /* If both references are through the same type, they do not alias
kono
parents: 67
diff changeset
1217 if the accesses do not overlap. This does extra disambiguation
kono
parents: 67
diff changeset
1218 for mixed/pointer accesses but requires strict aliasing.
kono
parents: 67
diff changeset
1219 For MEM_REFs we require that the component-ref offset we computed
kono
parents: 67
diff changeset
1220 is relative to the start of the type which we ensure by
kono
parents: 67
diff changeset
1221 comparing rvalue and access type and disregarding the constant
kono
parents: 67
diff changeset
1222 pointer offset. */
kono
parents: 67
diff changeset
1223 if ((TREE_CODE (base1) != TARGET_MEM_REF
kono
parents: 67
diff changeset
1224 || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1)))
kono
parents: 67
diff changeset
1225 && same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (dbase2)) == 1)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1226 return ranges_maybe_overlap_p (doffset1, max_size1, doffset2, max_size2);
111
kono
parents: 67
diff changeset
1227
kono
parents: 67
diff changeset
1228 if (ref1 && ref2
kono
parents: 67
diff changeset
1229 && nonoverlapping_component_refs_p (ref1, ref2))
kono
parents: 67
diff changeset
1230 return false;
kono
parents: 67
diff changeset
1231
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1232 /* Do access-path based disambiguation. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1233 if (ref1 && ref2
111
kono
parents: 67
diff changeset
1234 && (handled_component_p (ref1) || handled_component_p (ref2)))
kono
parents: 67
diff changeset
1235 return aliasing_component_refs_p (ref1,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1236 ref1_alias_set, base1_alias_set,
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1237 offset1, max_size1,
111
kono
parents: 67
diff changeset
1238 ref2,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1239 ref2_alias_set, base2_alias_set,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1240 offset2, max_size2, true);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1241
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1242 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1243 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1244
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1245 /* Return true if two indirect references based on *PTR1
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1246 and *PTR2 constrained to [OFFSET1, OFFSET1 + MAX_SIZE1) and
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1247 [OFFSET2, OFFSET2 + MAX_SIZE2) may alias. *PTR1 and *PTR2 have
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1248 the alias sets BASE1_ALIAS_SET and BASE2_ALIAS_SET which can be -1
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1249 in which case they are computed on-demand. REF1 and REF2
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1250 if non-NULL are the complete memory reference trees. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1251
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1252 static bool
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1253 indirect_refs_may_alias_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1254 poly_int64 offset1, poly_int64 max_size1,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1255 alias_set_type ref1_alias_set,
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1256 alias_set_type base1_alias_set,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1257 tree ref2 ATTRIBUTE_UNUSED, tree base2,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1258 poly_int64 offset2, poly_int64 max_size2,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1259 alias_set_type ref2_alias_set,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1260 alias_set_type base2_alias_set, bool tbaa_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1261 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1262 tree ptr1;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1263 tree ptr2;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1264 tree ptrtype1, ptrtype2;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1265
111
kono
parents: 67
diff changeset
1266 gcc_checking_assert ((TREE_CODE (base1) == MEM_REF
kono
parents: 67
diff changeset
1267 || TREE_CODE (base1) == TARGET_MEM_REF)
kono
parents: 67
diff changeset
1268 && (TREE_CODE (base2) == MEM_REF
kono
parents: 67
diff changeset
1269 || TREE_CODE (base2) == TARGET_MEM_REF));
kono
parents: 67
diff changeset
1270
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1271 ptr1 = TREE_OPERAND (base1, 0);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1272 ptr2 = TREE_OPERAND (base2, 0);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1273
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1274 /* If both bases are based on pointers they cannot alias if they may not
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1275 point to the same memory object or if they point to the same object
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1276 and the accesses do not overlap. */
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1277 if ((!cfun || gimple_in_ssa_p (cfun))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1278 && operand_equal_p (ptr1, ptr2, 0)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1279 && (((TREE_CODE (base1) != TARGET_MEM_REF
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1280 || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1)))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1281 && (TREE_CODE (base2) != TARGET_MEM_REF
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1282 || (!TMR_INDEX (base2) && !TMR_INDEX2 (base2))))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1283 || (TREE_CODE (base1) == TARGET_MEM_REF
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1284 && TREE_CODE (base2) == TARGET_MEM_REF
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1285 && (TMR_STEP (base1) == TMR_STEP (base2)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1286 || (TMR_STEP (base1) && TMR_STEP (base2)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1287 && operand_equal_p (TMR_STEP (base1),
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1288 TMR_STEP (base2), 0)))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1289 && (TMR_INDEX (base1) == TMR_INDEX (base2)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1290 || (TMR_INDEX (base1) && TMR_INDEX (base2)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1291 && operand_equal_p (TMR_INDEX (base1),
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1292 TMR_INDEX (base2), 0)))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1293 && (TMR_INDEX2 (base1) == TMR_INDEX2 (base2)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1294 || (TMR_INDEX2 (base1) && TMR_INDEX2 (base2)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1295 && operand_equal_p (TMR_INDEX2 (base1),
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1296 TMR_INDEX2 (base2), 0))))))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1297 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1298 poly_offset_int moff1 = mem_ref_offset (base1) << LOG2_BITS_PER_UNIT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1299 poly_offset_int moff2 = mem_ref_offset (base2) << LOG2_BITS_PER_UNIT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1300 return ranges_maybe_overlap_p (offset1 + moff1, max_size1,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1301 offset2 + moff2, max_size2);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1302 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1303 if (!ptr_derefs_may_alias_p (ptr1, ptr2))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1304 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1305
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1306 /* Disambiguations that rely on strict aliasing rules follow. */
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1307 if (!flag_strict_aliasing || !tbaa_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1308 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1309
111
kono
parents: 67
diff changeset
1310 ptrtype1 = TREE_TYPE (TREE_OPERAND (base1, 1));
kono
parents: 67
diff changeset
1311 ptrtype2 = TREE_TYPE (TREE_OPERAND (base2, 1));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1312
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1313 /* If the alias set for a pointer access is zero all bets are off. */
111
kono
parents: 67
diff changeset
1314 if (base1_alias_set == 0
kono
parents: 67
diff changeset
1315 || base2_alias_set == 0)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1316 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1317
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1318 /* If both references are through the same type, they do not alias
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1319 if the accesses do not overlap. This does extra disambiguation
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1320 for mixed/pointer accesses but requires strict aliasing. */
111
kono
parents: 67
diff changeset
1321 if ((TREE_CODE (base1) != TARGET_MEM_REF
kono
parents: 67
diff changeset
1322 || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1)))
kono
parents: 67
diff changeset
1323 && (TREE_CODE (base2) != TARGET_MEM_REF
kono
parents: 67
diff changeset
1324 || (!TMR_INDEX (base2) && !TMR_INDEX2 (base2)))
kono
parents: 67
diff changeset
1325 && same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) == 1
kono
parents: 67
diff changeset
1326 && same_type_for_tbaa (TREE_TYPE (base2), TREE_TYPE (ptrtype2)) == 1
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1327 && same_type_for_tbaa (TREE_TYPE (ptrtype1),
111
kono
parents: 67
diff changeset
1328 TREE_TYPE (ptrtype2)) == 1
kono
parents: 67
diff changeset
1329 /* But avoid treating arrays as "objects", instead assume they
kono
parents: 67
diff changeset
1330 can overlap by an exact multiple of their element size. */
kono
parents: 67
diff changeset
1331 && TREE_CODE (TREE_TYPE (ptrtype1)) != ARRAY_TYPE)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1332 return ranges_maybe_overlap_p (offset1, max_size1, offset2, max_size2);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1333
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1334 /* Do type-based disambiguation. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1335 if (base1_alias_set != base2_alias_set
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1336 && !alias_sets_conflict_p (base1_alias_set, base2_alias_set))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1337 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1338
111
kono
parents: 67
diff changeset
1339 /* If either reference is view-converted, give up now. */
kono
parents: 67
diff changeset
1340 if (same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) != 1
kono
parents: 67
diff changeset
1341 || same_type_for_tbaa (TREE_TYPE (base2), TREE_TYPE (ptrtype2)) != 1)
kono
parents: 67
diff changeset
1342 return true;
kono
parents: 67
diff changeset
1343
kono
parents: 67
diff changeset
1344 if (ref1 && ref2
kono
parents: 67
diff changeset
1345 && nonoverlapping_component_refs_p (ref1, ref2))
kono
parents: 67
diff changeset
1346 return false;
kono
parents: 67
diff changeset
1347
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1348 /* Do access-path based disambiguation. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1349 if (ref1 && ref2
111
kono
parents: 67
diff changeset
1350 && (handled_component_p (ref1) || handled_component_p (ref2)))
kono
parents: 67
diff changeset
1351 return aliasing_component_refs_p (ref1,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1352 ref1_alias_set, base1_alias_set,
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1353 offset1, max_size1,
111
kono
parents: 67
diff changeset
1354 ref2,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1355 ref2_alias_set, base2_alias_set,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1356 offset2, max_size2, false);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1357
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1358 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1359 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1360
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1361 /* Return true, if the two memory references REF1 and REF2 may alias. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1362
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1363 bool
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1364 refs_may_alias_p_1 (ao_ref *ref1, ao_ref *ref2, bool tbaa_p)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1365 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1366 tree base1, base2;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1367 poly_int64 offset1 = 0, offset2 = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1368 poly_int64 max_size1 = -1, max_size2 = -1;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1369 bool var1_p, var2_p, ind1_p, ind2_p;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1370
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1371 gcc_checking_assert ((!ref1->ref
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1372 || TREE_CODE (ref1->ref) == SSA_NAME
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1373 || DECL_P (ref1->ref)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1374 || TREE_CODE (ref1->ref) == STRING_CST
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1375 || handled_component_p (ref1->ref)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1376 || TREE_CODE (ref1->ref) == MEM_REF
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1377 || TREE_CODE (ref1->ref) == TARGET_MEM_REF)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1378 && (!ref2->ref
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1379 || TREE_CODE (ref2->ref) == SSA_NAME
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1380 || DECL_P (ref2->ref)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1381 || TREE_CODE (ref2->ref) == STRING_CST
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1382 || handled_component_p (ref2->ref)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1383 || TREE_CODE (ref2->ref) == MEM_REF
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1384 || TREE_CODE (ref2->ref) == TARGET_MEM_REF));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1385
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1386 /* Decompose the references into their base objects and the access. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1387 base1 = ao_ref_base (ref1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1388 offset1 = ref1->offset;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1389 max_size1 = ref1->max_size;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1390 base2 = ao_ref_base (ref2);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1391 offset2 = ref2->offset;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1392 max_size2 = ref2->max_size;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1393
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1394 /* We can end up with registers or constants as bases for example from
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1395 *D.1663_44 = VIEW_CONVERT_EXPR<struct DB_LSN>(__tmp$B0F64_59);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1396 which is seen as a struct copy. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1397 if (TREE_CODE (base1) == SSA_NAME
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1398 || TREE_CODE (base1) == CONST_DECL
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1399 || TREE_CODE (base1) == CONSTRUCTOR
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1400 || TREE_CODE (base1) == ADDR_EXPR
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1401 || CONSTANT_CLASS_P (base1)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1402 || TREE_CODE (base2) == SSA_NAME
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1403 || TREE_CODE (base2) == CONST_DECL
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1404 || TREE_CODE (base2) == CONSTRUCTOR
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1405 || TREE_CODE (base2) == ADDR_EXPR
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1406 || CONSTANT_CLASS_P (base2))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1407 return false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1408
111
kono
parents: 67
diff changeset
1409 /* We can end up referring to code via function and label decls.
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1410 As we likely do not properly track code aliases conservatively
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1411 bail out. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1412 if (TREE_CODE (base1) == FUNCTION_DECL
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1413 || TREE_CODE (base1) == LABEL_DECL
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1414 || TREE_CODE (base2) == FUNCTION_DECL
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1415 || TREE_CODE (base2) == LABEL_DECL)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1416 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1417
111
kono
parents: 67
diff changeset
1418 /* Two volatile accesses always conflict. */
kono
parents: 67
diff changeset
1419 if (ref1->volatile_p
kono
parents: 67
diff changeset
1420 && ref2->volatile_p)
kono
parents: 67
diff changeset
1421 return true;
kono
parents: 67
diff changeset
1422
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1423 /* Defer to simple offset based disambiguation if we have
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1424 references based on two decls. Do this before defering to
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1425 TBAA to handle must-alias cases in conformance with the
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1426 GCC extension of allowing type-punning through unions. */
111
kono
parents: 67
diff changeset
1427 var1_p = DECL_P (base1);
kono
parents: 67
diff changeset
1428 var2_p = DECL_P (base2);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1429 if (var1_p && var2_p)
111
kono
parents: 67
diff changeset
1430 return decl_refs_may_alias_p (ref1->ref, base1, offset1, max_size1,
kono
parents: 67
diff changeset
1431 ref2->ref, base2, offset2, max_size2);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1432
111
kono
parents: 67
diff changeset
1433 /* Handle restrict based accesses.
kono
parents: 67
diff changeset
1434 ??? ao_ref_base strips inner MEM_REF [&decl], recover from that
kono
parents: 67
diff changeset
1435 here. */
kono
parents: 67
diff changeset
1436 tree rbase1 = base1;
kono
parents: 67
diff changeset
1437 tree rbase2 = base2;
kono
parents: 67
diff changeset
1438 if (var1_p)
kono
parents: 67
diff changeset
1439 {
kono
parents: 67
diff changeset
1440 rbase1 = ref1->ref;
kono
parents: 67
diff changeset
1441 if (rbase1)
kono
parents: 67
diff changeset
1442 while (handled_component_p (rbase1))
kono
parents: 67
diff changeset
1443 rbase1 = TREE_OPERAND (rbase1, 0);
kono
parents: 67
diff changeset
1444 }
kono
parents: 67
diff changeset
1445 if (var2_p)
kono
parents: 67
diff changeset
1446 {
kono
parents: 67
diff changeset
1447 rbase2 = ref2->ref;
kono
parents: 67
diff changeset
1448 if (rbase2)
kono
parents: 67
diff changeset
1449 while (handled_component_p (rbase2))
kono
parents: 67
diff changeset
1450 rbase2 = TREE_OPERAND (rbase2, 0);
kono
parents: 67
diff changeset
1451 }
kono
parents: 67
diff changeset
1452 if (rbase1 && rbase2
kono
parents: 67
diff changeset
1453 && (TREE_CODE (base1) == MEM_REF || TREE_CODE (base1) == TARGET_MEM_REF)
kono
parents: 67
diff changeset
1454 && (TREE_CODE (base2) == MEM_REF || TREE_CODE (base2) == TARGET_MEM_REF)
kono
parents: 67
diff changeset
1455 /* If the accesses are in the same restrict clique... */
kono
parents: 67
diff changeset
1456 && MR_DEPENDENCE_CLIQUE (base1) == MR_DEPENDENCE_CLIQUE (base2)
kono
parents: 67
diff changeset
1457 /* But based on different pointers they do not alias. */
kono
parents: 67
diff changeset
1458 && MR_DEPENDENCE_BASE (base1) != MR_DEPENDENCE_BASE (base2))
kono
parents: 67
diff changeset
1459 return false;
kono
parents: 67
diff changeset
1460
kono
parents: 67
diff changeset
1461 ind1_p = (TREE_CODE (base1) == MEM_REF
kono
parents: 67
diff changeset
1462 || TREE_CODE (base1) == TARGET_MEM_REF);
kono
parents: 67
diff changeset
1463 ind2_p = (TREE_CODE (base2) == MEM_REF
kono
parents: 67
diff changeset
1464 || TREE_CODE (base2) == TARGET_MEM_REF);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1465
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1466 /* Canonicalize the pointer-vs-decl case. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1467 if (ind1_p && var2_p)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1468 {
111
kono
parents: 67
diff changeset
1469 std::swap (offset1, offset2);
kono
parents: 67
diff changeset
1470 std::swap (max_size1, max_size2);
kono
parents: 67
diff changeset
1471 std::swap (base1, base2);
kono
parents: 67
diff changeset
1472 std::swap (ref1, ref2);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1473 var1_p = true;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1474 ind1_p = false;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1475 var2_p = false;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1476 ind2_p = true;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1477 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1478
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1479 /* First defer to TBAA if possible. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1480 if (tbaa_p
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1481 && flag_strict_aliasing
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1482 && !alias_sets_conflict_p (ao_ref_alias_set (ref1),
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1483 ao_ref_alias_set (ref2)))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1484 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1485
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1486 /* If the reference is based on a pointer that points to memory
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1487 that may not be written to then the other reference cannot possibly
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1488 clobber it. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1489 if ((TREE_CODE (TREE_OPERAND (base2, 0)) == SSA_NAME
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1490 && SSA_NAME_POINTS_TO_READONLY_MEMORY (TREE_OPERAND (base2, 0)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1491 || (ind1_p
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1492 && TREE_CODE (TREE_OPERAND (base1, 0)) == SSA_NAME
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1493 && SSA_NAME_POINTS_TO_READONLY_MEMORY (TREE_OPERAND (base1, 0))))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1494 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1495
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1496 /* Dispatch to the pointer-vs-decl or pointer-vs-pointer disambiguators. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1497 if (var1_p && ind2_p)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1498 return indirect_ref_may_alias_decl_p (ref2->ref, base2,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1499 offset2, max_size2,
111
kono
parents: 67
diff changeset
1500 ao_ref_alias_set (ref2),
kono
parents: 67
diff changeset
1501 ao_ref_base_alias_set (ref2),
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1502 ref1->ref, base1,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1503 offset1, max_size1,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1504 ao_ref_alias_set (ref1),
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1505 ao_ref_base_alias_set (ref1),
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1506 tbaa_p);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1507 else if (ind1_p && ind2_p)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1508 return indirect_refs_may_alias_p (ref1->ref, base1,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1509 offset1, max_size1,
111
kono
parents: 67
diff changeset
1510 ao_ref_alias_set (ref1),
kono
parents: 67
diff changeset
1511 ao_ref_base_alias_set (ref1),
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1512 ref2->ref, base2,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1513 offset2, max_size2,
111
kono
parents: 67
diff changeset
1514 ao_ref_alias_set (ref2),
kono
parents: 67
diff changeset
1515 ao_ref_base_alias_set (ref2),
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1516 tbaa_p);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1517
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1518 gcc_unreachable ();
111
kono
parents: 67
diff changeset
1519 }
kono
parents: 67
diff changeset
1520
kono
parents: 67
diff changeset
1521 static bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1522 refs_may_alias_p (tree ref1, ao_ref *ref2, bool tbaa_p)
111
kono
parents: 67
diff changeset
1523 {
kono
parents: 67
diff changeset
1524 ao_ref r1;
kono
parents: 67
diff changeset
1525 ao_ref_init (&r1, ref1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1526 return refs_may_alias_p_1 (&r1, ref2, tbaa_p);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1527 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1528
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1529 bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1530 refs_may_alias_p (tree ref1, tree ref2, bool tbaa_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1531 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1532 ao_ref r1, r2;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1533 bool res;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1534 ao_ref_init (&r1, ref1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1535 ao_ref_init (&r2, ref2);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1536 res = refs_may_alias_p_1 (&r1, &r2, tbaa_p);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1537 if (res)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1538 ++alias_stats.refs_may_alias_p_may_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1539 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1540 ++alias_stats.refs_may_alias_p_no_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1541 return res;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1542 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1543
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1544 /* Returns true if there is a anti-dependence for the STORE that
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1545 executes after the LOAD. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1546
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1547 bool
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1548 refs_anti_dependent_p (tree load, tree store)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1549 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1550 ao_ref r1, r2;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1551 ao_ref_init (&r1, load);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1552 ao_ref_init (&r2, store);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1553 return refs_may_alias_p_1 (&r1, &r2, false);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1554 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1555
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1556 /* Returns true if there is a output dependence for the stores
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1557 STORE1 and STORE2. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1558
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1559 bool
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1560 refs_output_dependent_p (tree store1, tree store2)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1561 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1562 ao_ref r1, r2;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1563 ao_ref_init (&r1, store1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1564 ao_ref_init (&r2, store2);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1565 return refs_may_alias_p_1 (&r1, &r2, false);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1566 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1567
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1568 /* If the call CALL may use the memory reference REF return true,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1569 otherwise return false. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1570
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1571 static bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1572 ref_maybe_used_by_call_p_1 (gcall *call, ao_ref *ref, bool tbaa_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1573 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1574 tree base, callee;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1575 unsigned i;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1576 int flags = gimple_call_flags (call);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1577
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1578 /* Const functions without a static chain do not implicitly use memory. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1579 if (!gimple_call_chain (call)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1580 && (flags & (ECF_CONST|ECF_NOVOPS)))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1581 goto process_args;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1582
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1583 base = ao_ref_base (ref);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1584 if (!base)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1585 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1586
111
kono
parents: 67
diff changeset
1587 /* A call that is not without side-effects might involve volatile
kono
parents: 67
diff changeset
1588 accesses and thus conflicts with all other volatile accesses. */
kono
parents: 67
diff changeset
1589 if (ref->volatile_p)
kono
parents: 67
diff changeset
1590 return true;
kono
parents: 67
diff changeset
1591
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1592 /* If the reference is based on a decl that is not aliased the call
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1593 cannot possibly use it. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1594 if (DECL_P (base)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1595 && !may_be_aliased (base)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1596 /* But local statics can be used through recursion. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1597 && !is_global_var (base))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1598 goto process_args;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1599
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1600 callee = gimple_call_fndecl (call);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1601
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1602 /* Handle those builtin functions explicitly that do not act as
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1603 escape points. See tree-ssa-structalias.c:find_func_aliases
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1604 for the list of builtins we might need to handle here. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1605 if (callee != NULL_TREE
111
kono
parents: 67
diff changeset
1606 && gimple_call_builtin_p (call, BUILT_IN_NORMAL))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1607 switch (DECL_FUNCTION_CODE (callee))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1608 {
111
kono
parents: 67
diff changeset
1609 /* All the following functions read memory pointed to by
kono
parents: 67
diff changeset
1610 their second argument. strcat/strncat additionally
kono
parents: 67
diff changeset
1611 reads memory pointed to by the first argument. */
kono
parents: 67
diff changeset
1612 case BUILT_IN_STRCAT:
kono
parents: 67
diff changeset
1613 case BUILT_IN_STRNCAT:
kono
parents: 67
diff changeset
1614 {
kono
parents: 67
diff changeset
1615 ao_ref dref;
kono
parents: 67
diff changeset
1616 ao_ref_init_from_ptr_and_size (&dref,
kono
parents: 67
diff changeset
1617 gimple_call_arg (call, 0),
kono
parents: 67
diff changeset
1618 NULL_TREE);
kono
parents: 67
diff changeset
1619 if (refs_may_alias_p_1 (&dref, ref, false))
kono
parents: 67
diff changeset
1620 return true;
kono
parents: 67
diff changeset
1621 }
kono
parents: 67
diff changeset
1622 /* FALLTHRU */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1623 case BUILT_IN_STRCPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1624 case BUILT_IN_STRNCPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1625 case BUILT_IN_MEMCPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1626 case BUILT_IN_MEMMOVE:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1627 case BUILT_IN_MEMPCPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1628 case BUILT_IN_STPCPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1629 case BUILT_IN_STPNCPY:
111
kono
parents: 67
diff changeset
1630 case BUILT_IN_TM_MEMCPY:
kono
parents: 67
diff changeset
1631 case BUILT_IN_TM_MEMMOVE:
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1632 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1633 ao_ref dref;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1634 tree size = NULL_TREE;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1635 if (gimple_call_num_args (call) == 3)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1636 size = gimple_call_arg (call, 2);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1637 ao_ref_init_from_ptr_and_size (&dref,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1638 gimple_call_arg (call, 1),
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1639 size);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1640 return refs_may_alias_p_1 (&dref, ref, false);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1641 }
111
kono
parents: 67
diff changeset
1642 case BUILT_IN_STRCAT_CHK:
kono
parents: 67
diff changeset
1643 case BUILT_IN_STRNCAT_CHK:
kono
parents: 67
diff changeset
1644 {
kono
parents: 67
diff changeset
1645 ao_ref dref;
kono
parents: 67
diff changeset
1646 ao_ref_init_from_ptr_and_size (&dref,
kono
parents: 67
diff changeset
1647 gimple_call_arg (call, 0),
kono
parents: 67
diff changeset
1648 NULL_TREE);
kono
parents: 67
diff changeset
1649 if (refs_may_alias_p_1 (&dref, ref, false))
kono
parents: 67
diff changeset
1650 return true;
kono
parents: 67
diff changeset
1651 }
kono
parents: 67
diff changeset
1652 /* FALLTHRU */
kono
parents: 67
diff changeset
1653 case BUILT_IN_STRCPY_CHK:
kono
parents: 67
diff changeset
1654 case BUILT_IN_STRNCPY_CHK:
kono
parents: 67
diff changeset
1655 case BUILT_IN_MEMCPY_CHK:
kono
parents: 67
diff changeset
1656 case BUILT_IN_MEMMOVE_CHK:
kono
parents: 67
diff changeset
1657 case BUILT_IN_MEMPCPY_CHK:
kono
parents: 67
diff changeset
1658 case BUILT_IN_STPCPY_CHK:
kono
parents: 67
diff changeset
1659 case BUILT_IN_STPNCPY_CHK:
kono
parents: 67
diff changeset
1660 {
kono
parents: 67
diff changeset
1661 ao_ref dref;
kono
parents: 67
diff changeset
1662 tree size = NULL_TREE;
kono
parents: 67
diff changeset
1663 if (gimple_call_num_args (call) == 4)
kono
parents: 67
diff changeset
1664 size = gimple_call_arg (call, 2);
kono
parents: 67
diff changeset
1665 ao_ref_init_from_ptr_and_size (&dref,
kono
parents: 67
diff changeset
1666 gimple_call_arg (call, 1),
kono
parents: 67
diff changeset
1667 size);
kono
parents: 67
diff changeset
1668 return refs_may_alias_p_1 (&dref, ref, false);
kono
parents: 67
diff changeset
1669 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1670 case BUILT_IN_BCOPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1671 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1672 ao_ref dref;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1673 tree size = gimple_call_arg (call, 2);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1674 ao_ref_init_from_ptr_and_size (&dref,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1675 gimple_call_arg (call, 0),
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1676 size);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1677 return refs_may_alias_p_1 (&dref, ref, false);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1678 }
111
kono
parents: 67
diff changeset
1679
kono
parents: 67
diff changeset
1680 /* The following functions read memory pointed to by their
kono
parents: 67
diff changeset
1681 first argument. */
kono
parents: 67
diff changeset
1682 CASE_BUILT_IN_TM_LOAD (1):
kono
parents: 67
diff changeset
1683 CASE_BUILT_IN_TM_LOAD (2):
kono
parents: 67
diff changeset
1684 CASE_BUILT_IN_TM_LOAD (4):
kono
parents: 67
diff changeset
1685 CASE_BUILT_IN_TM_LOAD (8):
kono
parents: 67
diff changeset
1686 CASE_BUILT_IN_TM_LOAD (FLOAT):
kono
parents: 67
diff changeset
1687 CASE_BUILT_IN_TM_LOAD (DOUBLE):
kono
parents: 67
diff changeset
1688 CASE_BUILT_IN_TM_LOAD (LDOUBLE):
kono
parents: 67
diff changeset
1689 CASE_BUILT_IN_TM_LOAD (M64):
kono
parents: 67
diff changeset
1690 CASE_BUILT_IN_TM_LOAD (M128):
kono
parents: 67
diff changeset
1691 CASE_BUILT_IN_TM_LOAD (M256):
kono
parents: 67
diff changeset
1692 case BUILT_IN_TM_LOG:
kono
parents: 67
diff changeset
1693 case BUILT_IN_TM_LOG_1:
kono
parents: 67
diff changeset
1694 case BUILT_IN_TM_LOG_2:
kono
parents: 67
diff changeset
1695 case BUILT_IN_TM_LOG_4:
kono
parents: 67
diff changeset
1696 case BUILT_IN_TM_LOG_8:
kono
parents: 67
diff changeset
1697 case BUILT_IN_TM_LOG_FLOAT:
kono
parents: 67
diff changeset
1698 case BUILT_IN_TM_LOG_DOUBLE:
kono
parents: 67
diff changeset
1699 case BUILT_IN_TM_LOG_LDOUBLE:
kono
parents: 67
diff changeset
1700 case BUILT_IN_TM_LOG_M64:
kono
parents: 67
diff changeset
1701 case BUILT_IN_TM_LOG_M128:
kono
parents: 67
diff changeset
1702 case BUILT_IN_TM_LOG_M256:
kono
parents: 67
diff changeset
1703 return ptr_deref_may_alias_ref_p_1 (gimple_call_arg (call, 0), ref);
kono
parents: 67
diff changeset
1704
kono
parents: 67
diff changeset
1705 /* These read memory pointed to by the first argument. */
kono
parents: 67
diff changeset
1706 case BUILT_IN_STRDUP:
kono
parents: 67
diff changeset
1707 case BUILT_IN_STRNDUP:
kono
parents: 67
diff changeset
1708 case BUILT_IN_REALLOC:
kono
parents: 67
diff changeset
1709 {
kono
parents: 67
diff changeset
1710 ao_ref dref;
kono
parents: 67
diff changeset
1711 tree size = NULL_TREE;
kono
parents: 67
diff changeset
1712 if (gimple_call_num_args (call) == 2)
kono
parents: 67
diff changeset
1713 size = gimple_call_arg (call, 1);
kono
parents: 67
diff changeset
1714 ao_ref_init_from_ptr_and_size (&dref,
kono
parents: 67
diff changeset
1715 gimple_call_arg (call, 0),
kono
parents: 67
diff changeset
1716 size);
kono
parents: 67
diff changeset
1717 return refs_may_alias_p_1 (&dref, ref, false);
kono
parents: 67
diff changeset
1718 }
kono
parents: 67
diff changeset
1719 /* These read memory pointed to by the first argument. */
kono
parents: 67
diff changeset
1720 case BUILT_IN_INDEX:
kono
parents: 67
diff changeset
1721 case BUILT_IN_STRCHR:
kono
parents: 67
diff changeset
1722 case BUILT_IN_STRRCHR:
kono
parents: 67
diff changeset
1723 {
kono
parents: 67
diff changeset
1724 ao_ref dref;
kono
parents: 67
diff changeset
1725 ao_ref_init_from_ptr_and_size (&dref,
kono
parents: 67
diff changeset
1726 gimple_call_arg (call, 0),
kono
parents: 67
diff changeset
1727 NULL_TREE);
kono
parents: 67
diff changeset
1728 return refs_may_alias_p_1 (&dref, ref, false);
kono
parents: 67
diff changeset
1729 }
kono
parents: 67
diff changeset
1730 /* These read memory pointed to by the first argument with size
kono
parents: 67
diff changeset
1731 in the third argument. */
kono
parents: 67
diff changeset
1732 case BUILT_IN_MEMCHR:
kono
parents: 67
diff changeset
1733 {
kono
parents: 67
diff changeset
1734 ao_ref dref;
kono
parents: 67
diff changeset
1735 ao_ref_init_from_ptr_and_size (&dref,
kono
parents: 67
diff changeset
1736 gimple_call_arg (call, 0),
kono
parents: 67
diff changeset
1737 gimple_call_arg (call, 2));
kono
parents: 67
diff changeset
1738 return refs_may_alias_p_1 (&dref, ref, false);
kono
parents: 67
diff changeset
1739 }
kono
parents: 67
diff changeset
1740 /* These read memory pointed to by the first and second arguments. */
kono
parents: 67
diff changeset
1741 case BUILT_IN_STRSTR:
kono
parents: 67
diff changeset
1742 case BUILT_IN_STRPBRK:
kono
parents: 67
diff changeset
1743 {
kono
parents: 67
diff changeset
1744 ao_ref dref;
kono
parents: 67
diff changeset
1745 ao_ref_init_from_ptr_and_size (&dref,
kono
parents: 67
diff changeset
1746 gimple_call_arg (call, 0),
kono
parents: 67
diff changeset
1747 NULL_TREE);
kono
parents: 67
diff changeset
1748 if (refs_may_alias_p_1 (&dref, ref, false))
kono
parents: 67
diff changeset
1749 return true;
kono
parents: 67
diff changeset
1750 ao_ref_init_from_ptr_and_size (&dref,
kono
parents: 67
diff changeset
1751 gimple_call_arg (call, 1),
kono
parents: 67
diff changeset
1752 NULL_TREE);
kono
parents: 67
diff changeset
1753 return refs_may_alias_p_1 (&dref, ref, false);
kono
parents: 67
diff changeset
1754 }
kono
parents: 67
diff changeset
1755
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1756 /* The following builtins do not read from memory. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1757 case BUILT_IN_FREE:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1758 case BUILT_IN_MALLOC:
111
kono
parents: 67
diff changeset
1759 case BUILT_IN_POSIX_MEMALIGN:
kono
parents: 67
diff changeset
1760 case BUILT_IN_ALIGNED_ALLOC:
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1761 case BUILT_IN_CALLOC:
111
kono
parents: 67
diff changeset
1762 CASE_BUILT_IN_ALLOCA:
kono
parents: 67
diff changeset
1763 case BUILT_IN_STACK_SAVE:
kono
parents: 67
diff changeset
1764 case BUILT_IN_STACK_RESTORE:
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1765 case BUILT_IN_MEMSET:
111
kono
parents: 67
diff changeset
1766 case BUILT_IN_TM_MEMSET:
kono
parents: 67
diff changeset
1767 case BUILT_IN_MEMSET_CHK:
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1768 case BUILT_IN_FREXP:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1769 case BUILT_IN_FREXPF:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1770 case BUILT_IN_FREXPL:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1771 case BUILT_IN_GAMMA_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1772 case BUILT_IN_GAMMAF_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1773 case BUILT_IN_GAMMAL_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1774 case BUILT_IN_LGAMMA_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1775 case BUILT_IN_LGAMMAF_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1776 case BUILT_IN_LGAMMAL_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1777 case BUILT_IN_MODF:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1778 case BUILT_IN_MODFF:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1779 case BUILT_IN_MODFL:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1780 case BUILT_IN_REMQUO:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1781 case BUILT_IN_REMQUOF:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1782 case BUILT_IN_REMQUOL:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1783 case BUILT_IN_SINCOS:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1784 case BUILT_IN_SINCOSF:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1785 case BUILT_IN_SINCOSL:
111
kono
parents: 67
diff changeset
1786 case BUILT_IN_ASSUME_ALIGNED:
kono
parents: 67
diff changeset
1787 case BUILT_IN_VA_END:
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1788 return false;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1789 /* __sync_* builtins and some OpenMP builtins act as threading
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1790 barriers. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1791 #undef DEF_SYNC_BUILTIN
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1792 #define DEF_SYNC_BUILTIN(ENUM, NAME, TYPE, ATTRS) case ENUM:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1793 #include "sync-builtins.def"
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1794 #undef DEF_SYNC_BUILTIN
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1795 case BUILT_IN_GOMP_ATOMIC_START:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1796 case BUILT_IN_GOMP_ATOMIC_END:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1797 case BUILT_IN_GOMP_BARRIER:
111
kono
parents: 67
diff changeset
1798 case BUILT_IN_GOMP_BARRIER_CANCEL:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1799 case BUILT_IN_GOMP_TASKWAIT:
111
kono
parents: 67
diff changeset
1800 case BUILT_IN_GOMP_TASKGROUP_END:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1801 case BUILT_IN_GOMP_CRITICAL_START:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1802 case BUILT_IN_GOMP_CRITICAL_END:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1803 case BUILT_IN_GOMP_CRITICAL_NAME_START:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1804 case BUILT_IN_GOMP_CRITICAL_NAME_END:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1805 case BUILT_IN_GOMP_LOOP_END:
111
kono
parents: 67
diff changeset
1806 case BUILT_IN_GOMP_LOOP_END_CANCEL:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1807 case BUILT_IN_GOMP_ORDERED_START:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1808 case BUILT_IN_GOMP_ORDERED_END:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1809 case BUILT_IN_GOMP_SECTIONS_END:
111
kono
parents: 67
diff changeset
1810 case BUILT_IN_GOMP_SECTIONS_END_CANCEL:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1811 case BUILT_IN_GOMP_SINGLE_COPY_START:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1812 case BUILT_IN_GOMP_SINGLE_COPY_END:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1813 return true;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1814
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1815 default:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1816 /* Fallthru to general call handling. */;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1817 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1818
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1819 /* Check if base is a global static variable that is not read
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1820 by the function. */
111
kono
parents: 67
diff changeset
1821 if (callee != NULL_TREE && VAR_P (base) && TREE_STATIC (base))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1822 {
111
kono
parents: 67
diff changeset
1823 struct cgraph_node *node = cgraph_node::get (callee);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1824 bitmap not_read;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1825
111
kono
parents: 67
diff changeset
1826 /* FIXME: Callee can be an OMP builtin that does not have a call graph
kono
parents: 67
diff changeset
1827 node yet. We should enforce that there are nodes for all decls in the
kono
parents: 67
diff changeset
1828 IL and remove this check instead. */
kono
parents: 67
diff changeset
1829 if (node
kono
parents: 67
diff changeset
1830 && (not_read = ipa_reference_get_not_read_global (node))
kono
parents: 67
diff changeset
1831 && bitmap_bit_p (not_read, ipa_reference_var_uid (base)))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1832 goto process_args;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1833 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1834
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1835 /* Check if the base variable is call-used. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1836 if (DECL_P (base))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1837 {
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1838 if (pt_solution_includes (gimple_call_use_set (call), base))
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1839 return true;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1840 }
111
kono
parents: 67
diff changeset
1841 else if ((TREE_CODE (base) == MEM_REF
kono
parents: 67
diff changeset
1842 || TREE_CODE (base) == TARGET_MEM_REF)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1843 && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1844 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1845 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0));
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1846 if (!pi)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1847 return true;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1848
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1849 if (pt_solutions_intersect (gimple_call_use_set (call), &pi->pt))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1850 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1851 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1852 else
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1853 return true;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1854
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1855 /* Inspect call arguments for passed-by-value aliases. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1856 process_args:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1857 for (i = 0; i < gimple_call_num_args (call); ++i)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1858 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1859 tree op = gimple_call_arg (call, i);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1860 int flags = gimple_call_arg_flags (call, i);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1861
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1862 if (flags & EAF_UNUSED)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1863 continue;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1864
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1865 if (TREE_CODE (op) == WITH_SIZE_EXPR)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1866 op = TREE_OPERAND (op, 0);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1867
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1868 if (TREE_CODE (op) != SSA_NAME
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1869 && !is_gimple_min_invariant (op))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1870 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1871 ao_ref r;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1872 ao_ref_init (&r, op);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1873 if (refs_may_alias_p_1 (&r, ref, tbaa_p))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1874 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1875 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1876 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1877
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1878 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1879 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1880
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1881 static bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1882 ref_maybe_used_by_call_p (gcall *call, ao_ref *ref, bool tbaa_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1883 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1884 bool res;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1885 res = ref_maybe_used_by_call_p_1 (call, ref, tbaa_p);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1886 if (res)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1887 ++alias_stats.ref_maybe_used_by_call_p_may_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1888 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1889 ++alias_stats.ref_maybe_used_by_call_p_no_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1890 return res;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1891 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1892
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1893
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1894 /* If the statement STMT may use the memory reference REF return
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1895 true, otherwise return false. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1896
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1897 bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1898 ref_maybe_used_by_stmt_p (gimple *stmt, ao_ref *ref, bool tbaa_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1899 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1900 if (is_gimple_assign (stmt))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1901 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1902 tree rhs;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1903
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1904 /* All memory assign statements are single. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1905 if (!gimple_assign_single_p (stmt))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1906 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1907
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1908 rhs = gimple_assign_rhs1 (stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1909 if (is_gimple_reg (rhs)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1910 || is_gimple_min_invariant (rhs)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1911 || gimple_assign_rhs_code (stmt) == CONSTRUCTOR)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1912 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1913
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1914 return refs_may_alias_p (rhs, ref, tbaa_p);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1915 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1916 else if (is_gimple_call (stmt))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1917 return ref_maybe_used_by_call_p (as_a <gcall *> (stmt), ref, tbaa_p);
111
kono
parents: 67
diff changeset
1918 else if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
kono
parents: 67
diff changeset
1919 {
kono
parents: 67
diff changeset
1920 tree retval = gimple_return_retval (return_stmt);
kono
parents: 67
diff changeset
1921 if (retval
kono
parents: 67
diff changeset
1922 && TREE_CODE (retval) != SSA_NAME
kono
parents: 67
diff changeset
1923 && !is_gimple_min_invariant (retval)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1924 && refs_may_alias_p (retval, ref, tbaa_p))
111
kono
parents: 67
diff changeset
1925 return true;
kono
parents: 67
diff changeset
1926 /* If ref escapes the function then the return acts as a use. */
kono
parents: 67
diff changeset
1927 tree base = ao_ref_base (ref);
kono
parents: 67
diff changeset
1928 if (!base)
kono
parents: 67
diff changeset
1929 ;
kono
parents: 67
diff changeset
1930 else if (DECL_P (base))
kono
parents: 67
diff changeset
1931 return is_global_var (base);
kono
parents: 67
diff changeset
1932 else if (TREE_CODE (base) == MEM_REF
kono
parents: 67
diff changeset
1933 || TREE_CODE (base) == TARGET_MEM_REF)
kono
parents: 67
diff changeset
1934 return ptr_deref_may_alias_global_p (TREE_OPERAND (base, 0));
kono
parents: 67
diff changeset
1935 return false;
kono
parents: 67
diff changeset
1936 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1937
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1938 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1939 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1940
111
kono
parents: 67
diff changeset
1941 bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1942 ref_maybe_used_by_stmt_p (gimple *stmt, tree ref, bool tbaa_p)
111
kono
parents: 67
diff changeset
1943 {
kono
parents: 67
diff changeset
1944 ao_ref r;
kono
parents: 67
diff changeset
1945 ao_ref_init (&r, ref);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1946 return ref_maybe_used_by_stmt_p (stmt, &r, tbaa_p);
111
kono
parents: 67
diff changeset
1947 }
kono
parents: 67
diff changeset
1948
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1949 /* If the call in statement CALL may clobber the memory reference REF
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1950 return true, otherwise return false. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1951
111
kono
parents: 67
diff changeset
1952 bool
kono
parents: 67
diff changeset
1953 call_may_clobber_ref_p_1 (gcall *call, ao_ref *ref)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1954 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1955 tree base;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1956 tree callee;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1957
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1958 /* If the call is pure or const it cannot clobber anything. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1959 if (gimple_call_flags (call)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1960 & (ECF_PURE|ECF_CONST|ECF_LOOPING_CONST_OR_PURE|ECF_NOVOPS))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1961 return false;
111
kono
parents: 67
diff changeset
1962 if (gimple_call_internal_p (call))
kono
parents: 67
diff changeset
1963 switch (gimple_call_internal_fn (call))
kono
parents: 67
diff changeset
1964 {
kono
parents: 67
diff changeset
1965 /* Treat these internal calls like ECF_PURE for aliasing,
kono
parents: 67
diff changeset
1966 they don't write to any memory the program should care about.
kono
parents: 67
diff changeset
1967 They have important other side-effects, and read memory,
kono
parents: 67
diff changeset
1968 so can't be ECF_NOVOPS. */
kono
parents: 67
diff changeset
1969 case IFN_UBSAN_NULL:
kono
parents: 67
diff changeset
1970 case IFN_UBSAN_BOUNDS:
kono
parents: 67
diff changeset
1971 case IFN_UBSAN_VPTR:
kono
parents: 67
diff changeset
1972 case IFN_UBSAN_OBJECT_SIZE:
kono
parents: 67
diff changeset
1973 case IFN_UBSAN_PTR:
kono
parents: 67
diff changeset
1974 case IFN_ASAN_CHECK:
kono
parents: 67
diff changeset
1975 return false;
kono
parents: 67
diff changeset
1976 default:
kono
parents: 67
diff changeset
1977 break;
kono
parents: 67
diff changeset
1978 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1979
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1980 base = ao_ref_base (ref);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1981 if (!base)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1982 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1983
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1984 if (TREE_CODE (base) == SSA_NAME
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1985 || CONSTANT_CLASS_P (base))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1986 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1987
111
kono
parents: 67
diff changeset
1988 /* A call that is not without side-effects might involve volatile
kono
parents: 67
diff changeset
1989 accesses and thus conflicts with all other volatile accesses. */
kono
parents: 67
diff changeset
1990 if (ref->volatile_p)
kono
parents: 67
diff changeset
1991 return true;
kono
parents: 67
diff changeset
1992
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1993 /* If the reference is based on a decl that is not aliased the call
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1994 cannot possibly clobber it. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1995 if (DECL_P (base)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1996 && !may_be_aliased (base)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1997 /* But local non-readonly statics can be modified through recursion
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1998 or the call may implement a threading barrier which we must
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
1999 treat as may-def. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2000 && (TREE_READONLY (base)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2001 || !is_global_var (base)))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2002 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2003
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2004 /* If the reference is based on a pointer that points to memory
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2005 that may not be written to then the call cannot possibly clobber it. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2006 if ((TREE_CODE (base) == MEM_REF
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2007 || TREE_CODE (base) == TARGET_MEM_REF)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2008 && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2009 && SSA_NAME_POINTS_TO_READONLY_MEMORY (TREE_OPERAND (base, 0)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2010 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2011
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2012 callee = gimple_call_fndecl (call);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2013
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2014 /* Handle those builtin functions explicitly that do not act as
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2015 escape points. See tree-ssa-structalias.c:find_func_aliases
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2016 for the list of builtins we might need to handle here. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2017 if (callee != NULL_TREE
111
kono
parents: 67
diff changeset
2018 && gimple_call_builtin_p (call, BUILT_IN_NORMAL))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2019 switch (DECL_FUNCTION_CODE (callee))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2020 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2021 /* All the following functions clobber memory pointed to by
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2022 their first argument. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2023 case BUILT_IN_STRCPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2024 case BUILT_IN_STRNCPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2025 case BUILT_IN_MEMCPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2026 case BUILT_IN_MEMMOVE:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2027 case BUILT_IN_MEMPCPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2028 case BUILT_IN_STPCPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2029 case BUILT_IN_STPNCPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2030 case BUILT_IN_STRCAT:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2031 case BUILT_IN_STRNCAT:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2032 case BUILT_IN_MEMSET:
111
kono
parents: 67
diff changeset
2033 case BUILT_IN_TM_MEMSET:
kono
parents: 67
diff changeset
2034 CASE_BUILT_IN_TM_STORE (1):
kono
parents: 67
diff changeset
2035 CASE_BUILT_IN_TM_STORE (2):
kono
parents: 67
diff changeset
2036 CASE_BUILT_IN_TM_STORE (4):
kono
parents: 67
diff changeset
2037 CASE_BUILT_IN_TM_STORE (8):
kono
parents: 67
diff changeset
2038 CASE_BUILT_IN_TM_STORE (FLOAT):
kono
parents: 67
diff changeset
2039 CASE_BUILT_IN_TM_STORE (DOUBLE):
kono
parents: 67
diff changeset
2040 CASE_BUILT_IN_TM_STORE (LDOUBLE):
kono
parents: 67
diff changeset
2041 CASE_BUILT_IN_TM_STORE (M64):
kono
parents: 67
diff changeset
2042 CASE_BUILT_IN_TM_STORE (M128):
kono
parents: 67
diff changeset
2043 CASE_BUILT_IN_TM_STORE (M256):
kono
parents: 67
diff changeset
2044 case BUILT_IN_TM_MEMCPY:
kono
parents: 67
diff changeset
2045 case BUILT_IN_TM_MEMMOVE:
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2046 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2047 ao_ref dref;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2048 tree size = NULL_TREE;
111
kono
parents: 67
diff changeset
2049 /* Don't pass in size for strncat, as the maximum size
kono
parents: 67
diff changeset
2050 is strlen (dest) + n + 1 instead of n, resp.
kono
parents: 67
diff changeset
2051 n + 1 at dest + strlen (dest), but strlen (dest) isn't
kono
parents: 67
diff changeset
2052 known. */
kono
parents: 67
diff changeset
2053 if (gimple_call_num_args (call) == 3
kono
parents: 67
diff changeset
2054 && DECL_FUNCTION_CODE (callee) != BUILT_IN_STRNCAT)
kono
parents: 67
diff changeset
2055 size = gimple_call_arg (call, 2);
kono
parents: 67
diff changeset
2056 ao_ref_init_from_ptr_and_size (&dref,
kono
parents: 67
diff changeset
2057 gimple_call_arg (call, 0),
kono
parents: 67
diff changeset
2058 size);
kono
parents: 67
diff changeset
2059 return refs_may_alias_p_1 (&dref, ref, false);
kono
parents: 67
diff changeset
2060 }
kono
parents: 67
diff changeset
2061 case BUILT_IN_STRCPY_CHK:
kono
parents: 67
diff changeset
2062 case BUILT_IN_STRNCPY_CHK:
kono
parents: 67
diff changeset
2063 case BUILT_IN_MEMCPY_CHK:
kono
parents: 67
diff changeset
2064 case BUILT_IN_MEMMOVE_CHK:
kono
parents: 67
diff changeset
2065 case BUILT_IN_MEMPCPY_CHK:
kono
parents: 67
diff changeset
2066 case BUILT_IN_STPCPY_CHK:
kono
parents: 67
diff changeset
2067 case BUILT_IN_STPNCPY_CHK:
kono
parents: 67
diff changeset
2068 case BUILT_IN_STRCAT_CHK:
kono
parents: 67
diff changeset
2069 case BUILT_IN_STRNCAT_CHK:
kono
parents: 67
diff changeset
2070 case BUILT_IN_MEMSET_CHK:
kono
parents: 67
diff changeset
2071 {
kono
parents: 67
diff changeset
2072 ao_ref dref;
kono
parents: 67
diff changeset
2073 tree size = NULL_TREE;
kono
parents: 67
diff changeset
2074 /* Don't pass in size for __strncat_chk, as the maximum size
kono
parents: 67
diff changeset
2075 is strlen (dest) + n + 1 instead of n, resp.
kono
parents: 67
diff changeset
2076 n + 1 at dest + strlen (dest), but strlen (dest) isn't
kono
parents: 67
diff changeset
2077 known. */
kono
parents: 67
diff changeset
2078 if (gimple_call_num_args (call) == 4
kono
parents: 67
diff changeset
2079 && DECL_FUNCTION_CODE (callee) != BUILT_IN_STRNCAT_CHK)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2080 size = gimple_call_arg (call, 2);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2081 ao_ref_init_from_ptr_and_size (&dref,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2082 gimple_call_arg (call, 0),
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2083 size);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2084 return refs_may_alias_p_1 (&dref, ref, false);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2085 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2086 case BUILT_IN_BCOPY:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2087 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2088 ao_ref dref;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2089 tree size = gimple_call_arg (call, 2);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2090 ao_ref_init_from_ptr_and_size (&dref,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2091 gimple_call_arg (call, 1),
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2092 size);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2093 return refs_may_alias_p_1 (&dref, ref, false);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2094 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2095 /* Allocating memory does not have any side-effects apart from
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2096 being the definition point for the pointer. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2097 case BUILT_IN_MALLOC:
111
kono
parents: 67
diff changeset
2098 case BUILT_IN_ALIGNED_ALLOC:
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2099 case BUILT_IN_CALLOC:
111
kono
parents: 67
diff changeset
2100 case BUILT_IN_STRDUP:
kono
parents: 67
diff changeset
2101 case BUILT_IN_STRNDUP:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2102 /* Unix98 specifies that errno is set on allocation failure. */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2103 if (flag_errno_math
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2104 && targetm.ref_may_alias_errno (ref))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2105 return true;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2106 return false;
111
kono
parents: 67
diff changeset
2107 case BUILT_IN_STACK_SAVE:
kono
parents: 67
diff changeset
2108 CASE_BUILT_IN_ALLOCA:
kono
parents: 67
diff changeset
2109 case BUILT_IN_ASSUME_ALIGNED:
kono
parents: 67
diff changeset
2110 return false;
kono
parents: 67
diff changeset
2111 /* But posix_memalign stores a pointer into the memory pointed to
kono
parents: 67
diff changeset
2112 by its first argument. */
kono
parents: 67
diff changeset
2113 case BUILT_IN_POSIX_MEMALIGN:
kono
parents: 67
diff changeset
2114 {
kono
parents: 67
diff changeset
2115 tree ptrptr = gimple_call_arg (call, 0);
kono
parents: 67
diff changeset
2116 ao_ref dref;
kono
parents: 67
diff changeset
2117 ao_ref_init_from_ptr_and_size (&dref, ptrptr,
kono
parents: 67
diff changeset
2118 TYPE_SIZE_UNIT (ptr_type_node));
kono
parents: 67
diff changeset
2119 return (refs_may_alias_p_1 (&dref, ref, false)
kono
parents: 67
diff changeset
2120 || (flag_errno_math
kono
parents: 67
diff changeset
2121 && targetm.ref_may_alias_errno (ref)));
kono
parents: 67
diff changeset
2122 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2123 /* Freeing memory kills the pointed-to memory. More importantly
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2124 the call has to serve as a barrier for moving loads and stores
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2125 across it. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2126 case BUILT_IN_FREE:
111
kono
parents: 67
diff changeset
2127 case BUILT_IN_VA_END:
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2128 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2129 tree ptr = gimple_call_arg (call, 0);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2130 return ptr_deref_may_alias_ref_p_1 (ptr, ref);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2131 }
111
kono
parents: 67
diff changeset
2132 /* Realloc serves both as allocation point and deallocation point. */
kono
parents: 67
diff changeset
2133 case BUILT_IN_REALLOC:
kono
parents: 67
diff changeset
2134 {
kono
parents: 67
diff changeset
2135 tree ptr = gimple_call_arg (call, 0);
kono
parents: 67
diff changeset
2136 /* Unix98 specifies that errno is set on allocation failure. */
kono
parents: 67
diff changeset
2137 return ((flag_errno_math
kono
parents: 67
diff changeset
2138 && targetm.ref_may_alias_errno (ref))
kono
parents: 67
diff changeset
2139 || ptr_deref_may_alias_ref_p_1 (ptr, ref));
kono
parents: 67
diff changeset
2140 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2141 case BUILT_IN_GAMMA_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2142 case BUILT_IN_GAMMAF_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2143 case BUILT_IN_GAMMAL_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2144 case BUILT_IN_LGAMMA_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2145 case BUILT_IN_LGAMMAF_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2146 case BUILT_IN_LGAMMAL_R:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2147 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2148 tree out = gimple_call_arg (call, 1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2149 if (ptr_deref_may_alias_ref_p_1 (out, ref))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2150 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2151 if (flag_errno_math)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2152 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2153 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2154 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2155 case BUILT_IN_FREXP:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2156 case BUILT_IN_FREXPF:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2157 case BUILT_IN_FREXPL:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2158 case BUILT_IN_MODF:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2159 case BUILT_IN_MODFF:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2160 case BUILT_IN_MODFL:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2161 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2162 tree out = gimple_call_arg (call, 1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2163 return ptr_deref_may_alias_ref_p_1 (out, ref);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2164 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2165 case BUILT_IN_REMQUO:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2166 case BUILT_IN_REMQUOF:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2167 case BUILT_IN_REMQUOL:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2168 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2169 tree out = gimple_call_arg (call, 2);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2170 if (ptr_deref_may_alias_ref_p_1 (out, ref))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2171 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2172 if (flag_errno_math)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2173 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2174 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2175 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2176 case BUILT_IN_SINCOS:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2177 case BUILT_IN_SINCOSF:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2178 case BUILT_IN_SINCOSL:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2179 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2180 tree sin = gimple_call_arg (call, 1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2181 tree cos = gimple_call_arg (call, 2);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2182 return (ptr_deref_may_alias_ref_p_1 (sin, ref)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2183 || ptr_deref_may_alias_ref_p_1 (cos, ref));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2184 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2185 /* __sync_* builtins and some OpenMP builtins act as threading
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2186 barriers. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2187 #undef DEF_SYNC_BUILTIN
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2188 #define DEF_SYNC_BUILTIN(ENUM, NAME, TYPE, ATTRS) case ENUM:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2189 #include "sync-builtins.def"
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2190 #undef DEF_SYNC_BUILTIN
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2191 case BUILT_IN_GOMP_ATOMIC_START:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2192 case BUILT_IN_GOMP_ATOMIC_END:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2193 case BUILT_IN_GOMP_BARRIER:
111
kono
parents: 67
diff changeset
2194 case BUILT_IN_GOMP_BARRIER_CANCEL:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2195 case BUILT_IN_GOMP_TASKWAIT:
111
kono
parents: 67
diff changeset
2196 case BUILT_IN_GOMP_TASKGROUP_END:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2197 case BUILT_IN_GOMP_CRITICAL_START:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2198 case BUILT_IN_GOMP_CRITICAL_END:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2199 case BUILT_IN_GOMP_CRITICAL_NAME_START:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2200 case BUILT_IN_GOMP_CRITICAL_NAME_END:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2201 case BUILT_IN_GOMP_LOOP_END:
111
kono
parents: 67
diff changeset
2202 case BUILT_IN_GOMP_LOOP_END_CANCEL:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2203 case BUILT_IN_GOMP_ORDERED_START:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2204 case BUILT_IN_GOMP_ORDERED_END:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2205 case BUILT_IN_GOMP_SECTIONS_END:
111
kono
parents: 67
diff changeset
2206 case BUILT_IN_GOMP_SECTIONS_END_CANCEL:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2207 case BUILT_IN_GOMP_SINGLE_COPY_START:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2208 case BUILT_IN_GOMP_SINGLE_COPY_END:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2209 return true;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2210 default:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2211 /* Fallthru to general call handling. */;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2212 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2213
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2214 /* Check if base is a global static variable that is not written
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2215 by the function. */
111
kono
parents: 67
diff changeset
2216 if (callee != NULL_TREE && VAR_P (base) && TREE_STATIC (base))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2217 {
111
kono
parents: 67
diff changeset
2218 struct cgraph_node *node = cgraph_node::get (callee);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2219 bitmap not_written;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2220
111
kono
parents: 67
diff changeset
2221 if (node
kono
parents: 67
diff changeset
2222 && (not_written = ipa_reference_get_not_written_global (node))
kono
parents: 67
diff changeset
2223 && bitmap_bit_p (not_written, ipa_reference_var_uid (base)))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2224 return false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2225 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2226
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2227 /* Check if the base variable is call-clobbered. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2228 if (DECL_P (base))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2229 return pt_solution_includes (gimple_call_clobber_set (call), base);
111
kono
parents: 67
diff changeset
2230 else if ((TREE_CODE (base) == MEM_REF
kono
parents: 67
diff changeset
2231 || TREE_CODE (base) == TARGET_MEM_REF)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2232 && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2233 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2234 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2235 if (!pi)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2236 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2237
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2238 return pt_solutions_intersect (gimple_call_clobber_set (call), &pi->pt);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2239 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2240
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2241 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2242 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2243
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2244 /* If the call in statement CALL may clobber the memory reference REF
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2245 return true, otherwise return false. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2246
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2247 bool
111
kono
parents: 67
diff changeset
2248 call_may_clobber_ref_p (gcall *call, tree ref)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2249 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2250 bool res;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2251 ao_ref r;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2252 ao_ref_init (&r, ref);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2253 res = call_may_clobber_ref_p_1 (call, &r);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2254 if (res)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2255 ++alias_stats.call_may_clobber_ref_p_may_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2256 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2257 ++alias_stats.call_may_clobber_ref_p_no_alias;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2258 return res;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2259 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2260
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2261
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2262 /* If the statement STMT may clobber the memory reference REF return true,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2263 otherwise return false. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2264
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2265 bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2266 stmt_may_clobber_ref_p_1 (gimple *stmt, ao_ref *ref, bool tbaa_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2267 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2268 if (is_gimple_call (stmt))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2269 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2270 tree lhs = gimple_call_lhs (stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2271 if (lhs
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2272 && TREE_CODE (lhs) != SSA_NAME)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2273 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2274 ao_ref r;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2275 ao_ref_init (&r, lhs);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2276 if (refs_may_alias_p_1 (ref, &r, tbaa_p))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2277 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2278 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2279
111
kono
parents: 67
diff changeset
2280 return call_may_clobber_ref_p_1 (as_a <gcall *> (stmt), ref);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2281 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2282 else if (gimple_assign_single_p (stmt))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2283 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2284 tree lhs = gimple_assign_lhs (stmt);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2285 if (TREE_CODE (lhs) != SSA_NAME)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2286 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2287 ao_ref r;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2288 ao_ref_init (&r, lhs);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2289 return refs_may_alias_p_1 (ref, &r, tbaa_p);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2290 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2291 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2292 else if (gimple_code (stmt) == GIMPLE_ASM)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2293 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2294
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2295 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2296 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2297
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2298 bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2299 stmt_may_clobber_ref_p (gimple *stmt, tree ref, bool tbaa_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2300 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2301 ao_ref r;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2302 ao_ref_init (&r, ref);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2303 return stmt_may_clobber_ref_p_1 (stmt, &r, tbaa_p);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2304 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2305
111
kono
parents: 67
diff changeset
2306 /* Return true if store1 and store2 described by corresponding tuples
kono
parents: 67
diff changeset
2307 <BASE, OFFSET, SIZE, MAX_SIZE> have the same size and store to the same
kono
parents: 67
diff changeset
2308 address. */
kono
parents: 67
diff changeset
2309
kono
parents: 67
diff changeset
2310 static bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2311 same_addr_size_stores_p (tree base1, poly_int64 offset1, poly_int64 size1,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2312 poly_int64 max_size1,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2313 tree base2, poly_int64 offset2, poly_int64 size2,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2314 poly_int64 max_size2)
111
kono
parents: 67
diff changeset
2315 {
kono
parents: 67
diff changeset
2316 /* Offsets need to be 0. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2317 if (maybe_ne (offset1, 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2318 || maybe_ne (offset2, 0))
111
kono
parents: 67
diff changeset
2319 return false;
kono
parents: 67
diff changeset
2320
kono
parents: 67
diff changeset
2321 bool base1_obj_p = SSA_VAR_P (base1);
kono
parents: 67
diff changeset
2322 bool base2_obj_p = SSA_VAR_P (base2);
kono
parents: 67
diff changeset
2323
kono
parents: 67
diff changeset
2324 /* We need one object. */
kono
parents: 67
diff changeset
2325 if (base1_obj_p == base2_obj_p)
kono
parents: 67
diff changeset
2326 return false;
kono
parents: 67
diff changeset
2327 tree obj = base1_obj_p ? base1 : base2;
kono
parents: 67
diff changeset
2328
kono
parents: 67
diff changeset
2329 /* And we need one MEM_REF. */
kono
parents: 67
diff changeset
2330 bool base1_memref_p = TREE_CODE (base1) == MEM_REF;
kono
parents: 67
diff changeset
2331 bool base2_memref_p = TREE_CODE (base2) == MEM_REF;
kono
parents: 67
diff changeset
2332 if (base1_memref_p == base2_memref_p)
kono
parents: 67
diff changeset
2333 return false;
kono
parents: 67
diff changeset
2334 tree memref = base1_memref_p ? base1 : base2;
kono
parents: 67
diff changeset
2335
kono
parents: 67
diff changeset
2336 /* Sizes need to be valid. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2337 if (!known_size_p (max_size1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2338 || !known_size_p (max_size2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2339 || !known_size_p (size1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2340 || !known_size_p (size2))
111
kono
parents: 67
diff changeset
2341 return false;
kono
parents: 67
diff changeset
2342
kono
parents: 67
diff changeset
2343 /* Max_size needs to match size. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2344 if (maybe_ne (max_size1, size1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2345 || maybe_ne (max_size2, size2))
111
kono
parents: 67
diff changeset
2346 return false;
kono
parents: 67
diff changeset
2347
kono
parents: 67
diff changeset
2348 /* Sizes need to match. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2349 if (maybe_ne (size1, size2))
111
kono
parents: 67
diff changeset
2350 return false;
kono
parents: 67
diff changeset
2351
kono
parents: 67
diff changeset
2352
kono
parents: 67
diff changeset
2353 /* Check that memref is a store to pointer with singleton points-to info. */
kono
parents: 67
diff changeset
2354 if (!integer_zerop (TREE_OPERAND (memref, 1)))
kono
parents: 67
diff changeset
2355 return false;
kono
parents: 67
diff changeset
2356 tree ptr = TREE_OPERAND (memref, 0);
kono
parents: 67
diff changeset
2357 if (TREE_CODE (ptr) != SSA_NAME)
kono
parents: 67
diff changeset
2358 return false;
kono
parents: 67
diff changeset
2359 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
kono
parents: 67
diff changeset
2360 unsigned int pt_uid;
kono
parents: 67
diff changeset
2361 if (pi == NULL
kono
parents: 67
diff changeset
2362 || !pt_solution_singleton_or_null_p (&pi->pt, &pt_uid))
kono
parents: 67
diff changeset
2363 return false;
kono
parents: 67
diff changeset
2364
kono
parents: 67
diff changeset
2365 /* Be conservative with non-call exceptions when the address might
kono
parents: 67
diff changeset
2366 be NULL. */
kono
parents: 67
diff changeset
2367 if (flag_non_call_exceptions && pi->pt.null)
kono
parents: 67
diff changeset
2368 return false;
kono
parents: 67
diff changeset
2369
kono
parents: 67
diff changeset
2370 /* Check that ptr points relative to obj. */
kono
parents: 67
diff changeset
2371 unsigned int obj_uid = DECL_PT_UID (obj);
kono
parents: 67
diff changeset
2372 if (obj_uid != pt_uid)
kono
parents: 67
diff changeset
2373 return false;
kono
parents: 67
diff changeset
2374
kono
parents: 67
diff changeset
2375 /* Check that the object size is the same as the store size. That ensures us
kono
parents: 67
diff changeset
2376 that ptr points to the start of obj. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2377 return (DECL_SIZE (obj)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2378 && poly_int_tree_p (DECL_SIZE (obj))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2379 && known_eq (wi::to_poly_offset (DECL_SIZE (obj)), size1));
111
kono
parents: 67
diff changeset
2380 }
kono
parents: 67
diff changeset
2381
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2382 /* If STMT kills the memory reference REF return true, otherwise
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2383 return false. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2384
111
kono
parents: 67
diff changeset
2385 bool
kono
parents: 67
diff changeset
2386 stmt_kills_ref_p (gimple *stmt, ao_ref *ref)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2387 {
111
kono
parents: 67
diff changeset
2388 if (!ao_ref_base (ref))
kono
parents: 67
diff changeset
2389 return false;
kono
parents: 67
diff changeset
2390
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2391 if (gimple_has_lhs (stmt)
111
kono
parents: 67
diff changeset
2392 && TREE_CODE (gimple_get_lhs (stmt)) != SSA_NAME
kono
parents: 67
diff changeset
2393 /* The assignment is not necessarily carried out if it can throw
kono
parents: 67
diff changeset
2394 and we can catch it in the current function where we could inspect
kono
parents: 67
diff changeset
2395 the previous value.
kono
parents: 67
diff changeset
2396 ??? We only need to care about the RHS throwing. For aggregate
kono
parents: 67
diff changeset
2397 assignments or similar calls and non-call exceptions the LHS
kono
parents: 67
diff changeset
2398 might throw as well. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2399 && !stmt_can_throw_internal (cfun, stmt))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2400 {
111
kono
parents: 67
diff changeset
2401 tree lhs = gimple_get_lhs (stmt);
kono
parents: 67
diff changeset
2402 /* If LHS is literally a base of the access we are done. */
kono
parents: 67
diff changeset
2403 if (ref->ref)
kono
parents: 67
diff changeset
2404 {
kono
parents: 67
diff changeset
2405 tree base = ref->ref;
kono
parents: 67
diff changeset
2406 tree innermost_dropped_array_ref = NULL_TREE;
kono
parents: 67
diff changeset
2407 if (handled_component_p (base))
kono
parents: 67
diff changeset
2408 {
kono
parents: 67
diff changeset
2409 tree saved_lhs0 = NULL_TREE;
kono
parents: 67
diff changeset
2410 if (handled_component_p (lhs))
kono
parents: 67
diff changeset
2411 {
kono
parents: 67
diff changeset
2412 saved_lhs0 = TREE_OPERAND (lhs, 0);
kono
parents: 67
diff changeset
2413 TREE_OPERAND (lhs, 0) = integer_zero_node;
kono
parents: 67
diff changeset
2414 }
kono
parents: 67
diff changeset
2415 do
kono
parents: 67
diff changeset
2416 {
kono
parents: 67
diff changeset
2417 /* Just compare the outermost handled component, if
kono
parents: 67
diff changeset
2418 they are equal we have found a possible common
kono
parents: 67
diff changeset
2419 base. */
kono
parents: 67
diff changeset
2420 tree saved_base0 = TREE_OPERAND (base, 0);
kono
parents: 67
diff changeset
2421 TREE_OPERAND (base, 0) = integer_zero_node;
kono
parents: 67
diff changeset
2422 bool res = operand_equal_p (lhs, base, 0);
kono
parents: 67
diff changeset
2423 TREE_OPERAND (base, 0) = saved_base0;
kono
parents: 67
diff changeset
2424 if (res)
kono
parents: 67
diff changeset
2425 break;
kono
parents: 67
diff changeset
2426 /* Remember if we drop an array-ref that we need to
kono
parents: 67
diff changeset
2427 double-check not being at struct end. */
kono
parents: 67
diff changeset
2428 if (TREE_CODE (base) == ARRAY_REF
kono
parents: 67
diff changeset
2429 || TREE_CODE (base) == ARRAY_RANGE_REF)
kono
parents: 67
diff changeset
2430 innermost_dropped_array_ref = base;
kono
parents: 67
diff changeset
2431 /* Otherwise drop handled components of the access. */
kono
parents: 67
diff changeset
2432 base = saved_base0;
kono
parents: 67
diff changeset
2433 }
kono
parents: 67
diff changeset
2434 while (handled_component_p (base));
kono
parents: 67
diff changeset
2435 if (saved_lhs0)
kono
parents: 67
diff changeset
2436 TREE_OPERAND (lhs, 0) = saved_lhs0;
kono
parents: 67
diff changeset
2437 }
kono
parents: 67
diff changeset
2438 /* Finally check if the lhs has the same address and size as the
kono
parents: 67
diff changeset
2439 base candidate of the access. Watch out if we have dropped
kono
parents: 67
diff changeset
2440 an array-ref that was at struct end, this means ref->ref may
kono
parents: 67
diff changeset
2441 be outside of the TYPE_SIZE of its base. */
kono
parents: 67
diff changeset
2442 if ((! innermost_dropped_array_ref
kono
parents: 67
diff changeset
2443 || ! array_at_struct_end_p (innermost_dropped_array_ref))
kono
parents: 67
diff changeset
2444 && (lhs == base
kono
parents: 67
diff changeset
2445 || (((TYPE_SIZE (TREE_TYPE (lhs))
kono
parents: 67
diff changeset
2446 == TYPE_SIZE (TREE_TYPE (base)))
kono
parents: 67
diff changeset
2447 || (TYPE_SIZE (TREE_TYPE (lhs))
kono
parents: 67
diff changeset
2448 && TYPE_SIZE (TREE_TYPE (base))
kono
parents: 67
diff changeset
2449 && operand_equal_p (TYPE_SIZE (TREE_TYPE (lhs)),
kono
parents: 67
diff changeset
2450 TYPE_SIZE (TREE_TYPE (base)),
kono
parents: 67
diff changeset
2451 0)))
kono
parents: 67
diff changeset
2452 && operand_equal_p (lhs, base,
kono
parents: 67
diff changeset
2453 OEP_ADDRESS_OF
kono
parents: 67
diff changeset
2454 | OEP_MATCH_SIDE_EFFECTS))))
kono
parents: 67
diff changeset
2455 return true;
kono
parents: 67
diff changeset
2456 }
kono
parents: 67
diff changeset
2457
kono
parents: 67
diff changeset
2458 /* Now look for non-literal equal bases with the restriction of
kono
parents: 67
diff changeset
2459 handling constant offset and size. */
kono
parents: 67
diff changeset
2460 /* For a must-alias check we need to be able to constrain
kono
parents: 67
diff changeset
2461 the access properly. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2462 if (!ref->max_size_known_p ())
111
kono
parents: 67
diff changeset
2463 return false;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2464 poly_int64 size, offset, max_size, ref_offset = ref->offset;
111
kono
parents: 67
diff changeset
2465 bool reverse;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2466 tree base = get_ref_base_and_extent (lhs, &offset, &size, &max_size,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2467 &reverse);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2468 /* We can get MEM[symbol: sZ, index: D.8862_1] here,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2469 so base == ref->base does not always hold. */
111
kono
parents: 67
diff changeset
2470 if (base != ref->base)
kono
parents: 67
diff changeset
2471 {
kono
parents: 67
diff changeset
2472 /* Try using points-to info. */
kono
parents: 67
diff changeset
2473 if (same_addr_size_stores_p (base, offset, size, max_size, ref->base,
kono
parents: 67
diff changeset
2474 ref->offset, ref->size, ref->max_size))
kono
parents: 67
diff changeset
2475 return true;
kono
parents: 67
diff changeset
2476
kono
parents: 67
diff changeset
2477 /* If both base and ref->base are MEM_REFs, only compare the
kono
parents: 67
diff changeset
2478 first operand, and if the second operand isn't equal constant,
kono
parents: 67
diff changeset
2479 try to add the offsets into offset and ref_offset. */
kono
parents: 67
diff changeset
2480 if (TREE_CODE (base) == MEM_REF && TREE_CODE (ref->base) == MEM_REF
kono
parents: 67
diff changeset
2481 && TREE_OPERAND (base, 0) == TREE_OPERAND (ref->base, 0))
kono
parents: 67
diff changeset
2482 {
kono
parents: 67
diff changeset
2483 if (!tree_int_cst_equal (TREE_OPERAND (base, 1),
kono
parents: 67
diff changeset
2484 TREE_OPERAND (ref->base, 1)))
kono
parents: 67
diff changeset
2485 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2486 poly_offset_int off1 = mem_ref_offset (base);
111
kono
parents: 67
diff changeset
2487 off1 <<= LOG2_BITS_PER_UNIT;
kono
parents: 67
diff changeset
2488 off1 += offset;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2489 poly_offset_int off2 = mem_ref_offset (ref->base);
111
kono
parents: 67
diff changeset
2490 off2 <<= LOG2_BITS_PER_UNIT;
kono
parents: 67
diff changeset
2491 off2 += ref_offset;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2492 if (!off1.to_shwi (&offset) || !off2.to_shwi (&ref_offset))
111
kono
parents: 67
diff changeset
2493 size = -1;
kono
parents: 67
diff changeset
2494 }
kono
parents: 67
diff changeset
2495 }
kono
parents: 67
diff changeset
2496 else
kono
parents: 67
diff changeset
2497 size = -1;
kono
parents: 67
diff changeset
2498 }
kono
parents: 67
diff changeset
2499 /* For a must-alias check we need to be able to constrain
kono
parents: 67
diff changeset
2500 the access properly. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2501 if (known_eq (size, max_size)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2502 && known_subrange_p (ref_offset, ref->max_size, offset, size))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2503 return true;
111
kono
parents: 67
diff changeset
2504 }
kono
parents: 67
diff changeset
2505
kono
parents: 67
diff changeset
2506 if (is_gimple_call (stmt))
kono
parents: 67
diff changeset
2507 {
kono
parents: 67
diff changeset
2508 tree callee = gimple_call_fndecl (stmt);
kono
parents: 67
diff changeset
2509 if (callee != NULL_TREE
kono
parents: 67
diff changeset
2510 && gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
kono
parents: 67
diff changeset
2511 switch (DECL_FUNCTION_CODE (callee))
kono
parents: 67
diff changeset
2512 {
kono
parents: 67
diff changeset
2513 case BUILT_IN_FREE:
kono
parents: 67
diff changeset
2514 {
kono
parents: 67
diff changeset
2515 tree ptr = gimple_call_arg (stmt, 0);
kono
parents: 67
diff changeset
2516 tree base = ao_ref_base (ref);
kono
parents: 67
diff changeset
2517 if (base && TREE_CODE (base) == MEM_REF
kono
parents: 67
diff changeset
2518 && TREE_OPERAND (base, 0) == ptr)
kono
parents: 67
diff changeset
2519 return true;
kono
parents: 67
diff changeset
2520 break;
kono
parents: 67
diff changeset
2521 }
kono
parents: 67
diff changeset
2522
kono
parents: 67
diff changeset
2523 case BUILT_IN_MEMCPY:
kono
parents: 67
diff changeset
2524 case BUILT_IN_MEMPCPY:
kono
parents: 67
diff changeset
2525 case BUILT_IN_MEMMOVE:
kono
parents: 67
diff changeset
2526 case BUILT_IN_MEMSET:
kono
parents: 67
diff changeset
2527 case BUILT_IN_MEMCPY_CHK:
kono
parents: 67
diff changeset
2528 case BUILT_IN_MEMPCPY_CHK:
kono
parents: 67
diff changeset
2529 case BUILT_IN_MEMMOVE_CHK:
kono
parents: 67
diff changeset
2530 case BUILT_IN_MEMSET_CHK:
kono
parents: 67
diff changeset
2531 case BUILT_IN_STRNCPY:
kono
parents: 67
diff changeset
2532 case BUILT_IN_STPNCPY:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2533 {
111
kono
parents: 67
diff changeset
2534 /* For a must-alias check we need to be able to constrain
kono
parents: 67
diff changeset
2535 the access properly. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2536 if (!ref->max_size_known_p ())
111
kono
parents: 67
diff changeset
2537 return false;
kono
parents: 67
diff changeset
2538 tree dest = gimple_call_arg (stmt, 0);
kono
parents: 67
diff changeset
2539 tree len = gimple_call_arg (stmt, 2);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2540 if (!poly_int_tree_p (len))
111
kono
parents: 67
diff changeset
2541 return false;
kono
parents: 67
diff changeset
2542 tree rbase = ref->base;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2543 poly_offset_int roffset = ref->offset;
111
kono
parents: 67
diff changeset
2544 ao_ref dref;
kono
parents: 67
diff changeset
2545 ao_ref_init_from_ptr_and_size (&dref, dest, len);
kono
parents: 67
diff changeset
2546 tree base = ao_ref_base (&dref);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2547 poly_offset_int offset = dref.offset;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2548 if (!base || !known_size_p (dref.size))
111
kono
parents: 67
diff changeset
2549 return false;
kono
parents: 67
diff changeset
2550 if (TREE_CODE (base) == MEM_REF)
kono
parents: 67
diff changeset
2551 {
kono
parents: 67
diff changeset
2552 if (TREE_CODE (rbase) != MEM_REF)
kono
parents: 67
diff changeset
2553 return false;
kono
parents: 67
diff changeset
2554 // Compare pointers.
kono
parents: 67
diff changeset
2555 offset += mem_ref_offset (base) << LOG2_BITS_PER_UNIT;
kono
parents: 67
diff changeset
2556 roffset += mem_ref_offset (rbase) << LOG2_BITS_PER_UNIT;
kono
parents: 67
diff changeset
2557 base = TREE_OPERAND (base, 0);
kono
parents: 67
diff changeset
2558 rbase = TREE_OPERAND (rbase, 0);
kono
parents: 67
diff changeset
2559 }
kono
parents: 67
diff changeset
2560 if (base == rbase
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2561 && known_subrange_p (roffset, ref->max_size, offset,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2562 wi::to_poly_offset (len)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2563 << LOG2_BITS_PER_UNIT))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2564 return true;
111
kono
parents: 67
diff changeset
2565 break;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2566 }
111
kono
parents: 67
diff changeset
2567
kono
parents: 67
diff changeset
2568 case BUILT_IN_VA_END:
kono
parents: 67
diff changeset
2569 {
kono
parents: 67
diff changeset
2570 tree ptr = gimple_call_arg (stmt, 0);
kono
parents: 67
diff changeset
2571 if (TREE_CODE (ptr) == ADDR_EXPR)
kono
parents: 67
diff changeset
2572 {
kono
parents: 67
diff changeset
2573 tree base = ao_ref_base (ref);
kono
parents: 67
diff changeset
2574 if (TREE_OPERAND (ptr, 0) == base)
kono
parents: 67
diff changeset
2575 return true;
kono
parents: 67
diff changeset
2576 }
kono
parents: 67
diff changeset
2577 break;
kono
parents: 67
diff changeset
2578 }
kono
parents: 67
diff changeset
2579
kono
parents: 67
diff changeset
2580 default:;
kono
parents: 67
diff changeset
2581 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2582 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2583 return false;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2584 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2585
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2586 bool
111
kono
parents: 67
diff changeset
2587 stmt_kills_ref_p (gimple *stmt, tree ref)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2588 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2589 ao_ref r;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2590 ao_ref_init (&r, ref);
111
kono
parents: 67
diff changeset
2591 return stmt_kills_ref_p (stmt, &r);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2592 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2593
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2594
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2595 /* Walk the virtual use-def chain of VUSE until hitting the virtual operand
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2596 TARGET or a statement clobbering the memory reference REF in which
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2597 case false is returned. The walk starts with VUSE, one argument of PHI. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2598
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2599 static bool
111
kono
parents: 67
diff changeset
2600 maybe_skip_until (gimple *phi, tree target, ao_ref *ref,
kono
parents: 67
diff changeset
2601 tree vuse, unsigned int *cnt, bitmap *visited,
kono
parents: 67
diff changeset
2602 bool abort_on_visited,
kono
parents: 67
diff changeset
2603 void *(*translate)(ao_ref *, tree, void *, bool *),
kono
parents: 67
diff changeset
2604 void *data)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2605 {
111
kono
parents: 67
diff changeset
2606 basic_block bb = gimple_bb (phi);
kono
parents: 67
diff changeset
2607
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2608 if (!*visited)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2609 *visited = BITMAP_ALLOC (NULL);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2610
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2611 bitmap_set_bit (*visited, SSA_NAME_VERSION (PHI_RESULT (phi)));
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2612
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2613 /* Walk until we hit the target. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2614 while (vuse != target)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2615 {
111
kono
parents: 67
diff changeset
2616 gimple *def_stmt = SSA_NAME_DEF_STMT (vuse);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2617 /* Recurse for PHI nodes. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2618 if (gimple_code (def_stmt) == GIMPLE_PHI)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2619 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2620 /* An already visited PHI node ends the walk successfully. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2621 if (bitmap_bit_p (*visited, SSA_NAME_VERSION (PHI_RESULT (def_stmt))))
111
kono
parents: 67
diff changeset
2622 return !abort_on_visited;
kono
parents: 67
diff changeset
2623 vuse = get_continuation_for_phi (def_stmt, ref, cnt,
kono
parents: 67
diff changeset
2624 visited, abort_on_visited,
kono
parents: 67
diff changeset
2625 translate, data);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2626 if (!vuse)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2627 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2628 continue;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2629 }
111
kono
parents: 67
diff changeset
2630 else if (gimple_nop_p (def_stmt))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2631 return false;
111
kono
parents: 67
diff changeset
2632 else
kono
parents: 67
diff changeset
2633 {
kono
parents: 67
diff changeset
2634 /* A clobbering statement or the end of the IL ends it failing. */
kono
parents: 67
diff changeset
2635 ++*cnt;
kono
parents: 67
diff changeset
2636 if (stmt_may_clobber_ref_p_1 (def_stmt, ref))
kono
parents: 67
diff changeset
2637 {
kono
parents: 67
diff changeset
2638 bool disambiguate_only = true;
kono
parents: 67
diff changeset
2639 if (translate
kono
parents: 67
diff changeset
2640 && (*translate) (ref, vuse, data, &disambiguate_only) == NULL)
kono
parents: 67
diff changeset
2641 ;
kono
parents: 67
diff changeset
2642 else
kono
parents: 67
diff changeset
2643 return false;
kono
parents: 67
diff changeset
2644 }
kono
parents: 67
diff changeset
2645 }
kono
parents: 67
diff changeset
2646 /* If we reach a new basic-block see if we already skipped it
kono
parents: 67
diff changeset
2647 in a previous walk that ended successfully. */
kono
parents: 67
diff changeset
2648 if (gimple_bb (def_stmt) != bb)
kono
parents: 67
diff changeset
2649 {
kono
parents: 67
diff changeset
2650 if (!bitmap_set_bit (*visited, SSA_NAME_VERSION (vuse)))
kono
parents: 67
diff changeset
2651 return !abort_on_visited;
kono
parents: 67
diff changeset
2652 bb = gimple_bb (def_stmt);
kono
parents: 67
diff changeset
2653 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2654 vuse = gimple_vuse (def_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2655 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2656 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2657 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2658
111
kono
parents: 67
diff changeset
2659
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2660 /* Starting from a PHI node for the virtual operand of the memory reference
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2661 REF find a continuation virtual operand that allows to continue walking
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2662 statements dominating PHI skipping only statements that cannot possibly
111
kono
parents: 67
diff changeset
2663 clobber REF. Increments *CNT for each alias disambiguation done.
kono
parents: 67
diff changeset
2664 Returns NULL_TREE if no suitable virtual operand can be found. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2665
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2666 tree
111
kono
parents: 67
diff changeset
2667 get_continuation_for_phi (gimple *phi, ao_ref *ref,
kono
parents: 67
diff changeset
2668 unsigned int *cnt, bitmap *visited,
kono
parents: 67
diff changeset
2669 bool abort_on_visited,
kono
parents: 67
diff changeset
2670 void *(*translate)(ao_ref *, tree, void *, bool *),
kono
parents: 67
diff changeset
2671 void *data)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2672 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2673 unsigned nargs = gimple_phi_num_args (phi);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2674
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2675 /* Through a single-argument PHI we can simply look through. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2676 if (nargs == 1)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2677 return PHI_ARG_DEF (phi, 0);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2678
111
kono
parents: 67
diff changeset
2679 /* For two or more arguments try to pairwise skip non-aliasing code
kono
parents: 67
diff changeset
2680 until we hit the phi argument definition that dominates the other one. */
kono
parents: 67
diff changeset
2681 basic_block phi_bb = gimple_bb (phi);
kono
parents: 67
diff changeset
2682 tree arg0, arg1;
kono
parents: 67
diff changeset
2683 unsigned i;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2684
111
kono
parents: 67
diff changeset
2685 /* Find a candidate for the virtual operand which definition
kono
parents: 67
diff changeset
2686 dominates those of all others. */
kono
parents: 67
diff changeset
2687 /* First look if any of the args themselves satisfy this. */
kono
parents: 67
diff changeset
2688 for (i = 0; i < nargs; ++i)
kono
parents: 67
diff changeset
2689 {
kono
parents: 67
diff changeset
2690 arg0 = PHI_ARG_DEF (phi, i);
kono
parents: 67
diff changeset
2691 if (SSA_NAME_IS_DEFAULT_DEF (arg0))
kono
parents: 67
diff changeset
2692 break;
kono
parents: 67
diff changeset
2693 basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (arg0));
kono
parents: 67
diff changeset
2694 if (def_bb != phi_bb
kono
parents: 67
diff changeset
2695 && dominated_by_p (CDI_DOMINATORS, phi_bb, def_bb))
kono
parents: 67
diff changeset
2696 break;
kono
parents: 67
diff changeset
2697 arg0 = NULL_TREE;
kono
parents: 67
diff changeset
2698 }
kono
parents: 67
diff changeset
2699 /* If not, look if we can reach such candidate by walking defs
kono
parents: 67
diff changeset
2700 of a PHI arg without crossing other PHIs. */
kono
parents: 67
diff changeset
2701 if (! arg0)
kono
parents: 67
diff changeset
2702 for (i = 0; i < nargs; ++i)
kono
parents: 67
diff changeset
2703 {
kono
parents: 67
diff changeset
2704 arg0 = PHI_ARG_DEF (phi, i);
kono
parents: 67
diff changeset
2705 gimple *def = SSA_NAME_DEF_STMT (arg0);
kono
parents: 67
diff changeset
2706 /* Backedges can't work. */
kono
parents: 67
diff changeset
2707 if (dominated_by_p (CDI_DOMINATORS,
kono
parents: 67
diff changeset
2708 gimple_bb (def), phi_bb))
kono
parents: 67
diff changeset
2709 continue;
kono
parents: 67
diff changeset
2710 /* See below. */
kono
parents: 67
diff changeset
2711 if (gimple_code (def) == GIMPLE_PHI)
kono
parents: 67
diff changeset
2712 continue;
kono
parents: 67
diff changeset
2713 while (! dominated_by_p (CDI_DOMINATORS,
kono
parents: 67
diff changeset
2714 phi_bb, gimple_bb (def)))
kono
parents: 67
diff changeset
2715 {
kono
parents: 67
diff changeset
2716 arg0 = gimple_vuse (def);
kono
parents: 67
diff changeset
2717 if (SSA_NAME_IS_DEFAULT_DEF (arg0))
kono
parents: 67
diff changeset
2718 break;
kono
parents: 67
diff changeset
2719 def = SSA_NAME_DEF_STMT (arg0);
kono
parents: 67
diff changeset
2720 if (gimple_code (def) == GIMPLE_PHI)
kono
parents: 67
diff changeset
2721 {
kono
parents: 67
diff changeset
2722 /* Do not try to look through arbitrarily complicated
kono
parents: 67
diff changeset
2723 CFGs. For those looking for the first VUSE starting
kono
parents: 67
diff changeset
2724 from the end of the immediate dominator of phi_bb
kono
parents: 67
diff changeset
2725 is likely faster. */
kono
parents: 67
diff changeset
2726 arg0 = NULL_TREE;
kono
parents: 67
diff changeset
2727 goto next;
kono
parents: 67
diff changeset
2728 }
kono
parents: 67
diff changeset
2729 }
kono
parents: 67
diff changeset
2730 break;
kono
parents: 67
diff changeset
2731 next:;
kono
parents: 67
diff changeset
2732 }
kono
parents: 67
diff changeset
2733 if (! arg0)
kono
parents: 67
diff changeset
2734 return NULL_TREE;
kono
parents: 67
diff changeset
2735
kono
parents: 67
diff changeset
2736 /* Then check against the found candidate. */
kono
parents: 67
diff changeset
2737 for (i = 0; i < nargs; ++i)
kono
parents: 67
diff changeset
2738 {
kono
parents: 67
diff changeset
2739 arg1 = PHI_ARG_DEF (phi, i);
kono
parents: 67
diff changeset
2740 if (arg1 == arg0)
kono
parents: 67
diff changeset
2741 ;
kono
parents: 67
diff changeset
2742 else if (! maybe_skip_until (phi, arg0, ref, arg1, cnt, visited,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2743 abort_on_visited,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2744 /* Do not translate when walking over
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2745 backedges. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2746 dominated_by_p
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2747 (CDI_DOMINATORS,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2748 gimple_bb (SSA_NAME_DEF_STMT (arg1)),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2749 phi_bb)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2750 ? NULL : translate, data))
111
kono
parents: 67
diff changeset
2751 return NULL_TREE;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2752 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2753
111
kono
parents: 67
diff changeset
2754 return arg0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2755 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2756
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2757 /* Based on the memory reference REF and its virtual use VUSE call
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2758 WALKER for each virtual use that is equivalent to VUSE, including VUSE
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2759 itself. That is, for each virtual use for which its defining statement
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2760 does not clobber REF.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2761
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2762 WALKER is called with REF, the current virtual use and DATA. If
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2763 WALKER returns non-NULL the walk stops and its result is returned.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2764 At the end of a non-successful walk NULL is returned.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2765
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2766 TRANSLATE if non-NULL is called with a pointer to REF, the virtual
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2767 use which definition is a statement that may clobber REF and DATA.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2768 If TRANSLATE returns (void *)-1 the walk stops and NULL is returned.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2769 If TRANSLATE returns non-NULL the walk stops and its result is returned.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2770 If TRANSLATE returns NULL the walk continues and TRANSLATE is supposed
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2771 to adjust REF and *DATA to make that valid.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2772
111
kono
parents: 67
diff changeset
2773 VALUEIZE if non-NULL is called with the next VUSE that is considered
kono
parents: 67
diff changeset
2774 and return value is substituted for that. This can be used to
kono
parents: 67
diff changeset
2775 implement optimistic value-numbering for example. Note that the
kono
parents: 67
diff changeset
2776 VUSE argument is assumed to be valueized already.
kono
parents: 67
diff changeset
2777
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2778 TODO: Cache the vector of equivalent vuses per ref, vuse pair. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2779
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2780 void *
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2781 walk_non_aliased_vuses (ao_ref *ref, tree vuse,
111
kono
parents: 67
diff changeset
2782 void *(*walker)(ao_ref *, tree, unsigned int, void *),
kono
parents: 67
diff changeset
2783 void *(*translate)(ao_ref *, tree, void *, bool *),
kono
parents: 67
diff changeset
2784 tree (*valueize)(tree),
kono
parents: 67
diff changeset
2785 void *data)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2786 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2787 bitmap visited = NULL;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2788 void *res;
111
kono
parents: 67
diff changeset
2789 unsigned int cnt = 0;
kono
parents: 67
diff changeset
2790 bool translated = false;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2791
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2792 timevar_push (TV_ALIAS_STMT_WALK);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2793
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2794 do
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2795 {
111
kono
parents: 67
diff changeset
2796 gimple *def_stmt;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2797
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2798 /* ??? Do we want to account this to TV_ALIAS_STMT_WALK? */
111
kono
parents: 67
diff changeset
2799 res = (*walker) (ref, vuse, cnt, data);
kono
parents: 67
diff changeset
2800 /* Abort walk. */
kono
parents: 67
diff changeset
2801 if (res == (void *)-1)
kono
parents: 67
diff changeset
2802 {
kono
parents: 67
diff changeset
2803 res = NULL;
kono
parents: 67
diff changeset
2804 break;
kono
parents: 67
diff changeset
2805 }
kono
parents: 67
diff changeset
2806 /* Lookup succeeded. */
kono
parents: 67
diff changeset
2807 else if (res != NULL)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2808 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2809
111
kono
parents: 67
diff changeset
2810 if (valueize)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2811 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2812 vuse = valueize (vuse);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2813 if (!vuse)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2814 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2815 res = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2816 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2817 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2818 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2819 def_stmt = SSA_NAME_DEF_STMT (vuse);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2820 if (gimple_nop_p (def_stmt))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2821 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2822 else if (gimple_code (def_stmt) == GIMPLE_PHI)
111
kono
parents: 67
diff changeset
2823 vuse = get_continuation_for_phi (def_stmt, ref, &cnt,
kono
parents: 67
diff changeset
2824 &visited, translated, translate, data);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2825 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2826 {
111
kono
parents: 67
diff changeset
2827 cnt++;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2828 if (stmt_may_clobber_ref_p_1 (def_stmt, ref))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2829 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2830 if (!translate)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2831 break;
111
kono
parents: 67
diff changeset
2832 bool disambiguate_only = false;
kono
parents: 67
diff changeset
2833 res = (*translate) (ref, vuse, data, &disambiguate_only);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2834 /* Failed lookup and translation. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2835 if (res == (void *)-1)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2836 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2837 res = NULL;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2838 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2839 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2840 /* Lookup succeeded. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2841 else if (res != NULL)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2842 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2843 /* Translation succeeded, continue walking. */
111
kono
parents: 67
diff changeset
2844 translated = translated || !disambiguate_only;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2845 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2846 vuse = gimple_vuse (def_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2847 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2848 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2849 while (vuse);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2850
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2851 if (visited)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2852 BITMAP_FREE (visited);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2853
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2854 timevar_pop (TV_ALIAS_STMT_WALK);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2855
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2856 return res;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2857 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2858
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2859
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2860 /* Based on the memory reference REF call WALKER for each vdef which
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2861 defining statement may clobber REF, starting with VDEF. If REF
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2862 is NULL_TREE, each defining statement is visited.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2863
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2864 WALKER is called with REF, the current vdef and DATA. If WALKER
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2865 returns true the walk is stopped, otherwise it continues.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2866
111
kono
parents: 67
diff changeset
2867 If function entry is reached, FUNCTION_ENTRY_REACHED is set to true.
kono
parents: 67
diff changeset
2868 The pointer may be NULL and then we do not track this information.
kono
parents: 67
diff changeset
2869
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2870 At PHI nodes walk_aliased_vdefs forks into one walk for reach
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2871 PHI argument (but only one walk continues on merge points), the
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2872 return value is true if any of the walks was successful.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2873
111
kono
parents: 67
diff changeset
2874 The function returns the number of statements walked or -1 if
kono
parents: 67
diff changeset
2875 LIMIT stmts were walked and the walk was aborted at this point.
kono
parents: 67
diff changeset
2876 If LIMIT is zero the walk is not aborted. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2877
111
kono
parents: 67
diff changeset
2878 static int
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2879 walk_aliased_vdefs_1 (ao_ref *ref, tree vdef,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2880 bool (*walker)(ao_ref *, tree, void *), void *data,
111
kono
parents: 67
diff changeset
2881 bitmap *visited, unsigned int cnt,
kono
parents: 67
diff changeset
2882 bool *function_entry_reached, unsigned limit)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2883 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2884 do
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2885 {
111
kono
parents: 67
diff changeset
2886 gimple *def_stmt = SSA_NAME_DEF_STMT (vdef);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2887
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2888 if (*visited
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2889 && !bitmap_set_bit (*visited, SSA_NAME_VERSION (vdef)))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2890 return cnt;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2891
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2892 if (gimple_nop_p (def_stmt))
111
kono
parents: 67
diff changeset
2893 {
kono
parents: 67
diff changeset
2894 if (function_entry_reached)
kono
parents: 67
diff changeset
2895 *function_entry_reached = true;
kono
parents: 67
diff changeset
2896 return cnt;
kono
parents: 67
diff changeset
2897 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2898 else if (gimple_code (def_stmt) == GIMPLE_PHI)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2899 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2900 unsigned i;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2901 if (!*visited)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2902 *visited = BITMAP_ALLOC (NULL);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2903 for (i = 0; i < gimple_phi_num_args (def_stmt); ++i)
111
kono
parents: 67
diff changeset
2904 {
kono
parents: 67
diff changeset
2905 int res = walk_aliased_vdefs_1 (ref,
kono
parents: 67
diff changeset
2906 gimple_phi_arg_def (def_stmt, i),
kono
parents: 67
diff changeset
2907 walker, data, visited, cnt,
kono
parents: 67
diff changeset
2908 function_entry_reached, limit);
kono
parents: 67
diff changeset
2909 if (res == -1)
kono
parents: 67
diff changeset
2910 return -1;
kono
parents: 67
diff changeset
2911 cnt = res;
kono
parents: 67
diff changeset
2912 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2913 return cnt;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2914 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2915
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2916 /* ??? Do we want to account this to TV_ALIAS_STMT_WALK? */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2917 cnt++;
111
kono
parents: 67
diff changeset
2918 if (cnt == limit)
kono
parents: 67
diff changeset
2919 return -1;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2920 if ((!ref
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2921 || stmt_may_clobber_ref_p_1 (def_stmt, ref))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2922 && (*walker) (ref, vdef, data))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2923 return cnt;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2924
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2925 vdef = gimple_vuse (def_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2926 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2927 while (1);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2928 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2929
111
kono
parents: 67
diff changeset
2930 int
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2931 walk_aliased_vdefs (ao_ref *ref, tree vdef,
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2932 bool (*walker)(ao_ref *, tree, void *), void *data,
111
kono
parents: 67
diff changeset
2933 bitmap *visited,
kono
parents: 67
diff changeset
2934 bool *function_entry_reached, unsigned int limit)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2935 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2936 bitmap local_visited = NULL;
111
kono
parents: 67
diff changeset
2937 int ret;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2938
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2939 timevar_push (TV_ALIAS_STMT_WALK);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2940
111
kono
parents: 67
diff changeset
2941 if (function_entry_reached)
kono
parents: 67
diff changeset
2942 *function_entry_reached = false;
kono
parents: 67
diff changeset
2943
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2944 ret = walk_aliased_vdefs_1 (ref, vdef, walker, data,
111
kono
parents: 67
diff changeset
2945 visited ? visited : &local_visited, 0,
kono
parents: 67
diff changeset
2946 function_entry_reached, limit);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2947 if (local_visited)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2948 BITMAP_FREE (local_visited);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2949
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2950 timevar_pop (TV_ALIAS_STMT_WALK);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2951
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2952 return ret;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2953 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
2954