Mercurial > hg > CbC > CbC_gcc
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 |
rev | line source |
---|---|
0 | 1 /* Alias analysis for trees. |
131 | 2 Copyright (C) 2004-2018 Free Software Foundation, Inc. |
0 | 3 Contributed by Diego Novillo <dnovillo@redhat.com> |
4 | |
5 This file is part of GCC. | |
6 | |
7 GCC is free software; you can redistribute it and/or modify | |
8 it under the terms of the GNU General Public License as published by | |
9 the Free Software Foundation; either version 3, or (at your option) | |
10 any later version. | |
11 | |
12 GCC is distributed in the hope that it will be useful, | |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GCC; see the file COPYING3. If not see | |
19 <http://www.gnu.org/licenses/>. */ | |
20 | |
21 #include "config.h" | |
22 #include "system.h" | |
23 #include "coretypes.h" | |
111 | 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 | 26 #include "rtl.h" |
27 #include "tree.h" | |
0 | 28 #include "gimple.h" |
111 | 29 #include "timevar.h" /* for TV_ALIAS_STMT_WALK */ |
30 #include "ssa.h" | |
31 #include "cgraph.h" | |
32 #include "tree-pretty-print.h" | |
33 #include "alias.h" | |
34 #include "fold-const.h" | |
35 #include "langhooks.h" | |
36 #include "dumpfile.h" | |
37 #include "tree-eh.h" | |
38 #include "tree-dfa.h" | |
39 #include "ipa-reference.h" | |
40 #include "varasm.h" | |
0 | 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 | 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 | 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 | 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 | 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 | 62 |
111 | 63 bool stmt_may_clobber_ref_p (gimple *, tree) |
0 | 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 | 67 |
111 | 68 bool ref_maybe_used_by_stmt_p (gimple *, tree) |
0 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 89 |
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 | 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 | 102 |
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 | 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 | 125 dump_alias_stats_in_alias_c (s); |
0 | 126 } |
127 | |
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 | 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 | 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 | 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 | 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 | 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 | 150 } |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 192 && (TREE_CODE (base) == MEM_REF |
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 | 196 && DECL_P (base)) |
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 | 203 } |
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 | 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 | 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 | 216 } |
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 | 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 | 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 | 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 | 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 | 258 && (TREE_CODE (base) == MEM_REF |
259 || TREE_CODE (base) == TARGET_MEM_REF)) | |
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 | 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 | 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 | 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 | 271 && (TREE_CODE (base) == MEM_REF |
272 || TREE_CODE (base) == TARGET_MEM_REF)) | |
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 | 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 | 279 } |
280 | |
111 | 281 /* From here we require SSA name pointers. Anything else aliases. */ |
282 if (TREE_CODE (ptr1) != SSA_NAME | |
283 || TREE_CODE (ptr2) != SSA_NAME | |
284 || !POINTER_TYPE_P (TREE_TYPE (ptr1)) | |
285 || !POINTER_TYPE_P (TREE_TYPE (ptr2))) | |
286 return true; | |
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 | 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 | 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 | 304 } |
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 | 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 | 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 | 314 |
111 | 315 if (TREE_CODE (base) == MEM_REF |
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 | 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 | 320 |
321 return true; | |
322 } | |
323 | |
111 | 324 /* Returns true if PTR1 and PTR2 compare unequal because of points-to. */ |
325 | |
326 bool | |
327 ptrs_compare_unequal (tree ptr1, tree ptr2) | |
328 { | |
329 /* First resolve the pointers down to a SSA name pointer base or | |
330 a VAR_DECL, PARM_DECL or RESULT_DECL. This explicitely does | |
331 not yet try to handle LABEL_DECLs, FUNCTION_DECLs, CONST_DECLs | |
332 or STRING_CSTs which needs points-to adjustments to track them | |
333 in the points-to sets. */ | |
334 tree obj1 = NULL_TREE; | |
335 tree obj2 = NULL_TREE; | |
336 if (TREE_CODE (ptr1) == ADDR_EXPR) | |
337 { | |
338 tree tem = get_base_address (TREE_OPERAND (ptr1, 0)); | |
339 if (! tem) | |
340 return false; | |
341 if (VAR_P (tem) | |
342 || TREE_CODE (tem) == PARM_DECL | |
343 || TREE_CODE (tem) == RESULT_DECL) | |
344 obj1 = tem; | |
345 else if (TREE_CODE (tem) == MEM_REF) | |
346 ptr1 = TREE_OPERAND (tem, 0); | |
347 } | |
348 if (TREE_CODE (ptr2) == ADDR_EXPR) | |
349 { | |
350 tree tem = get_base_address (TREE_OPERAND (ptr2, 0)); | |
351 if (! tem) | |
352 return false; | |
353 if (VAR_P (tem) | |
354 || TREE_CODE (tem) == PARM_DECL | |
355 || TREE_CODE (tem) == RESULT_DECL) | |
356 obj2 = tem; | |
357 else if (TREE_CODE (tem) == MEM_REF) | |
358 ptr2 = TREE_OPERAND (tem, 0); | |
359 } | |
360 | |
361 /* Canonicalize ptr vs. object. */ | |
362 if (TREE_CODE (ptr1) == SSA_NAME && obj2) | |
363 { | |
364 std::swap (ptr1, ptr2); | |
365 std::swap (obj1, obj2); | |
366 } | |
367 | |
368 if (obj1 && obj2) | |
369 /* Other code handles this correctly, no need to duplicate it here. */; | |
370 else if (obj1 && TREE_CODE (ptr2) == SSA_NAME) | |
371 { | |
372 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr2); | |
373 /* We may not use restrict to optimize pointer comparisons. | |
374 See PR71062. So we have to assume that restrict-pointed-to | |
375 may be in fact obj1. */ | |
376 if (!pi | |
377 || pi->pt.vars_contains_restrict | |
378 || pi->pt.vars_contains_interposable) | |
379 return false; | |
380 if (VAR_P (obj1) | |
381 && (TREE_STATIC (obj1) || DECL_EXTERNAL (obj1))) | |
382 { | |
383 varpool_node *node = varpool_node::get (obj1); | |
384 /* If obj1 may bind to NULL give up (see below). */ | |
385 if (! node | |
386 || ! node->nonzero_address () | |
387 || ! decl_binds_to_current_def_p (obj1)) | |
388 return false; | |
389 } | |
390 return !pt_solution_includes (&pi->pt, obj1); | |
391 } | |
392 | |
393 /* ??? We'd like to handle ptr1 != NULL and ptr1 != ptr2 | |
394 but those require pt.null to be conservatively correct. */ | |
395 | |
396 return false; | |
397 } | |
398 | |
399 /* Returns whether reference REF to BASE may refer to global memory. */ | |
400 | |
401 static bool | |
402 ref_may_alias_global_p_1 (tree base) | |
403 { | |
404 if (DECL_P (base)) | |
405 return is_global_var (base); | |
406 else if (TREE_CODE (base) == MEM_REF | |
407 || TREE_CODE (base) == TARGET_MEM_REF) | |
408 return ptr_deref_may_alias_global_p (TREE_OPERAND (base, 0)); | |
409 return true; | |
410 } | |
411 | |
412 bool | |
413 ref_may_alias_global_p (ao_ref *ref) | |
414 { | |
415 tree base = ao_ref_base (ref); | |
416 return ref_may_alias_global_p_1 (base); | |
417 } | |
418 | |
419 bool | |
420 ref_may_alias_global_p (tree ref) | |
421 { | |
422 tree base = get_base_address (ref); | |
423 return ref_may_alias_global_p_1 (base); | |
424 } | |
425 | |
426 /* Return true whether STMT may clobber global memory. */ | |
427 | |
428 bool | |
429 stmt_may_clobber_global_p (gimple *stmt) | |
430 { | |
431 tree lhs; | |
432 | |
433 if (!gimple_vdef (stmt)) | |
434 return false; | |
435 | |
436 /* ??? We can ask the oracle whether an artificial pointer | |
437 dereference with a pointer with points-to information covering | |
438 all global memory (what about non-address taken memory?) maybe | |
439 clobbered by this call. As there is at the moment no convenient | |
440 way of doing that without generating garbage do some manual | |
441 checking instead. | |
442 ??? We could make a NULL ao_ref argument to the various | |
443 predicates special, meaning any global memory. */ | |
444 | |
445 switch (gimple_code (stmt)) | |
446 { | |
447 case GIMPLE_ASSIGN: | |
448 lhs = gimple_assign_lhs (stmt); | |
449 return (TREE_CODE (lhs) != SSA_NAME | |
450 && ref_may_alias_global_p (lhs)); | |
451 case GIMPLE_CALL: | |
452 return true; | |
453 default: | |
454 return true; | |
455 } | |
456 } | |
457 | |
0 | 458 |
459 /* Dump alias information on FILE. */ | |
460 | |
461 void | |
462 dump_alias_info (FILE *file) | |
463 { | |
111 | 464 unsigned i; |
465 tree ptr; | |
0 | 466 const char *funcname |
467 = lang_hooks.decl_printable_name (current_function_decl, 2); | |
468 tree var; | |
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 | 471 |
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 | 474 FOR_EACH_LOCAL_DECL (cfun, i, var) |
0 | 475 { |
476 if (may_be_aliased (var)) | |
477 dump_variable (file, var); | |
478 } | |
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 | 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 | 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 | 486 |
111 | 487 FOR_EACH_SSA_NAME (i, ptr, cfun) |
0 | 488 { |
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 | 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 | 493 continue; |
494 | |
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 | 497 dump_points_to_info_for (file, ptr); |
498 } | |
499 | |
500 fprintf (file, "\n"); | |
501 } | |
502 | |
503 | |
504 /* Dump alias information on stderr. */ | |
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 | 507 debug_alias_info (void) |
508 { | |
509 dump_alias_info (stderr); | |
510 } | |
511 | |
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 | 537 if (pt->vars_contains_nonlocal |
538 || pt->vars_contains_escaped | |
539 || pt->vars_contains_escaped_heap | |
540 || pt->vars_contains_restrict) | |
541 { | |
542 const char *comma = ""; | |
543 fprintf (file, " ("); | |
544 if (pt->vars_contains_nonlocal) | |
545 { | |
546 fprintf (file, "nonlocal"); | |
547 comma = ", "; | |
548 } | |
549 if (pt->vars_contains_escaped) | |
550 { | |
551 fprintf (file, "%sescaped", comma); | |
552 comma = ", "; | |
553 } | |
554 if (pt->vars_contains_escaped_heap) | |
555 { | |
556 fprintf (file, "%sescaped heap", comma); | |
557 comma = ", "; | |
558 } | |
559 if (pt->vars_contains_restrict) | |
560 { | |
561 fprintf (file, "%srestrict", comma); | |
562 comma = ", "; | |
563 } | |
564 if (pt->vars_contains_interposable) | |
565 fprintf (file, "%sinterposable", comma); | |
566 fprintf (file, ")"); | |
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 | 571 |
572 /* Unified dump function for pt_solution. */ | |
573 | |
574 DEBUG_FUNCTION void | |
575 debug (pt_solution &ref) | |
576 { | |
577 dump_points_to_solution (stderr, &ref); | |
578 } | |
579 | |
580 DEBUG_FUNCTION void | |
581 debug (pt_solution *ptr) | |
582 { | |
583 if (ptr) | |
584 debug (*ptr); | |
585 else | |
586 fprintf (stderr, "<nil>\n"); | |
587 } | |
588 | |
589 | |
0 | 590 /* Dump points-to information for SSA_NAME PTR into FILE. */ |
591 | |
592 void | |
593 dump_points_to_info_for (FILE *file, tree ptr) | |
594 { | |
595 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr); | |
596 | |
597 print_generic_expr (file, ptr, dump_flags); | |
598 | |
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 | 603 |
604 fprintf (file, "\n"); | |
605 } | |
606 | |
607 | |
608 /* Dump points-to information for VAR into stderr. */ | |
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 | 611 debug_points_to_info_for (tree var) |
612 { | |
613 dump_points_to_info_for (stderr, var); | |
614 } | |
615 | |
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 | 618 |
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 | 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 | 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 | 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 | 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 | 637 bool reverse; |
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 | 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 | 644 } |
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 | 647 |
111 | 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 | 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 | 678 |
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 | 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 | 684 if (TREE_CODE (ptr) == SSA_NAME) |
685 { | |
686 gimple *stmt = SSA_NAME_DEF_STMT (ptr); | |
687 if (gimple_assign_single_p (stmt) | |
688 && gimple_assign_rhs_code (stmt) == ADDR_EXPR) | |
689 ptr = gimple_assign_rhs1 (stmt); | |
690 else if (is_gimple_assign (stmt) | |
691 && gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR | |
131 | 692 && ptrdiff_tree_p (gimple_assign_rhs2 (stmt), &extra_offset)) |
111 | 693 { |
694 ptr = gimple_assign_rhs1 (stmt); | |
131 | 695 extra_offset *= BITS_PER_UNIT; |
111 | 696 } |
697 } | |
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 | 700 { |
701 ref->base = get_addr_base_and_unit_offset (TREE_OPERAND (ptr, 0), &t); | |
702 if (ref->base) | |
703 ref->offset = BITS_PER_UNIT * t; | |
704 else | |
705 { | |
706 size = NULL_TREE; | |
707 ref->offset = 0; | |
708 ref->base = get_base_address (TREE_OPERAND (ptr, 0)); | |
709 } | |
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 | 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 | 719 && poly_int_tree_p (size, &size_hwi) |
720 && coeffs_in_range_p (size_hwi, 0, HOST_WIDE_INT_MAX / BITS_PER_UNIT)) | |
111 | 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 | 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 | 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 | 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 | 781 poly_int64 offset1, poly_int64 max_size1, |
111 | 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 | 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 | 794 tree base1, base2; |
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 | 799 /* Choose bases and base types to search for. */ |
800 base1 = ref1; | |
801 while (handled_component_p (base1)) | |
802 base1 = TREE_OPERAND (base1, 0); | |
803 type1 = TREE_TYPE (base1); | |
804 base2 = ref2; | |
805 while (handled_component_p (base2)) | |
806 base2 = TREE_OPERAND (base2, 0); | |
807 type2 = TREE_TYPE (base2); | |
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 | 821 poly_int64 offadj, sztmp, msztmp; |
111 | 822 bool reverse; |
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 | 825 get_ref_base_and_extent (base1, &offadj, &sztmp, &msztmp, &reverse); |
826 offset1 -= offadj; | |
131 | 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 | 840 poly_int64 offadj, sztmp, msztmp; |
111 | 841 bool reverse; |
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 | 844 get_ref_base_and_extent (base2, &offadj, &sztmp, &msztmp, &reverse); |
845 offset2 -= offadj; | |
131 | 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 | 863 } |
864 | |
111 | 865 /* Return true if we can determine that component references REF1 and REF2, |
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 | 869 nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2) |
870 { | |
871 auto_vec<tree, 16> component_refs1; | |
872 auto_vec<tree, 16> component_refs2; | |
873 | |
874 /* Create the stack of handled components for REF1. */ | |
875 while (handled_component_p (ref1)) | |
876 { | |
877 component_refs1.safe_push (ref1); | |
878 ref1 = TREE_OPERAND (ref1, 0); | |
879 } | |
880 if (TREE_CODE (ref1) == MEM_REF) | |
881 { | |
882 if (!integer_zerop (TREE_OPERAND (ref1, 1))) | |
883 return false; | |
884 ref1 = TREE_OPERAND (TREE_OPERAND (ref1, 0), 0); | |
885 } | |
886 | |
887 /* Create the stack of handled components for REF2. */ | |
888 while (handled_component_p (ref2)) | |
889 { | |
890 component_refs2.safe_push (ref2); | |
891 ref2 = TREE_OPERAND (ref2, 0); | |
892 } | |
893 if (TREE_CODE (ref2) == MEM_REF) | |
894 { | |
895 if (!integer_zerop (TREE_OPERAND (ref2, 1))) | |
896 return false; | |
897 ref2 = TREE_OPERAND (TREE_OPERAND (ref2, 0), 0); | |
898 } | |
899 | |
900 /* Bases must be either same or uncomparable. */ | |
901 gcc_checking_assert (ref1 == ref2 | |
902 || (DECL_P (ref1) && DECL_P (ref2) | |
903 && compare_base_decls (ref1, ref2) != 0)); | |
904 | |
905 /* Pop the stacks in parallel and examine the COMPONENT_REFs of the same | |
906 rank. This is sufficient because we start from the same DECL and you | |
907 cannot reference several fields at a time with COMPONENT_REFs (unlike | |
908 with ARRAY_RANGE_REFs for arrays) so you always need the same number | |
909 of them to access a sub-component, unless you're in a union, in which | |
910 case the return value will precisely be false. */ | |
911 while (true) | |
912 { | |
913 do | |
914 { | |
915 if (component_refs1.is_empty ()) | |
916 return false; | |
917 ref1 = component_refs1.pop (); | |
918 } | |
919 while (!RECORD_OR_UNION_TYPE_P (TREE_TYPE (TREE_OPERAND (ref1, 0)))); | |
920 | |
921 do | |
922 { | |
923 if (component_refs2.is_empty ()) | |
924 return false; | |
925 ref2 = component_refs2.pop (); | |
926 } | |
927 while (!RECORD_OR_UNION_TYPE_P (TREE_TYPE (TREE_OPERAND (ref2, 0)))); | |
928 | |
929 /* Beware of BIT_FIELD_REF. */ | |
930 if (TREE_CODE (ref1) != COMPONENT_REF | |
931 || TREE_CODE (ref2) != COMPONENT_REF) | |
932 return false; | |
933 | |
934 tree field1 = TREE_OPERAND (ref1, 1); | |
935 tree field2 = TREE_OPERAND (ref2, 1); | |
936 | |
937 /* ??? We cannot simply use the type of operand #0 of the refs here | |
938 as the Fortran compiler smuggles type punning into COMPONENT_REFs | |
939 for common blocks instead of using unions like everyone else. */ | |
940 tree type1 = DECL_CONTEXT (field1); | |
941 tree type2 = DECL_CONTEXT (field2); | |
942 | |
943 /* We cannot disambiguate fields in a union or qualified union. */ | |
944 if (type1 != type2 || TREE_CODE (type1) != RECORD_TYPE) | |
945 return false; | |
946 | |
947 if (field1 != field2) | |
948 { | |
949 /* A field and its representative need to be considered the | |
950 same. */ | |
951 if (DECL_BIT_FIELD_REPRESENTATIVE (field1) == field2 | |
952 || DECL_BIT_FIELD_REPRESENTATIVE (field2) == field1) | |
953 return false; | |
954 /* Different fields of the same record type cannot overlap. | |
955 ??? Bitfields can overlap at RTL level so punt on them. */ | |
956 if (DECL_BIT_FIELD (field1) && DECL_BIT_FIELD (field2)) | |
957 return false; | |
958 return true; | |
959 } | |
960 } | |
961 | |
962 return false; | |
963 } | |
964 | |
965 /* qsort compare function to sort FIELD_DECLs after their | |
966 DECL_FIELD_CONTEXT TYPE_UID. */ | |
967 | |
968 static inline int | |
969 ncr_compar (const void *field1_, const void *field2_) | |
970 { | |
971 const_tree field1 = *(const_tree *) const_cast <void *>(field1_); | |
972 const_tree field2 = *(const_tree *) const_cast <void *>(field2_); | |
973 unsigned int uid1 = TYPE_UID (DECL_FIELD_CONTEXT (field1)); | |
974 unsigned int uid2 = TYPE_UID (DECL_FIELD_CONTEXT (field2)); | |
975 if (uid1 < uid2) | |
976 return -1; | |
977 else if (uid1 > uid2) | |
978 return 1; | |
979 return 0; | |
980 } | |
981 | |
982 /* Return true if we can determine that the fields referenced cannot | |
983 overlap for any pair of objects. */ | |
984 | |
985 static bool | |
986 nonoverlapping_component_refs_p (const_tree x, const_tree y) | |
987 { | |
988 if (!flag_strict_aliasing | |
989 || !x || !y | |
990 || TREE_CODE (x) != COMPONENT_REF | |
991 || TREE_CODE (y) != COMPONENT_REF) | |
992 return false; | |
993 | |
994 auto_vec<const_tree, 16> fieldsx; | |
995 while (TREE_CODE (x) == COMPONENT_REF) | |
996 { | |
997 tree field = TREE_OPERAND (x, 1); | |
998 tree type = DECL_FIELD_CONTEXT (field); | |
999 if (TREE_CODE (type) == RECORD_TYPE) | |
1000 fieldsx.safe_push (field); | |
1001 x = TREE_OPERAND (x, 0); | |
1002 } | |
1003 if (fieldsx.length () == 0) | |
1004 return false; | |
1005 auto_vec<const_tree, 16> fieldsy; | |
1006 while (TREE_CODE (y) == COMPONENT_REF) | |
1007 { | |
1008 tree field = TREE_OPERAND (y, 1); | |
1009 tree type = DECL_FIELD_CONTEXT (field); | |
1010 if (TREE_CODE (type) == RECORD_TYPE) | |
1011 fieldsy.safe_push (TREE_OPERAND (y, 1)); | |
1012 y = TREE_OPERAND (y, 0); | |
1013 } | |
1014 if (fieldsy.length () == 0) | |
1015 return false; | |
1016 | |
1017 /* Most common case first. */ | |
1018 if (fieldsx.length () == 1 | |
1019 && fieldsy.length () == 1) | |
1020 return ((DECL_FIELD_CONTEXT (fieldsx[0]) | |
1021 == DECL_FIELD_CONTEXT (fieldsy[0])) | |
1022 && fieldsx[0] != fieldsy[0] | |
1023 && !(DECL_BIT_FIELD (fieldsx[0]) && DECL_BIT_FIELD (fieldsy[0]))); | |
1024 | |
1025 if (fieldsx.length () == 2) | |
1026 { | |
1027 if (ncr_compar (&fieldsx[0], &fieldsx[1]) == 1) | |
1028 std::swap (fieldsx[0], fieldsx[1]); | |
1029 } | |
1030 else | |
1031 fieldsx.qsort (ncr_compar); | |
1032 | |
1033 if (fieldsy.length () == 2) | |
1034 { | |
1035 if (ncr_compar (&fieldsy[0], &fieldsy[1]) == 1) | |
1036 std::swap (fieldsy[0], fieldsy[1]); | |
1037 } | |
1038 else | |
1039 fieldsy.qsort (ncr_compar); | |
1040 | |
1041 unsigned i = 0, j = 0; | |
1042 do | |
1043 { | |
1044 const_tree fieldx = fieldsx[i]; | |
1045 const_tree fieldy = fieldsy[j]; | |
1046 tree typex = DECL_FIELD_CONTEXT (fieldx); | |
1047 tree typey = DECL_FIELD_CONTEXT (fieldy); | |
1048 if (typex == typey) | |
1049 { | |
1050 /* We're left with accessing different fields of a structure, | |
1051 no possible overlap. */ | |
1052 if (fieldx != fieldy) | |
1053 { | |
1054 /* A field and its representative need to be considered the | |
1055 same. */ | |
1056 if (DECL_BIT_FIELD_REPRESENTATIVE (fieldx) == fieldy | |
1057 || DECL_BIT_FIELD_REPRESENTATIVE (fieldy) == fieldx) | |
1058 return false; | |
1059 /* Different fields of the same record type cannot overlap. | |
1060 ??? Bitfields can overlap at RTL level so punt on them. */ | |
1061 if (DECL_BIT_FIELD (fieldx) && DECL_BIT_FIELD (fieldy)) | |
1062 return false; | |
1063 return true; | |
1064 } | |
1065 } | |
1066 if (TYPE_UID (typex) < TYPE_UID (typey)) | |
1067 { | |
1068 i++; | |
1069 if (i == fieldsx.length ()) | |
1070 break; | |
1071 } | |
1072 else | |
1073 { | |
1074 j++; | |
1075 if (j == fieldsy.length ()) | |
1076 break; | |
1077 } | |
1078 } | |
1079 while (1); | |
1080 | |
1081 return false; | |
1082 } | |
1083 | |
1084 | |
1085 /* Return true if two memory references based on the variables BASE1 | |
1086 and BASE2 constrained to [OFFSET1, OFFSET1 + MAX_SIZE1) and | |
1087 [OFFSET2, OFFSET2 + MAX_SIZE2) may alias. REF1 and REF2 | |
1088 if non-NULL are the complete memory reference trees. */ | |
1089 | |
1090 static bool | |
1091 decl_refs_may_alias_p (tree ref1, tree base1, | |
131 | 1092 poly_int64 offset1, poly_int64 max_size1, |
111 | 1093 tree ref2, tree base2, |
131 | 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 | 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 | 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 | 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 | 1104 if (!ranges_maybe_overlap_p (offset1, max_size1, offset2, max_size2)) |
111 | 1105 return false; |
1106 | |
1107 /* For components with variable position, the above test isn't sufficient, | |
1108 so we disambiguate component references manually. */ | |
1109 if (ref1 && ref2 | |
1110 && handled_component_p (ref1) && handled_component_p (ref2) | |
1111 && nonoverlapping_component_refs_of_decl_p (ref1, ref2)) | |
1112 return false; | |
1113 | |
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 | 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 | 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 | 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 | 1135 tree ptrtype1, dbase2; |
1136 | |
1137 gcc_checking_assert ((TREE_CODE (base1) == MEM_REF | |
1138 || TREE_CODE (base1) == TARGET_MEM_REF) | |
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 | 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 | 1148 ??? IVOPTs creates bases that do not honor this restriction, |
1149 so do not apply this optimization for TARGET_MEM_REFs. */ | |
1150 if (TREE_CODE (base1) != TARGET_MEM_REF | |
131 | 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 | 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 | 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 | 1186 && poly_int_tree_p (DECL_SIZE (base2)) |
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 | 1193 && known_lt (wi::to_poly_widest (DECL_SIZE (base2)), |
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 | 1197 if (!ref2) |
1198 return true; | |
1199 | |
1200 /* If the decl is accessed via a MEM_REF, reconstruct the base | |
1201 we can use for TBAA and an appropriately adjusted offset. */ | |
1202 dbase2 = ref2; | |
1203 while (handled_component_p (dbase2)) | |
1204 dbase2 = TREE_OPERAND (dbase2, 0); | |
131 | 1205 poly_int64 doffset1 = offset1; |
1206 poly_offset_int doffset2 = offset2; | |
111 | 1207 if (TREE_CODE (dbase2) == MEM_REF |
1208 || TREE_CODE (dbase2) == TARGET_MEM_REF) | |
131 | 1209 doffset2 -= mem_ref_offset (dbase2) << LOG2_BITS_PER_UNIT; |
111 | 1210 |
1211 /* If either reference is view-converted, give up now. */ | |
1212 if (same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) != 1 | |
1213 || same_type_for_tbaa (TREE_TYPE (dbase2), TREE_TYPE (base2)) != 1) | |
1214 return true; | |
1215 | |
1216 /* If both references are through the same type, they do not alias | |
1217 if the accesses do not overlap. This does extra disambiguation | |
1218 for mixed/pointer accesses but requires strict aliasing. | |
1219 For MEM_REFs we require that the component-ref offset we computed | |
1220 is relative to the start of the type which we ensure by | |
1221 comparing rvalue and access type and disregarding the constant | |
1222 pointer offset. */ | |
1223 if ((TREE_CODE (base1) != TARGET_MEM_REF | |
1224 || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1))) | |
1225 && same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (dbase2)) == 1) | |
131 | 1226 return ranges_maybe_overlap_p (doffset1, max_size1, doffset2, max_size2); |
111 | 1227 |
1228 if (ref1 && ref2 | |
1229 && nonoverlapping_component_refs_p (ref1, ref2)) | |
1230 return false; | |
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 | 1234 && (handled_component_p (ref1) || handled_component_p (ref2))) |
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 | 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 | 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 | 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 | 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 | 1266 gcc_checking_assert ((TREE_CODE (base1) == MEM_REF |
1267 || TREE_CODE (base1) == TARGET_MEM_REF) | |
1268 && (TREE_CODE (base2) == MEM_REF | |
1269 || TREE_CODE (base2) == TARGET_MEM_REF)); | |
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 | 1298 poly_offset_int moff1 = mem_ref_offset (base1) << LOG2_BITS_PER_UNIT; |
1299 poly_offset_int moff2 = mem_ref_offset (base2) << LOG2_BITS_PER_UNIT; | |
1300 return ranges_maybe_overlap_p (offset1 + moff1, max_size1, | |
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 | 1310 ptrtype1 = TREE_TYPE (TREE_OPERAND (base1, 1)); |
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 | 1314 if (base1_alias_set == 0 |
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 | 1321 if ((TREE_CODE (base1) != TARGET_MEM_REF |
1322 || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1))) | |
1323 && (TREE_CODE (base2) != TARGET_MEM_REF | |
1324 || (!TMR_INDEX (base2) && !TMR_INDEX2 (base2))) | |
1325 && same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) == 1 | |
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 | 1328 TREE_TYPE (ptrtype2)) == 1 |
1329 /* But avoid treating arrays as "objects", instead assume they | |
1330 can overlap by an exact multiple of their element size. */ | |
1331 && TREE_CODE (TREE_TYPE (ptrtype1)) != ARRAY_TYPE) | |
131 | 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 | 1339 /* If either reference is view-converted, give up now. */ |
1340 if (same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) != 1 | |
1341 || same_type_for_tbaa (TREE_TYPE (base2), TREE_TYPE (ptrtype2)) != 1) | |
1342 return true; | |
1343 | |
1344 if (ref1 && ref2 | |
1345 && nonoverlapping_component_refs_p (ref1, ref2)) | |
1346 return false; | |
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 | 1350 && (handled_component_p (ref1) || handled_component_p (ref2))) |
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 | 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 | 1359 } |
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 | 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 | 1367 poly_int64 offset1 = 0, offset2 = 0; |
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 | 1408 |
111 | 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 | 1418 /* Two volatile accesses always conflict. */ |
1419 if (ref1->volatile_p | |
1420 && ref2->volatile_p) | |
1421 return true; | |
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 | 1427 var1_p = DECL_P (base1); |
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 | 1430 return decl_refs_may_alias_p (ref1->ref, base1, offset1, max_size1, |
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 | 1433 /* Handle restrict based accesses. |
1434 ??? ao_ref_base strips inner MEM_REF [&decl], recover from that | |
1435 here. */ | |
1436 tree rbase1 = base1; | |
1437 tree rbase2 = base2; | |
1438 if (var1_p) | |
1439 { | |
1440 rbase1 = ref1->ref; | |
1441 if (rbase1) | |
1442 while (handled_component_p (rbase1)) | |
1443 rbase1 = TREE_OPERAND (rbase1, 0); | |
1444 } | |
1445 if (var2_p) | |
1446 { | |
1447 rbase2 = ref2->ref; | |
1448 if (rbase2) | |
1449 while (handled_component_p (rbase2)) | |
1450 rbase2 = TREE_OPERAND (rbase2, 0); | |
1451 } | |
1452 if (rbase1 && rbase2 | |
1453 && (TREE_CODE (base1) == MEM_REF || TREE_CODE (base1) == TARGET_MEM_REF) | |
1454 && (TREE_CODE (base2) == MEM_REF || TREE_CODE (base2) == TARGET_MEM_REF) | |
1455 /* If the accesses are in the same restrict clique... */ | |
1456 && MR_DEPENDENCE_CLIQUE (base1) == MR_DEPENDENCE_CLIQUE (base2) | |
1457 /* But based on different pointers they do not alias. */ | |
1458 && MR_DEPENDENCE_BASE (base1) != MR_DEPENDENCE_BASE (base2)) | |
1459 return false; | |
1460 | |
1461 ind1_p = (TREE_CODE (base1) == MEM_REF | |
1462 || TREE_CODE (base1) == TARGET_MEM_REF); | |
1463 ind2_p = (TREE_CODE (base2) == MEM_REF | |
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 | 1469 std::swap (offset1, offset2); |
1470 std::swap (max_size1, max_size2); | |
1471 std::swap (base1, base2); | |
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 | 1486 /* If the reference is based on a pointer that points to memory |
1487 that may not be written to then the other reference cannot possibly | |
1488 clobber it. */ | |
1489 if ((TREE_CODE (TREE_OPERAND (base2, 0)) == SSA_NAME | |
1490 && SSA_NAME_POINTS_TO_READONLY_MEMORY (TREE_OPERAND (base2, 0))) | |
1491 || (ind1_p | |
1492 && TREE_CODE (TREE_OPERAND (base1, 0)) == SSA_NAME | |
1493 && SSA_NAME_POINTS_TO_READONLY_MEMORY (TREE_OPERAND (base1, 0)))) | |
1494 return false; | |
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 | 1500 ao_ref_alias_set (ref2), |
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 | 1510 ao_ref_alias_set (ref1), |
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 | 1514 ao_ref_alias_set (ref2), |
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 | 1519 } |
1520 | |
1521 static bool | |
131 | 1522 refs_may_alias_p (tree ref1, ao_ref *ref2, bool tbaa_p) |
111 | 1523 { |
1524 ao_ref r1; | |
1525 ao_ref_init (&r1, ref1); | |
131 | 1526 return refs_may_alias_p_1 (&r1, ref2, tbaa_p); |
0 | 1527 } |
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 | 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 | 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 | 1558 |
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 | 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 | 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 | 1585 return true; |
1586 | |
111 | 1587 /* A call that is not without side-effects might involve volatile |
1588 accesses and thus conflicts with all other volatile accesses. */ | |
1589 if (ref->volatile_p) | |
1590 return true; | |
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 | 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 | 1609 /* All the following functions read memory pointed to by |
1610 their second argument. strcat/strncat additionally | |
1611 reads memory pointed to by the first argument. */ | |
1612 case BUILT_IN_STRCAT: | |
1613 case BUILT_IN_STRNCAT: | |
1614 { | |
1615 ao_ref dref; | |
1616 ao_ref_init_from_ptr_and_size (&dref, | |
1617 gimple_call_arg (call, 0), | |
1618 NULL_TREE); | |
1619 if (refs_may_alias_p_1 (&dref, ref, false)) | |
1620 return true; | |
1621 } | |
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 | 1630 case BUILT_IN_TM_MEMCPY: |
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 | 1642 case BUILT_IN_STRCAT_CHK: |
1643 case BUILT_IN_STRNCAT_CHK: | |
1644 { | |
1645 ao_ref dref; | |
1646 ao_ref_init_from_ptr_and_size (&dref, | |
1647 gimple_call_arg (call, 0), | |
1648 NULL_TREE); | |
1649 if (refs_may_alias_p_1 (&dref, ref, false)) | |
1650 return true; | |
1651 } | |
1652 /* FALLTHRU */ | |
1653 case BUILT_IN_STRCPY_CHK: | |
1654 case BUILT_IN_STRNCPY_CHK: | |
1655 case BUILT_IN_MEMCPY_CHK: | |
1656 case BUILT_IN_MEMMOVE_CHK: | |
1657 case BUILT_IN_MEMPCPY_CHK: | |
1658 case BUILT_IN_STPCPY_CHK: | |
1659 case BUILT_IN_STPNCPY_CHK: | |
1660 { | |
1661 ao_ref dref; | |
1662 tree size = NULL_TREE; | |
1663 if (gimple_call_num_args (call) == 4) | |
1664 size = gimple_call_arg (call, 2); | |
1665 ao_ref_init_from_ptr_and_size (&dref, | |
1666 gimple_call_arg (call, 1), | |
1667 size); | |
1668 return refs_may_alias_p_1 (&dref, ref, false); | |
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 | 1679 |
1680 /* The following functions read memory pointed to by their | |
1681 first argument. */ | |
1682 CASE_BUILT_IN_TM_LOAD (1): | |
1683 CASE_BUILT_IN_TM_LOAD (2): | |
1684 CASE_BUILT_IN_TM_LOAD (4): | |
1685 CASE_BUILT_IN_TM_LOAD (8): | |
1686 CASE_BUILT_IN_TM_LOAD (FLOAT): | |
1687 CASE_BUILT_IN_TM_LOAD (DOUBLE): | |
1688 CASE_BUILT_IN_TM_LOAD (LDOUBLE): | |
1689 CASE_BUILT_IN_TM_LOAD (M64): | |
1690 CASE_BUILT_IN_TM_LOAD (M128): | |
1691 CASE_BUILT_IN_TM_LOAD (M256): | |
1692 case BUILT_IN_TM_LOG: | |
1693 case BUILT_IN_TM_LOG_1: | |
1694 case BUILT_IN_TM_LOG_2: | |
1695 case BUILT_IN_TM_LOG_4: | |
1696 case BUILT_IN_TM_LOG_8: | |
1697 case BUILT_IN_TM_LOG_FLOAT: | |
1698 case BUILT_IN_TM_LOG_DOUBLE: | |
1699 case BUILT_IN_TM_LOG_LDOUBLE: | |
1700 case BUILT_IN_TM_LOG_M64: | |
1701 case BUILT_IN_TM_LOG_M128: | |
1702 case BUILT_IN_TM_LOG_M256: | |
1703 return ptr_deref_may_alias_ref_p_1 (gimple_call_arg (call, 0), ref); | |
1704 | |
1705 /* These read memory pointed to by the first argument. */ | |
1706 case BUILT_IN_STRDUP: | |
1707 case BUILT_IN_STRNDUP: | |
1708 case BUILT_IN_REALLOC: | |
1709 { | |
1710 ao_ref dref; | |
1711 tree size = NULL_TREE; | |
1712 if (gimple_call_num_args (call) == 2) | |
1713 size = gimple_call_arg (call, 1); | |
1714 ao_ref_init_from_ptr_and_size (&dref, | |
1715 gimple_call_arg (call, 0), | |
1716 size); | |
1717 return refs_may_alias_p_1 (&dref, ref, false); | |
1718 } | |
1719 /* These read memory pointed to by the first argument. */ | |
1720 case BUILT_IN_INDEX: | |
1721 case BUILT_IN_STRCHR: | |
1722 case BUILT_IN_STRRCHR: | |
1723 { | |
1724 ao_ref dref; | |
1725 ao_ref_init_from_ptr_and_size (&dref, | |
1726 gimple_call_arg (call, 0), | |
1727 NULL_TREE); | |
1728 return refs_may_alias_p_1 (&dref, ref, false); | |
1729 } | |
1730 /* These read memory pointed to by the first argument with size | |
1731 in the third argument. */ | |
1732 case BUILT_IN_MEMCHR: | |
1733 { | |
1734 ao_ref dref; | |
1735 ao_ref_init_from_ptr_and_size (&dref, | |
1736 gimple_call_arg (call, 0), | |
1737 gimple_call_arg (call, 2)); | |
1738 return refs_may_alias_p_1 (&dref, ref, false); | |
1739 } | |
1740 /* These read memory pointed to by the first and second arguments. */ | |
1741 case BUILT_IN_STRSTR: | |
1742 case BUILT_IN_STRPBRK: | |
1743 { | |
1744 ao_ref dref; | |
1745 ao_ref_init_from_ptr_and_size (&dref, | |
1746 gimple_call_arg (call, 0), | |
1747 NULL_TREE); | |
1748 if (refs_may_alias_p_1 (&dref, ref, false)) | |
1749 return true; | |
1750 ao_ref_init_from_ptr_and_size (&dref, | |
1751 gimple_call_arg (call, 1), | |
1752 NULL_TREE); | |
1753 return refs_may_alias_p_1 (&dref, ref, false); | |
1754 } | |
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 | 1759 case BUILT_IN_POSIX_MEMALIGN: |
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 | 1762 CASE_BUILT_IN_ALLOCA: |
1763 case BUILT_IN_STACK_SAVE: | |
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 | 1766 case BUILT_IN_TM_MEMSET: |
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 | 1786 case BUILT_IN_ASSUME_ALIGNED: |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 1826 /* FIXME: Callee can be an OMP builtin that does not have a call graph |
1827 node yet. We should enforce that there are nodes for all decls in the | |
1828 IL and remove this check instead. */ | |
1829 if (node | |
1830 && (not_read = ipa_reference_get_not_read_global (node)) | |
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 | 1841 else if ((TREE_CODE (base) == MEM_REF |
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 | 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 | 1877 |
1878 return false; | |
1879 } | |
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 | 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 | 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 | 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 | 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 | 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 | 1917 return ref_maybe_used_by_call_p (as_a <gcall *> (stmt), ref, tbaa_p); |
111 | 1918 else if (greturn *return_stmt = dyn_cast <greturn *> (stmt)) |
1919 { | |
1920 tree retval = gimple_return_retval (return_stmt); | |
1921 if (retval | |
1922 && TREE_CODE (retval) != SSA_NAME | |
1923 && !is_gimple_min_invariant (retval) | |
131 | 1924 && refs_may_alias_p (retval, ref, tbaa_p)) |
111 | 1925 return true; |
1926 /* If ref escapes the function then the return acts as a use. */ | |
1927 tree base = ao_ref_base (ref); | |
1928 if (!base) | |
1929 ; | |
1930 else if (DECL_P (base)) | |
1931 return is_global_var (base); | |
1932 else if (TREE_CODE (base) == MEM_REF | |
1933 || TREE_CODE (base) == TARGET_MEM_REF) | |
1934 return ptr_deref_may_alias_global_p (TREE_OPERAND (base, 0)); | |
1935 return false; | |
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 | 1941 bool |
131 | 1942 ref_maybe_used_by_stmt_p (gimple *stmt, tree ref, bool tbaa_p) |
111 | 1943 { |
1944 ao_ref r; | |
1945 ao_ref_init (&r, ref); | |
131 | 1946 return ref_maybe_used_by_stmt_p (stmt, &r, tbaa_p); |
111 | 1947 } |
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 | 1952 bool |
1953 call_may_clobber_ref_p_1 (gcall *call, ao_ref *ref) | |
0 | 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 | 1962 if (gimple_call_internal_p (call)) |
1963 switch (gimple_call_internal_fn (call)) | |
1964 { | |
1965 /* Treat these internal calls like ECF_PURE for aliasing, | |
1966 they don't write to any memory the program should care about. | |
1967 They have important other side-effects, and read memory, | |
1968 so can't be ECF_NOVOPS. */ | |
1969 case IFN_UBSAN_NULL: | |
1970 case IFN_UBSAN_BOUNDS: | |
1971 case IFN_UBSAN_VPTR: | |
1972 case IFN_UBSAN_OBJECT_SIZE: | |
1973 case IFN_UBSAN_PTR: | |
1974 case IFN_ASAN_CHECK: | |
1975 return false; | |
1976 default: | |
1977 break; | |
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 | 1988 /* A call that is not without side-effects might involve volatile |
1989 accesses and thus conflicts with all other volatile accesses. */ | |
1990 if (ref->volatile_p) | |
1991 return true; | |
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 | 2004 /* If the reference is based on a pointer that points to memory |
2005 that may not be written to then the call cannot possibly clobber it. */ | |
2006 if ((TREE_CODE (base) == MEM_REF | |
2007 || TREE_CODE (base) == TARGET_MEM_REF) | |
2008 && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME | |
2009 && SSA_NAME_POINTS_TO_READONLY_MEMORY (TREE_OPERAND (base, 0))) | |
2010 return false; | |
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 | 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 | 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 | 2033 case BUILT_IN_TM_MEMSET: |
2034 CASE_BUILT_IN_TM_STORE (1): | |
2035 CASE_BUILT_IN_TM_STORE (2): | |
2036 CASE_BUILT_IN_TM_STORE (4): | |
2037 CASE_BUILT_IN_TM_STORE (8): | |
2038 CASE_BUILT_IN_TM_STORE (FLOAT): | |
2039 CASE_BUILT_IN_TM_STORE (DOUBLE): | |
2040 CASE_BUILT_IN_TM_STORE (LDOUBLE): | |
2041 CASE_BUILT_IN_TM_STORE (M64): | |
2042 CASE_BUILT_IN_TM_STORE (M128): | |
2043 CASE_BUILT_IN_TM_STORE (M256): | |
2044 case BUILT_IN_TM_MEMCPY: | |
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 | 2049 /* Don't pass in size for strncat, as the maximum size |
2050 is strlen (dest) + n + 1 instead of n, resp. | |
2051 n + 1 at dest + strlen (dest), but strlen (dest) isn't | |
2052 known. */ | |
2053 if (gimple_call_num_args (call) == 3 | |
2054 && DECL_FUNCTION_CODE (callee) != BUILT_IN_STRNCAT) | |
2055 size = gimple_call_arg (call, 2); | |
2056 ao_ref_init_from_ptr_and_size (&dref, | |
2057 gimple_call_arg (call, 0), | |
2058 size); | |
2059 return refs_may_alias_p_1 (&dref, ref, false); | |
2060 } | |
2061 case BUILT_IN_STRCPY_CHK: | |
2062 case BUILT_IN_STRNCPY_CHK: | |
2063 case BUILT_IN_MEMCPY_CHK: | |
2064 case BUILT_IN_MEMMOVE_CHK: | |
2065 case BUILT_IN_MEMPCPY_CHK: | |
2066 case BUILT_IN_STPCPY_CHK: | |
2067 case BUILT_IN_STPNCPY_CHK: | |
2068 case BUILT_IN_STRCAT_CHK: | |
2069 case BUILT_IN_STRNCAT_CHK: | |
2070 case BUILT_IN_MEMSET_CHK: | |
2071 { | |
2072 ao_ref dref; | |
2073 tree size = NULL_TREE; | |
2074 /* Don't pass in size for __strncat_chk, as the maximum size | |
2075 is strlen (dest) + n + 1 instead of n, resp. | |
2076 n + 1 at dest + strlen (dest), but strlen (dest) isn't | |
2077 known. */ | |
2078 if (gimple_call_num_args (call) == 4 | |
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 | 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 | 2100 case BUILT_IN_STRDUP: |
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 | 2107 case BUILT_IN_STACK_SAVE: |
2108 CASE_BUILT_IN_ALLOCA: | |
2109 case BUILT_IN_ASSUME_ALIGNED: | |
2110 return false; | |
2111 /* But posix_memalign stores a pointer into the memory pointed to | |
2112 by its first argument. */ | |
2113 case BUILT_IN_POSIX_MEMALIGN: | |
2114 { | |
2115 tree ptrptr = gimple_call_arg (call, 0); | |
2116 ao_ref dref; | |
2117 ao_ref_init_from_ptr_and_size (&dref, ptrptr, | |
2118 TYPE_SIZE_UNIT (ptr_type_node)); | |
2119 return (refs_may_alias_p_1 (&dref, ref, false) | |
2120 || (flag_errno_math | |
2121 && targetm.ref_may_alias_errno (ref))); | |
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 | 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 | 2132 /* Realloc serves both as allocation point and deallocation point. */ |
2133 case BUILT_IN_REALLOC: | |
2134 { | |
2135 tree ptr = gimple_call_arg (call, 0); | |
2136 /* Unix98 specifies that errno is set on allocation failure. */ | |
2137 return ((flag_errno_math | |
2138 && targetm.ref_may_alias_errno (ref)) | |
2139 || ptr_deref_may_alias_ref_p_1 (ptr, ref)); | |
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 | 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 | 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 | 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 | 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 | 2216 if (callee != NULL_TREE && VAR_P (base) && TREE_STATIC (base)) |
0 | 2217 { |
111 | 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 | 2221 if (node |
2222 && (not_written = ipa_reference_get_not_written_global (node)) | |
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 | 2225 } |
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 | 2230 else if ((TREE_CODE (base) == MEM_REF |
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 | 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 | 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 | 2242 } |
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 | 2248 call_may_clobber_ref_p (gcall *call, tree ref) |
0 | 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 | 2259 } |
2260 | |
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 | 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 | 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 | 2279 |
111 | 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 | 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 | 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 | 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 | 2306 /* Return true if store1 and store2 described by corresponding tuples |
2307 <BASE, OFFSET, SIZE, MAX_SIZE> have the same size and store to the same | |
2308 address. */ | |
2309 | |
2310 static bool | |
131 | 2311 same_addr_size_stores_p (tree base1, poly_int64 offset1, poly_int64 size1, |
2312 poly_int64 max_size1, | |
2313 tree base2, poly_int64 offset2, poly_int64 size2, | |
2314 poly_int64 max_size2) | |
111 | 2315 { |
2316 /* Offsets need to be 0. */ | |
131 | 2317 if (maybe_ne (offset1, 0) |
2318 || maybe_ne (offset2, 0)) | |
111 | 2319 return false; |
2320 | |
2321 bool base1_obj_p = SSA_VAR_P (base1); | |
2322 bool base2_obj_p = SSA_VAR_P (base2); | |
2323 | |
2324 /* We need one object. */ | |
2325 if (base1_obj_p == base2_obj_p) | |
2326 return false; | |
2327 tree obj = base1_obj_p ? base1 : base2; | |
2328 | |
2329 /* And we need one MEM_REF. */ | |
2330 bool base1_memref_p = TREE_CODE (base1) == MEM_REF; | |
2331 bool base2_memref_p = TREE_CODE (base2) == MEM_REF; | |
2332 if (base1_memref_p == base2_memref_p) | |
2333 return false; | |
2334 tree memref = base1_memref_p ? base1 : base2; | |
2335 | |
2336 /* Sizes need to be valid. */ | |
131 | 2337 if (!known_size_p (max_size1) |
2338 || !known_size_p (max_size2) | |
2339 || !known_size_p (size1) | |
2340 || !known_size_p (size2)) | |
111 | 2341 return false; |
2342 | |
2343 /* Max_size needs to match size. */ | |
131 | 2344 if (maybe_ne (max_size1, size1) |
2345 || maybe_ne (max_size2, size2)) | |
111 | 2346 return false; |
2347 | |
2348 /* Sizes need to match. */ | |
131 | 2349 if (maybe_ne (size1, size2)) |
111 | 2350 return false; |
2351 | |
2352 | |
2353 /* Check that memref is a store to pointer with singleton points-to info. */ | |
2354 if (!integer_zerop (TREE_OPERAND (memref, 1))) | |
2355 return false; | |
2356 tree ptr = TREE_OPERAND (memref, 0); | |
2357 if (TREE_CODE (ptr) != SSA_NAME) | |
2358 return false; | |
2359 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr); | |
2360 unsigned int pt_uid; | |
2361 if (pi == NULL | |
2362 || !pt_solution_singleton_or_null_p (&pi->pt, &pt_uid)) | |
2363 return false; | |
2364 | |
2365 /* Be conservative with non-call exceptions when the address might | |
2366 be NULL. */ | |
2367 if (flag_non_call_exceptions && pi->pt.null) | |
2368 return false; | |
2369 | |
2370 /* Check that ptr points relative to obj. */ | |
2371 unsigned int obj_uid = DECL_PT_UID (obj); | |
2372 if (obj_uid != pt_uid) | |
2373 return false; | |
2374 | |
2375 /* Check that the object size is the same as the store size. That ensures us | |
2376 that ptr points to the start of obj. */ | |
131 | 2377 return (DECL_SIZE (obj) |
2378 && poly_int_tree_p (DECL_SIZE (obj)) | |
2379 && known_eq (wi::to_poly_offset (DECL_SIZE (obj)), size1)); | |
111 | 2380 } |
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 | 2385 bool |
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 | 2388 if (!ao_ref_base (ref)) |
2389 return false; | |
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 | 2392 && TREE_CODE (gimple_get_lhs (stmt)) != SSA_NAME |
2393 /* The assignment is not necessarily carried out if it can throw | |
2394 and we can catch it in the current function where we could inspect | |
2395 the previous value. | |
2396 ??? We only need to care about the RHS throwing. For aggregate | |
2397 assignments or similar calls and non-call exceptions the LHS | |
2398 might throw as well. */ | |
131 | 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 | 2401 tree lhs = gimple_get_lhs (stmt); |
2402 /* If LHS is literally a base of the access we are done. */ | |
2403 if (ref->ref) | |
2404 { | |
2405 tree base = ref->ref; | |
2406 tree innermost_dropped_array_ref = NULL_TREE; | |
2407 if (handled_component_p (base)) | |
2408 { | |
2409 tree saved_lhs0 = NULL_TREE; | |
2410 if (handled_component_p (lhs)) | |
2411 { | |
2412 saved_lhs0 = TREE_OPERAND (lhs, 0); | |
2413 TREE_OPERAND (lhs, 0) = integer_zero_node; | |
2414 } | |
2415 do | |
2416 { | |
2417 /* Just compare the outermost handled component, if | |
2418 they are equal we have found a possible common | |
2419 base. */ | |
2420 tree saved_base0 = TREE_OPERAND (base, 0); | |
2421 TREE_OPERAND (base, 0) = integer_zero_node; | |
2422 bool res = operand_equal_p (lhs, base, 0); | |
2423 TREE_OPERAND (base, 0) = saved_base0; | |
2424 if (res) | |
2425 break; | |
2426 /* Remember if we drop an array-ref that we need to | |
2427 double-check not being at struct end. */ | |
2428 if (TREE_CODE (base) == ARRAY_REF | |
2429 || TREE_CODE (base) == ARRAY_RANGE_REF) | |
2430 innermost_dropped_array_ref = base; | |
2431 /* Otherwise drop handled components of the access. */ | |
2432 base = saved_base0; | |
2433 } | |
2434 while (handled_component_p (base)); | |
2435 if (saved_lhs0) | |
2436 TREE_OPERAND (lhs, 0) = saved_lhs0; | |
2437 } | |
2438 /* Finally check if the lhs has the same address and size as the | |
2439 base candidate of the access. Watch out if we have dropped | |
2440 an array-ref that was at struct end, this means ref->ref may | |
2441 be outside of the TYPE_SIZE of its base. */ | |
2442 if ((! innermost_dropped_array_ref | |
2443 || ! array_at_struct_end_p (innermost_dropped_array_ref)) | |
2444 && (lhs == base | |
2445 || (((TYPE_SIZE (TREE_TYPE (lhs)) | |
2446 == TYPE_SIZE (TREE_TYPE (base))) | |
2447 || (TYPE_SIZE (TREE_TYPE (lhs)) | |
2448 && TYPE_SIZE (TREE_TYPE (base)) | |
2449 && operand_equal_p (TYPE_SIZE (TREE_TYPE (lhs)), | |
2450 TYPE_SIZE (TREE_TYPE (base)), | |
2451 0))) | |
2452 && operand_equal_p (lhs, base, | |
2453 OEP_ADDRESS_OF | |
2454 | OEP_MATCH_SIDE_EFFECTS)))) | |
2455 return true; | |
2456 } | |
2457 | |
2458 /* Now look for non-literal equal bases with the restriction of | |
2459 handling constant offset and size. */ | |
2460 /* For a must-alias check we need to be able to constrain | |
2461 the access properly. */ | |
131 | 2462 if (!ref->max_size_known_p ()) |
111 | 2463 return false; |
131 | 2464 poly_int64 size, offset, max_size, ref_offset = ref->offset; |
111 | 2465 bool reverse; |
131 | 2466 tree base = get_ref_base_and_extent (lhs, &offset, &size, &max_size, |
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 | 2470 if (base != ref->base) |
2471 { | |
2472 /* Try using points-to info. */ | |
2473 if (same_addr_size_stores_p (base, offset, size, max_size, ref->base, | |
2474 ref->offset, ref->size, ref->max_size)) | |
2475 return true; | |
2476 | |
2477 /* If both base and ref->base are MEM_REFs, only compare the | |
2478 first operand, and if the second operand isn't equal constant, | |
2479 try to add the offsets into offset and ref_offset. */ | |
2480 if (TREE_CODE (base) == MEM_REF && TREE_CODE (ref->base) == MEM_REF | |
2481 && TREE_OPERAND (base, 0) == TREE_OPERAND (ref->base, 0)) | |
2482 { | |
2483 if (!tree_int_cst_equal (TREE_OPERAND (base, 1), | |
2484 TREE_OPERAND (ref->base, 1))) | |
2485 { | |
131 | 2486 poly_offset_int off1 = mem_ref_offset (base); |
111 | 2487 off1 <<= LOG2_BITS_PER_UNIT; |
2488 off1 += offset; | |
131 | 2489 poly_offset_int off2 = mem_ref_offset (ref->base); |
111 | 2490 off2 <<= LOG2_BITS_PER_UNIT; |
2491 off2 += ref_offset; | |
131 | 2492 if (!off1.to_shwi (&offset) || !off2.to_shwi (&ref_offset)) |
111 | 2493 size = -1; |
2494 } | |
2495 } | |
2496 else | |
2497 size = -1; | |
2498 } | |
2499 /* For a must-alias check we need to be able to constrain | |
2500 the access properly. */ | |
131 | 2501 if (known_eq (size, max_size) |
2502 && known_subrange_p (ref_offset, ref->max_size, offset, size)) | |
2503 return true; | |
111 | 2504 } |
2505 | |
2506 if (is_gimple_call (stmt)) | |
2507 { | |
2508 tree callee = gimple_call_fndecl (stmt); | |
2509 if (callee != NULL_TREE | |
2510 && gimple_call_builtin_p (stmt, BUILT_IN_NORMAL)) | |
2511 switch (DECL_FUNCTION_CODE (callee)) | |
2512 { | |
2513 case BUILT_IN_FREE: | |
2514 { | |
2515 tree ptr = gimple_call_arg (stmt, 0); | |
2516 tree base = ao_ref_base (ref); | |
2517 if (base && TREE_CODE (base) == MEM_REF | |
2518 && TREE_OPERAND (base, 0) == ptr) | |
2519 return true; | |
2520 break; | |
2521 } | |
2522 | |
2523 case BUILT_IN_MEMCPY: | |
2524 case BUILT_IN_MEMPCPY: | |
2525 case BUILT_IN_MEMMOVE: | |
2526 case BUILT_IN_MEMSET: | |
2527 case BUILT_IN_MEMCPY_CHK: | |
2528 case BUILT_IN_MEMPCPY_CHK: | |
2529 case BUILT_IN_MEMMOVE_CHK: | |
2530 case BUILT_IN_MEMSET_CHK: | |
2531 case BUILT_IN_STRNCPY: | |
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 | 2534 /* For a must-alias check we need to be able to constrain |
2535 the access properly. */ | |
131 | 2536 if (!ref->max_size_known_p ()) |
111 | 2537 return false; |
2538 tree dest = gimple_call_arg (stmt, 0); | |
2539 tree len = gimple_call_arg (stmt, 2); | |
131 | 2540 if (!poly_int_tree_p (len)) |
111 | 2541 return false; |
2542 tree rbase = ref->base; | |
131 | 2543 poly_offset_int roffset = ref->offset; |
111 | 2544 ao_ref dref; |
2545 ao_ref_init_from_ptr_and_size (&dref, dest, len); | |
2546 tree base = ao_ref_base (&dref); | |
131 | 2547 poly_offset_int offset = dref.offset; |
2548 if (!base || !known_size_p (dref.size)) | |
111 | 2549 return false; |
2550 if (TREE_CODE (base) == MEM_REF) | |
2551 { | |
2552 if (TREE_CODE (rbase) != MEM_REF) | |
2553 return false; | |
2554 // Compare pointers. | |
2555 offset += mem_ref_offset (base) << LOG2_BITS_PER_UNIT; | |
2556 roffset += mem_ref_offset (rbase) << LOG2_BITS_PER_UNIT; | |
2557 base = TREE_OPERAND (base, 0); | |
2558 rbase = TREE_OPERAND (rbase, 0); | |
2559 } | |
2560 if (base == rbase | |
131 | 2561 && known_subrange_p (roffset, ref->max_size, offset, |
2562 wi::to_poly_offset (len) | |
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 | 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 | 2567 |
2568 case BUILT_IN_VA_END: | |
2569 { | |
2570 tree ptr = gimple_call_arg (stmt, 0); | |
2571 if (TREE_CODE (ptr) == ADDR_EXPR) | |
2572 { | |
2573 tree base = ao_ref_base (ref); | |
2574 if (TREE_OPERAND (ptr, 0) == base) | |
2575 return true; | |
2576 } | |
2577 break; | |
2578 } | |
2579 | |
2580 default:; | |
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 | 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 | 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 | 2600 maybe_skip_until (gimple *phi, tree target, ao_ref *ref, |
2601 tree vuse, unsigned int *cnt, bitmap *visited, | |
2602 bool abort_on_visited, | |
2603 void *(*translate)(ao_ref *, tree, void *, bool *), | |
2604 void *data) | |
0 | 2605 { |
111 | 2606 basic_block bb = gimple_bb (phi); |
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 | 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 | 2622 return !abort_on_visited; |
2623 vuse = get_continuation_for_phi (def_stmt, ref, cnt, | |
2624 visited, abort_on_visited, | |
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 | 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 | 2632 else |
2633 { | |
2634 /* A clobbering statement or the end of the IL ends it failing. */ | |
2635 ++*cnt; | |
2636 if (stmt_may_clobber_ref_p_1 (def_stmt, ref)) | |
2637 { | |
2638 bool disambiguate_only = true; | |
2639 if (translate | |
2640 && (*translate) (ref, vuse, data, &disambiguate_only) == NULL) | |
2641 ; | |
2642 else | |
2643 return false; | |
2644 } | |
2645 } | |
2646 /* If we reach a new basic-block see if we already skipped it | |
2647 in a previous walk that ended successfully. */ | |
2648 if (gimple_bb (def_stmt) != bb) | |
2649 { | |
2650 if (!bitmap_set_bit (*visited, SSA_NAME_VERSION (vuse))) | |
2651 return !abort_on_visited; | |
2652 bb = gimple_bb (def_stmt); | |
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 | 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 | 2663 clobber REF. Increments *CNT for each alias disambiguation done. |
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 | 2667 get_continuation_for_phi (gimple *phi, ao_ref *ref, |
2668 unsigned int *cnt, bitmap *visited, | |
2669 bool abort_on_visited, | |
2670 void *(*translate)(ao_ref *, tree, void *, bool *), | |
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 | 2678 |
111 | 2679 /* For two or more arguments try to pairwise skip non-aliasing code |
2680 until we hit the phi argument definition that dominates the other one. */ | |
2681 basic_block phi_bb = gimple_bb (phi); | |
2682 tree arg0, arg1; | |
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 | 2685 /* Find a candidate for the virtual operand which definition |
2686 dominates those of all others. */ | |
2687 /* First look if any of the args themselves satisfy this. */ | |
2688 for (i = 0; i < nargs; ++i) | |
2689 { | |
2690 arg0 = PHI_ARG_DEF (phi, i); | |
2691 if (SSA_NAME_IS_DEFAULT_DEF (arg0)) | |
2692 break; | |
2693 basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (arg0)); | |
2694 if (def_bb != phi_bb | |
2695 && dominated_by_p (CDI_DOMINATORS, phi_bb, def_bb)) | |
2696 break; | |
2697 arg0 = NULL_TREE; | |
2698 } | |
2699 /* If not, look if we can reach such candidate by walking defs | |
2700 of a PHI arg without crossing other PHIs. */ | |
2701 if (! arg0) | |
2702 for (i = 0; i < nargs; ++i) | |
2703 { | |
2704 arg0 = PHI_ARG_DEF (phi, i); | |
2705 gimple *def = SSA_NAME_DEF_STMT (arg0); | |
2706 /* Backedges can't work. */ | |
2707 if (dominated_by_p (CDI_DOMINATORS, | |
2708 gimple_bb (def), phi_bb)) | |
2709 continue; | |
2710 /* See below. */ | |
2711 if (gimple_code (def) == GIMPLE_PHI) | |
2712 continue; | |
2713 while (! dominated_by_p (CDI_DOMINATORS, | |
2714 phi_bb, gimple_bb (def))) | |
2715 { | |
2716 arg0 = gimple_vuse (def); | |
2717 if (SSA_NAME_IS_DEFAULT_DEF (arg0)) | |
2718 break; | |
2719 def = SSA_NAME_DEF_STMT (arg0); | |
2720 if (gimple_code (def) == GIMPLE_PHI) | |
2721 { | |
2722 /* Do not try to look through arbitrarily complicated | |
2723 CFGs. For those looking for the first VUSE starting | |
2724 from the end of the immediate dominator of phi_bb | |
2725 is likely faster. */ | |
2726 arg0 = NULL_TREE; | |
2727 goto next; | |
2728 } | |
2729 } | |
2730 break; | |
2731 next:; | |
2732 } | |
2733 if (! arg0) | |
2734 return NULL_TREE; | |
2735 | |
2736 /* Then check against the found candidate. */ | |
2737 for (i = 0; i < nargs; ++i) | |
2738 { | |
2739 arg1 = PHI_ARG_DEF (phi, i); | |
2740 if (arg1 == arg0) | |
2741 ; | |
2742 else if (! maybe_skip_until (phi, arg0, ref, arg1, cnt, visited, | |
131 | 2743 abort_on_visited, |
2744 /* Do not translate when walking over | |
2745 backedges. */ | |
2746 dominated_by_p | |
2747 (CDI_DOMINATORS, | |
2748 gimple_bb (SSA_NAME_DEF_STMT (arg1)), | |
2749 phi_bb) | |
2750 ? NULL : translate, data)) | |
111 | 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 | 2754 return arg0; |
0 | 2755 } |
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 | 2773 VALUEIZE if non-NULL is called with the next VUSE that is considered |
2774 and return value is substituted for that. This can be used to | |
2775 implement optimistic value-numbering for example. Note that the | |
2776 VUSE argument is assumed to be valueized already. | |
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 | 2782 void *(*walker)(ao_ref *, tree, unsigned int, void *), |
2783 void *(*translate)(ao_ref *, tree, void *, bool *), | |
2784 tree (*valueize)(tree), | |
2785 void *data) | |
0 | 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 | 2789 unsigned int cnt = 0; |
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 | 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 | 2799 res = (*walker) (ref, vuse, cnt, data); |
2800 /* Abort walk. */ | |
2801 if (res == (void *)-1) | |
2802 { | |
2803 res = NULL; | |
2804 break; | |
2805 } | |
2806 /* Lookup succeeded. */ | |
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 | 2810 if (valueize) |
131 | 2811 { |
2812 vuse = valueize (vuse); | |
2813 if (!vuse) | |
2814 { | |
2815 res = NULL; | |
2816 break; | |
2817 } | |
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 | 2823 vuse = get_continuation_for_phi (def_stmt, ref, &cnt, |
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 | 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 | 2832 bool disambiguate_only = false; |
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 | 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 | 2858 |
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 | 2866 |
111 | 2867 If function entry is reached, FUNCTION_ENTRY_REACHED is set to true. |
2868 The pointer may be NULL and then we do not track this information. | |
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 | 2874 The function returns the number of statements walked or -1 if |
2875 LIMIT stmts were walked and the walk was aborted at this point. | |
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 | 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 | 2881 bitmap *visited, unsigned int cnt, |
2882 bool *function_entry_reached, unsigned limit) | |
0 | 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 | 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 | 2893 { |
2894 if (function_entry_reached) | |
2895 *function_entry_reached = true; | |
2896 return cnt; | |
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 | 2904 { |
2905 int res = walk_aliased_vdefs_1 (ref, | |
2906 gimple_phi_arg_def (def_stmt, i), | |
2907 walker, data, visited, cnt, | |
2908 function_entry_reached, limit); | |
2909 if (res == -1) | |
2910 return -1; | |
2911 cnt = res; | |
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 | 2918 if (cnt == limit) |
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 | 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 | 2933 bitmap *visited, |
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 | 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 | 2941 if (function_entry_reached) |
2942 *function_entry_reached = false; | |
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 | 2945 visited ? visited : &local_visited, 0, |
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 |