File: | build/gcc/fold-const.cc |
Warning: | line 8489, column 9 Value stored to 'diff' during its initialization is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* Fold a constant sub-tree into a single node for C-compiler |
2 | Copyright (C) 1987-2023 Free Software Foundation, Inc. |
3 | |
4 | This file is part of GCC. |
5 | |
6 | GCC is free software; you can redistribute it and/or modify it under |
7 | the terms of the GNU General Public License as published by the Free |
8 | Software Foundation; either version 3, or (at your option) any later |
9 | version. |
10 | |
11 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
12 | WARRANTY; without even the implied warranty of MERCHANTABILITY or |
13 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
14 | for more details. |
15 | |
16 | You should have received a copy of the GNU General Public License |
17 | along with GCC; see the file COPYING3. If not see |
18 | <http://www.gnu.org/licenses/>. */ |
19 | |
20 | /*@@ This file should be rewritten to use an arbitrary precision |
21 | @@ representation for "struct tree_int_cst" and "struct tree_real_cst". |
22 | @@ Perhaps the routines could also be used for bc/dc, and made a lib. |
23 | @@ The routines that translate from the ap rep should |
24 | @@ warn if precision et. al. is lost. |
25 | @@ This would also make life easier when this technology is used |
26 | @@ for cross-compilers. */ |
27 | |
28 | /* The entry points in this file are fold, size_int_wide and size_binop. |
29 | |
30 | fold takes a tree as argument and returns a simplified tree. |
31 | |
32 | size_binop takes a tree code for an arithmetic operation |
33 | and two operands that are trees, and produces a tree for the |
34 | result, assuming the type comes from `sizetype'. |
35 | |
36 | size_int takes an integer value, and creates a tree constant |
37 | with type from `sizetype'. |
38 | |
39 | Note: Since the folders get called on non-gimple code as well as |
40 | gimple code, we need to handle GIMPLE tuples as well as their |
41 | corresponding tree equivalents. */ |
42 | |
43 | #include "config.h" |
44 | #include "system.h" |
45 | #include "coretypes.h" |
46 | #include "backend.h" |
47 | #include "target.h" |
48 | #include "rtl.h" |
49 | #include "tree.h" |
50 | #include "gimple.h" |
51 | #include "predict.h" |
52 | #include "memmodel.h" |
53 | #include "tm_p.h" |
54 | #include "tree-ssa-operands.h" |
55 | #include "optabs-query.h" |
56 | #include "cgraph.h" |
57 | #include "diagnostic-core.h" |
58 | #include "flags.h" |
59 | #include "alias.h" |
60 | #include "fold-const.h" |
61 | #include "fold-const-call.h" |
62 | #include "stor-layout.h" |
63 | #include "calls.h" |
64 | #include "tree-iterator.h" |
65 | #include "expr.h" |
66 | #include "intl.h" |
67 | #include "langhooks.h" |
68 | #include "tree-eh.h" |
69 | #include "gimplify.h" |
70 | #include "tree-dfa.h" |
71 | #include "builtins.h" |
72 | #include "generic-match.h" |
73 | #include "gimple-iterator.h" |
74 | #include "gimple-fold.h" |
75 | #include "tree-into-ssa.h" |
76 | #include "md5.h" |
77 | #include "case-cfn-macros.h" |
78 | #include "stringpool.h" |
79 | #include "tree-vrp.h" |
80 | #include "tree-ssanames.h" |
81 | #include "selftest.h" |
82 | #include "stringpool.h" |
83 | #include "attribs.h" |
84 | #include "tree-vector-builder.h" |
85 | #include "vec-perm-indices.h" |
86 | #include "asan.h" |
87 | #include "gimple-range.h" |
88 | |
89 | /* Nonzero if we are folding constants inside an initializer or a C++ |
90 | manifestly-constant-evaluated context; zero otherwise. |
91 | Should be used when folding in initializer enables additional |
92 | optimizations. */ |
93 | int folding_initializer = 0; |
94 | |
95 | /* Nonzero if we are folding C++ manifestly-constant-evaluated context; zero |
96 | otherwise. |
97 | Should be used when certain constructs shouldn't be optimized |
98 | during folding in that context. */ |
99 | bool folding_cxx_constexpr = false; |
100 | |
101 | /* The following constants represent a bit based encoding of GCC's |
102 | comparison operators. This encoding simplifies transformations |
103 | on relational comparison operators, such as AND and OR. */ |
104 | enum comparison_code { |
105 | COMPCODE_FALSE = 0, |
106 | COMPCODE_LT = 1, |
107 | COMPCODE_EQ = 2, |
108 | COMPCODE_LE = 3, |
109 | COMPCODE_GT = 4, |
110 | COMPCODE_LTGT = 5, |
111 | COMPCODE_GE = 6, |
112 | COMPCODE_ORD = 7, |
113 | COMPCODE_UNORD = 8, |
114 | COMPCODE_UNLT = 9, |
115 | COMPCODE_UNEQ = 10, |
116 | COMPCODE_UNLE = 11, |
117 | COMPCODE_UNGT = 12, |
118 | COMPCODE_NE = 13, |
119 | COMPCODE_UNGE = 14, |
120 | COMPCODE_TRUE = 15 |
121 | }; |
122 | |
123 | static bool negate_expr_p (tree); |
124 | static tree negate_expr (tree); |
125 | static tree associate_trees (location_t, tree, tree, enum tree_code, tree); |
126 | static enum comparison_code comparison_to_compcode (enum tree_code); |
127 | static enum tree_code compcode_to_comparison (enum comparison_code); |
128 | static bool twoval_comparison_p (tree, tree *, tree *); |
129 | static tree eval_subst (location_t, tree, tree, tree, tree, tree); |
130 | static tree optimize_bit_field_compare (location_t, enum tree_code, |
131 | tree, tree, tree); |
132 | static bool simple_operand_p (const_tree); |
133 | static tree range_binop (enum tree_code, tree, tree, int, tree, int); |
134 | static tree range_predecessor (tree); |
135 | static tree range_successor (tree); |
136 | static tree fold_range_test (location_t, enum tree_code, tree, tree, tree); |
137 | static tree fold_cond_expr_with_comparison (location_t, tree, enum tree_code, |
138 | tree, tree, tree, tree); |
139 | static tree unextend (tree, int, int, tree); |
140 | static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *); |
141 | static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *); |
142 | static tree fold_binary_op_with_conditional_arg (location_t, |
143 | enum tree_code, tree, |
144 | tree, tree, |
145 | tree, tree, int); |
146 | static tree fold_negate_const (tree, tree); |
147 | static tree fold_not_const (const_tree, tree); |
148 | static tree fold_relational_const (enum tree_code, tree, tree, tree); |
149 | static tree fold_convert_const (enum tree_code, tree, tree); |
150 | static tree fold_view_convert_expr (tree, tree); |
151 | static tree fold_negate_expr (location_t, tree); |
152 | |
153 | |
154 | /* Return EXPR_LOCATION of T if it is not UNKNOWN_LOCATION. |
155 | Otherwise, return LOC. */ |
156 | |
157 | static location_t |
158 | expr_location_or (tree t, location_t loc) |
159 | { |
160 | location_t tloc = EXPR_LOCATION (t)((((t)) && ((tree_code_type_tmpl <0>::tree_code_type [(int) (((enum tree_code) ((t))->base.code))]) >= tcc_reference && (tree_code_type_tmpl <0>::tree_code_type[(int ) (((enum tree_code) ((t))->base.code))]) <= tcc_expression )) ? (t)->exp.locus : ((location_t) 0)); |
161 | return tloc == UNKNOWN_LOCATION((location_t) 0) ? loc : tloc; |
162 | } |
163 | |
164 | /* Similar to protected_set_expr_location, but never modify x in place, |
165 | if location can and needs to be set, unshare it. */ |
166 | |
167 | tree |
168 | protected_set_expr_location_unshare (tree x, location_t loc) |
169 | { |
170 | if (CAN_HAVE_LOCATION_P (x)((x) && ((tree_code_type_tmpl <0>::tree_code_type [(int) (((enum tree_code) (x)->base.code))]) >= tcc_reference && (tree_code_type_tmpl <0>::tree_code_type[(int ) (((enum tree_code) (x)->base.code))]) <= tcc_expression )) |
171 | && EXPR_LOCATION (x)((((x)) && ((tree_code_type_tmpl <0>::tree_code_type [(int) (((enum tree_code) ((x))->base.code))]) >= tcc_reference && (tree_code_type_tmpl <0>::tree_code_type[(int ) (((enum tree_code) ((x))->base.code))]) <= tcc_expression )) ? (x)->exp.locus : ((location_t) 0)) != loc |
172 | && !(TREE_CODE (x)((enum tree_code) (x)->base.code) == SAVE_EXPR |
173 | || TREE_CODE (x)((enum tree_code) (x)->base.code) == TARGET_EXPR |
174 | || TREE_CODE (x)((enum tree_code) (x)->base.code) == BIND_EXPR)) |
175 | { |
176 | x = copy_node (x); |
177 | SET_EXPR_LOCATION (x, loc)(expr_check (((x)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 177, __FUNCTION__))->exp.locus = (loc); |
178 | } |
179 | return x; |
180 | } |
181 | |
182 | /* If ARG2 divides ARG1 with zero remainder, carries out the exact |
183 | division and returns the quotient. Otherwise returns |
184 | NULL_TREE. */ |
185 | |
186 | tree |
187 | div_if_zero_remainder (const_tree arg1, const_tree arg2) |
188 | { |
189 | widest_int quo; |
190 | |
191 | if (wi::multiple_of_p (wi::to_widest (arg1), wi::to_widest (arg2), |
192 | SIGNED, &quo)) |
193 | return wide_int_to_tree (TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 193, __FUNCTION__))->typed.type), quo); |
194 | |
195 | return NULL_TREE(tree) __null; |
196 | } |
197 | |
198 | /* This is nonzero if we should defer warnings about undefined |
199 | overflow. This facility exists because these warnings are a |
200 | special case. The code to estimate loop iterations does not want |
201 | to issue any warnings, since it works with expressions which do not |
202 | occur in user code. Various bits of cleanup code call fold(), but |
203 | only use the result if it has certain characteristics (e.g., is a |
204 | constant); that code only wants to issue a warning if the result is |
205 | used. */ |
206 | |
207 | static int fold_deferring_overflow_warnings; |
208 | |
209 | /* If a warning about undefined overflow is deferred, this is the |
210 | warning. Note that this may cause us to turn two warnings into |
211 | one, but that is fine since it is sufficient to only give one |
212 | warning per expression. */ |
213 | |
214 | static const char* fold_deferred_overflow_warning; |
215 | |
216 | /* If a warning about undefined overflow is deferred, this is the |
217 | level at which the warning should be emitted. */ |
218 | |
219 | static enum warn_strict_overflow_code fold_deferred_overflow_code; |
220 | |
221 | /* Start deferring overflow warnings. We could use a stack here to |
222 | permit nested calls, but at present it is not necessary. */ |
223 | |
224 | void |
225 | fold_defer_overflow_warnings (void) |
226 | { |
227 | ++fold_deferring_overflow_warnings; |
228 | } |
229 | |
230 | /* Stop deferring overflow warnings. If there is a pending warning, |
231 | and ISSUE is true, then issue the warning if appropriate. STMT is |
232 | the statement with which the warning should be associated (used for |
233 | location information); STMT may be NULL. CODE is the level of the |
234 | warning--a warn_strict_overflow_code value. This function will use |
235 | the smaller of CODE and the deferred code when deciding whether to |
236 | issue the warning. CODE may be zero to mean to always use the |
237 | deferred code. */ |
238 | |
239 | void |
240 | fold_undefer_overflow_warnings (bool issue, const gimple *stmt, int code) |
241 | { |
242 | const char *warnmsg; |
243 | location_t locus; |
244 | |
245 | gcc_assert (fold_deferring_overflow_warnings > 0)((void)(!(fold_deferring_overflow_warnings > 0) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 245, __FUNCTION__), 0 : 0)); |
246 | --fold_deferring_overflow_warnings; |
247 | if (fold_deferring_overflow_warnings > 0) |
248 | { |
249 | if (fold_deferred_overflow_warning != NULL__null |
250 | && code != 0 |
251 | && code < (int) fold_deferred_overflow_code) |
252 | fold_deferred_overflow_code = (enum warn_strict_overflow_code) code; |
253 | return; |
254 | } |
255 | |
256 | warnmsg = fold_deferred_overflow_warning; |
257 | fold_deferred_overflow_warning = NULL__null; |
258 | |
259 | if (!issue || warnmsg == NULL__null) |
260 | return; |
261 | |
262 | if (warning_suppressed_p (stmt, OPT_Wstrict_overflow)) |
263 | return; |
264 | |
265 | /* Use the smallest code level when deciding to issue the |
266 | warning. */ |
267 | if (code == 0 || code > (int) fold_deferred_overflow_code) |
268 | code = fold_deferred_overflow_code; |
269 | |
270 | if (!issue_strict_overflow_warning (code)(global_options.x_warn_strict_overflow >= (int) (code))) |
271 | return; |
272 | |
273 | if (stmt == NULL__null) |
274 | locus = input_location; |
275 | else |
276 | locus = gimple_location (stmt); |
277 | warning_at (locus, OPT_Wstrict_overflow, "%s", warnmsg); |
278 | } |
279 | |
280 | /* Stop deferring overflow warnings, ignoring any deferred |
281 | warnings. */ |
282 | |
283 | void |
284 | fold_undefer_and_ignore_overflow_warnings (void) |
285 | { |
286 | fold_undefer_overflow_warnings (false, NULL__null, 0); |
287 | } |
288 | |
289 | /* Whether we are deferring overflow warnings. */ |
290 | |
291 | bool |
292 | fold_deferring_overflow_warnings_p (void) |
293 | { |
294 | return fold_deferring_overflow_warnings > 0; |
295 | } |
296 | |
297 | /* This is called when we fold something based on the fact that signed |
298 | overflow is undefined. */ |
299 | |
300 | void |
301 | fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc) |
302 | { |
303 | if (fold_deferring_overflow_warnings > 0) |
304 | { |
305 | if (fold_deferred_overflow_warning == NULL__null |
306 | || wc < fold_deferred_overflow_code) |
307 | { |
308 | fold_deferred_overflow_warning = gmsgid; |
309 | fold_deferred_overflow_code = wc; |
310 | } |
311 | } |
312 | else if (issue_strict_overflow_warning (wc)(global_options.x_warn_strict_overflow >= (int) (wc))) |
313 | warning (OPT_Wstrict_overflow, gmsgid); |
314 | } |
315 | |
316 | /* Return true if the built-in mathematical function specified by CODE |
317 | is odd, i.e. -f(x) == f(-x). */ |
318 | |
319 | bool |
320 | negate_mathfn_p (combined_fn fn) |
321 | { |
322 | switch (fn) |
323 | { |
324 | CASE_CFN_ASINcase CFN_ASIN: case CFN_BUILT_IN_ASINF: case CFN_BUILT_IN_ASIN : case CFN_BUILT_IN_ASINL: |
325 | CASE_CFN_ASIN_FNcase CFN_BUILT_IN_ASINF16: case CFN_BUILT_IN_ASINF32: case CFN_BUILT_IN_ASINF64 : case CFN_BUILT_IN_ASINF128: case CFN_BUILT_IN_ASINF32X: case CFN_BUILT_IN_ASINF64X: case CFN_BUILT_IN_ASINF128X: |
326 | CASE_CFN_ASINHcase CFN_ASINH: case CFN_BUILT_IN_ASINHF: case CFN_BUILT_IN_ASINH : case CFN_BUILT_IN_ASINHL: |
327 | CASE_CFN_ASINH_FNcase CFN_BUILT_IN_ASINHF16: case CFN_BUILT_IN_ASINHF32: case CFN_BUILT_IN_ASINHF64 : case CFN_BUILT_IN_ASINHF128: case CFN_BUILT_IN_ASINHF32X: case CFN_BUILT_IN_ASINHF64X: case CFN_BUILT_IN_ASINHF128X: |
328 | CASE_CFN_ATANcase CFN_ATAN: case CFN_BUILT_IN_ATANF: case CFN_BUILT_IN_ATAN : case CFN_BUILT_IN_ATANL: |
329 | CASE_CFN_ATAN_FNcase CFN_BUILT_IN_ATANF16: case CFN_BUILT_IN_ATANF32: case CFN_BUILT_IN_ATANF64 : case CFN_BUILT_IN_ATANF128: case CFN_BUILT_IN_ATANF32X: case CFN_BUILT_IN_ATANF64X: case CFN_BUILT_IN_ATANF128X: |
330 | CASE_CFN_ATANHcase CFN_ATANH: case CFN_BUILT_IN_ATANHF: case CFN_BUILT_IN_ATANH : case CFN_BUILT_IN_ATANHL: |
331 | CASE_CFN_ATANH_FNcase CFN_BUILT_IN_ATANHF16: case CFN_BUILT_IN_ATANHF32: case CFN_BUILT_IN_ATANHF64 : case CFN_BUILT_IN_ATANHF128: case CFN_BUILT_IN_ATANHF32X: case CFN_BUILT_IN_ATANHF64X: case CFN_BUILT_IN_ATANHF128X: |
332 | CASE_CFN_CASINcase CFN_BUILT_IN_CASINF: case CFN_BUILT_IN_CASIN: case CFN_BUILT_IN_CASINL: |
333 | CASE_CFN_CASIN_FNcase CFN_BUILT_IN_CASINF16: case CFN_BUILT_IN_CASINF32: case CFN_BUILT_IN_CASINF64 : case CFN_BUILT_IN_CASINF128: case CFN_BUILT_IN_CASINF32X: case CFN_BUILT_IN_CASINF64X: case CFN_BUILT_IN_CASINF128X: |
334 | CASE_CFN_CASINHcase CFN_BUILT_IN_CASINHF: case CFN_BUILT_IN_CASINH: case CFN_BUILT_IN_CASINHL: |
335 | CASE_CFN_CASINH_FNcase CFN_BUILT_IN_CASINHF16: case CFN_BUILT_IN_CASINHF32: case CFN_BUILT_IN_CASINHF64: case CFN_BUILT_IN_CASINHF128: case CFN_BUILT_IN_CASINHF32X : case CFN_BUILT_IN_CASINHF64X: case CFN_BUILT_IN_CASINHF128X: |
336 | CASE_CFN_CATANcase CFN_BUILT_IN_CATANF: case CFN_BUILT_IN_CATAN: case CFN_BUILT_IN_CATANL: |
337 | CASE_CFN_CATAN_FNcase CFN_BUILT_IN_CATANF16: case CFN_BUILT_IN_CATANF32: case CFN_BUILT_IN_CATANF64 : case CFN_BUILT_IN_CATANF128: case CFN_BUILT_IN_CATANF32X: case CFN_BUILT_IN_CATANF64X: case CFN_BUILT_IN_CATANF128X: |
338 | CASE_CFN_CATANHcase CFN_BUILT_IN_CATANHF: case CFN_BUILT_IN_CATANH: case CFN_BUILT_IN_CATANHL: |
339 | CASE_CFN_CATANH_FNcase CFN_BUILT_IN_CATANHF16: case CFN_BUILT_IN_CATANHF32: case CFN_BUILT_IN_CATANHF64: case CFN_BUILT_IN_CATANHF128: case CFN_BUILT_IN_CATANHF32X : case CFN_BUILT_IN_CATANHF64X: case CFN_BUILT_IN_CATANHF128X: |
340 | CASE_CFN_CBRTcase CFN_BUILT_IN_CBRTF: case CFN_BUILT_IN_CBRT: case CFN_BUILT_IN_CBRTL: |
341 | CASE_CFN_CBRT_FNcase CFN_BUILT_IN_CBRTF16: case CFN_BUILT_IN_CBRTF32: case CFN_BUILT_IN_CBRTF64 : case CFN_BUILT_IN_CBRTF128: case CFN_BUILT_IN_CBRTF32X: case CFN_BUILT_IN_CBRTF64X: case CFN_BUILT_IN_CBRTF128X: |
342 | CASE_CFN_CPROJcase CFN_BUILT_IN_CPROJF: case CFN_BUILT_IN_CPROJ: case CFN_BUILT_IN_CPROJL: |
343 | CASE_CFN_CPROJ_FNcase CFN_BUILT_IN_CPROJF16: case CFN_BUILT_IN_CPROJF32: case CFN_BUILT_IN_CPROJF64 : case CFN_BUILT_IN_CPROJF128: case CFN_BUILT_IN_CPROJF32X: case CFN_BUILT_IN_CPROJF64X: case CFN_BUILT_IN_CPROJF128X: |
344 | CASE_CFN_CSINcase CFN_BUILT_IN_CSINF: case CFN_BUILT_IN_CSIN: case CFN_BUILT_IN_CSINL: |
345 | CASE_CFN_CSIN_FNcase CFN_BUILT_IN_CSINF16: case CFN_BUILT_IN_CSINF32: case CFN_BUILT_IN_CSINF64 : case CFN_BUILT_IN_CSINF128: case CFN_BUILT_IN_CSINF32X: case CFN_BUILT_IN_CSINF64X: case CFN_BUILT_IN_CSINF128X: |
346 | CASE_CFN_CSINHcase CFN_BUILT_IN_CSINHF: case CFN_BUILT_IN_CSINH: case CFN_BUILT_IN_CSINHL: |
347 | CASE_CFN_CSINH_FNcase CFN_BUILT_IN_CSINHF16: case CFN_BUILT_IN_CSINHF32: case CFN_BUILT_IN_CSINHF64 : case CFN_BUILT_IN_CSINHF128: case CFN_BUILT_IN_CSINHF32X: case CFN_BUILT_IN_CSINHF64X: case CFN_BUILT_IN_CSINHF128X: |
348 | CASE_CFN_CTANcase CFN_BUILT_IN_CTANF: case CFN_BUILT_IN_CTAN: case CFN_BUILT_IN_CTANL: |
349 | CASE_CFN_CTAN_FNcase CFN_BUILT_IN_CTANF16: case CFN_BUILT_IN_CTANF32: case CFN_BUILT_IN_CTANF64 : case CFN_BUILT_IN_CTANF128: case CFN_BUILT_IN_CTANF32X: case CFN_BUILT_IN_CTANF64X: case CFN_BUILT_IN_CTANF128X: |
350 | CASE_CFN_CTANHcase CFN_BUILT_IN_CTANHF: case CFN_BUILT_IN_CTANH: case CFN_BUILT_IN_CTANHL: |
351 | CASE_CFN_CTANH_FNcase CFN_BUILT_IN_CTANHF16: case CFN_BUILT_IN_CTANHF32: case CFN_BUILT_IN_CTANHF64 : case CFN_BUILT_IN_CTANHF128: case CFN_BUILT_IN_CTANHF32X: case CFN_BUILT_IN_CTANHF64X: case CFN_BUILT_IN_CTANHF128X: |
352 | CASE_CFN_ERFcase CFN_BUILT_IN_ERFF: case CFN_BUILT_IN_ERF: case CFN_BUILT_IN_ERFL: |
353 | CASE_CFN_ERF_FNcase CFN_BUILT_IN_ERFF16: case CFN_BUILT_IN_ERFF32: case CFN_BUILT_IN_ERFF64 : case CFN_BUILT_IN_ERFF128: case CFN_BUILT_IN_ERFF32X: case CFN_BUILT_IN_ERFF64X : case CFN_BUILT_IN_ERFF128X: |
354 | CASE_CFN_LLROUNDcase CFN_LLROUND: case CFN_BUILT_IN_LLROUNDF: case CFN_BUILT_IN_LLROUND : case CFN_BUILT_IN_LLROUNDL: |
355 | CASE_CFN_LLROUND_FNcase CFN_BUILT_IN_LLROUNDF16: case CFN_BUILT_IN_LLROUNDF32: case CFN_BUILT_IN_LLROUNDF64: case CFN_BUILT_IN_LLROUNDF128: case CFN_BUILT_IN_LLROUNDF32X: case CFN_BUILT_IN_LLROUNDF64X: case CFN_BUILT_IN_LLROUNDF128X: |
356 | CASE_CFN_LROUNDcase CFN_LROUND: case CFN_BUILT_IN_LROUNDF: case CFN_BUILT_IN_LROUND : case CFN_BUILT_IN_LROUNDL: |
357 | CASE_CFN_LROUND_FNcase CFN_BUILT_IN_LROUNDF16: case CFN_BUILT_IN_LROUNDF32: case CFN_BUILT_IN_LROUNDF64: case CFN_BUILT_IN_LROUNDF128: case CFN_BUILT_IN_LROUNDF32X : case CFN_BUILT_IN_LROUNDF64X: case CFN_BUILT_IN_LROUNDF128X: |
358 | CASE_CFN_ROUNDcase CFN_ROUND: case CFN_BUILT_IN_ROUNDF: case CFN_BUILT_IN_ROUND : case CFN_BUILT_IN_ROUNDL: |
359 | CASE_CFN_ROUNDEVENcase CFN_ROUNDEVEN: case CFN_BUILT_IN_ROUNDEVENF: case CFN_BUILT_IN_ROUNDEVEN : case CFN_BUILT_IN_ROUNDEVENL: |
360 | CASE_CFN_ROUNDEVEN_FNcase CFN_BUILT_IN_ROUNDEVENF16: case CFN_BUILT_IN_ROUNDEVENF32 : case CFN_BUILT_IN_ROUNDEVENF64: case CFN_BUILT_IN_ROUNDEVENF128 : case CFN_BUILT_IN_ROUNDEVENF32X: case CFN_BUILT_IN_ROUNDEVENF64X : case CFN_BUILT_IN_ROUNDEVENF128X: |
361 | CASE_CFN_SINcase CFN_SIN: case CFN_BUILT_IN_SINF: case CFN_BUILT_IN_SIN: case CFN_BUILT_IN_SINL: |
362 | CASE_CFN_SIN_FNcase CFN_BUILT_IN_SINF16: case CFN_BUILT_IN_SINF32: case CFN_BUILT_IN_SINF64 : case CFN_BUILT_IN_SINF128: case CFN_BUILT_IN_SINF32X: case CFN_BUILT_IN_SINF64X : case CFN_BUILT_IN_SINF128X: |
363 | CASE_CFN_SINHcase CFN_SINH: case CFN_BUILT_IN_SINHF: case CFN_BUILT_IN_SINH : case CFN_BUILT_IN_SINHL: |
364 | CASE_CFN_SINH_FNcase CFN_BUILT_IN_SINHF16: case CFN_BUILT_IN_SINHF32: case CFN_BUILT_IN_SINHF64 : case CFN_BUILT_IN_SINHF128: case CFN_BUILT_IN_SINHF32X: case CFN_BUILT_IN_SINHF64X: case CFN_BUILT_IN_SINHF128X: |
365 | CASE_CFN_TANcase CFN_TAN: case CFN_BUILT_IN_TANF: case CFN_BUILT_IN_TAN: case CFN_BUILT_IN_TANL: |
366 | CASE_CFN_TAN_FNcase CFN_BUILT_IN_TANF16: case CFN_BUILT_IN_TANF32: case CFN_BUILT_IN_TANF64 : case CFN_BUILT_IN_TANF128: case CFN_BUILT_IN_TANF32X: case CFN_BUILT_IN_TANF64X : case CFN_BUILT_IN_TANF128X: |
367 | CASE_CFN_TANHcase CFN_TANH: case CFN_BUILT_IN_TANHF: case CFN_BUILT_IN_TANH : case CFN_BUILT_IN_TANHL: |
368 | CASE_CFN_TANH_FNcase CFN_BUILT_IN_TANHF16: case CFN_BUILT_IN_TANHF32: case CFN_BUILT_IN_TANHF64 : case CFN_BUILT_IN_TANHF128: case CFN_BUILT_IN_TANHF32X: case CFN_BUILT_IN_TANHF64X: case CFN_BUILT_IN_TANHF128X: |
369 | CASE_CFN_TRUNCcase CFN_TRUNC: case CFN_BUILT_IN_TRUNCF: case CFN_BUILT_IN_TRUNC : case CFN_BUILT_IN_TRUNCL: |
370 | CASE_CFN_TRUNC_FNcase CFN_BUILT_IN_TRUNCF16: case CFN_BUILT_IN_TRUNCF32: case CFN_BUILT_IN_TRUNCF64 : case CFN_BUILT_IN_TRUNCF128: case CFN_BUILT_IN_TRUNCF32X: case CFN_BUILT_IN_TRUNCF64X: case CFN_BUILT_IN_TRUNCF128X: |
371 | return true; |
372 | |
373 | CASE_CFN_LLRINTcase CFN_LLRINT: case CFN_BUILT_IN_LLRINTF: case CFN_BUILT_IN_LLRINT : case CFN_BUILT_IN_LLRINTL: |
374 | CASE_CFN_LLRINT_FNcase CFN_BUILT_IN_LLRINTF16: case CFN_BUILT_IN_LLRINTF32: case CFN_BUILT_IN_LLRINTF64: case CFN_BUILT_IN_LLRINTF128: case CFN_BUILT_IN_LLRINTF32X : case CFN_BUILT_IN_LLRINTF64X: case CFN_BUILT_IN_LLRINTF128X: |
375 | CASE_CFN_LRINTcase CFN_LRINT: case CFN_BUILT_IN_LRINTF: case CFN_BUILT_IN_LRINT : case CFN_BUILT_IN_LRINTL: |
376 | CASE_CFN_LRINT_FNcase CFN_BUILT_IN_LRINTF16: case CFN_BUILT_IN_LRINTF32: case CFN_BUILT_IN_LRINTF64 : case CFN_BUILT_IN_LRINTF128: case CFN_BUILT_IN_LRINTF32X: case CFN_BUILT_IN_LRINTF64X: case CFN_BUILT_IN_LRINTF128X: |
377 | CASE_CFN_NEARBYINTcase CFN_NEARBYINT: case CFN_BUILT_IN_NEARBYINTF: case CFN_BUILT_IN_NEARBYINT : case CFN_BUILT_IN_NEARBYINTL: |
378 | CASE_CFN_NEARBYINT_FNcase CFN_BUILT_IN_NEARBYINTF16: case CFN_BUILT_IN_NEARBYINTF32 : case CFN_BUILT_IN_NEARBYINTF64: case CFN_BUILT_IN_NEARBYINTF128 : case CFN_BUILT_IN_NEARBYINTF32X: case CFN_BUILT_IN_NEARBYINTF64X : case CFN_BUILT_IN_NEARBYINTF128X: |
379 | CASE_CFN_RINTcase CFN_RINT: case CFN_BUILT_IN_RINTF: case CFN_BUILT_IN_RINT : case CFN_BUILT_IN_RINTL: |
380 | CASE_CFN_RINT_FNcase CFN_BUILT_IN_RINTF16: case CFN_BUILT_IN_RINTF32: case CFN_BUILT_IN_RINTF64 : case CFN_BUILT_IN_RINTF128: case CFN_BUILT_IN_RINTF32X: case CFN_BUILT_IN_RINTF64X: case CFN_BUILT_IN_RINTF128X: |
381 | return !flag_rounding_mathglobal_options.x_flag_rounding_math; |
382 | |
383 | default: |
384 | break; |
385 | } |
386 | return false; |
387 | } |
388 | |
389 | /* Check whether we may negate an integer constant T without causing |
390 | overflow. */ |
391 | |
392 | bool |
393 | may_negate_without_overflow_p (const_tree t) |
394 | { |
395 | tree type; |
396 | |
397 | gcc_assert (TREE_CODE (t) == INTEGER_CST)((void)(!(((enum tree_code) (t)->base.code) == INTEGER_CST ) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 397, __FUNCTION__), 0 : 0)); |
398 | |
399 | type = TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 399, __FUNCTION__))->typed.type); |
400 | if (TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 400, __FUNCTION__))->base.u.bits.unsigned_flag)) |
401 | return false; |
402 | |
403 | return !wi::only_sign_bit_p (wi::to_wide (t)); |
404 | } |
405 | |
406 | /* Determine whether an expression T can be cheaply negated using |
407 | the function negate_expr without introducing undefined overflow. */ |
408 | |
409 | static bool |
410 | negate_expr_p (tree t) |
411 | { |
412 | tree type; |
413 | |
414 | if (t == 0) |
415 | return false; |
416 | |
417 | type = TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 417, __FUNCTION__))->typed.type); |
418 | |
419 | STRIP_SIGN_NOPS (t)(t) = tree_strip_sign_nop_conversions ((const_cast<union tree_node *> (((t))))); |
420 | switch (TREE_CODE (t)((enum tree_code) (t)->base.code)) |
421 | { |
422 | case INTEGER_CST: |
423 | if (INTEGRAL_TYPE_P (type)(((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ( (enum tree_code) (type)->base.code) == BOOLEAN_TYPE || ((enum tree_code) (type)->base.code) == INTEGER_TYPE) && TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 423, __FUNCTION__))->base.u.bits.unsigned_flag)) |
424 | return true; |
425 | |
426 | /* Check that -CST will not overflow type. */ |
427 | return may_negate_without_overflow_p (t); |
428 | case BIT_NOT_EXPR: |
429 | return (INTEGRAL_TYPE_P (type)(((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ( (enum tree_code) (type)->base.code) == BOOLEAN_TYPE || ((enum tree_code) (type)->base.code) == INTEGER_TYPE) |
430 | && TYPE_OVERFLOW_WRAPS (type)((((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE) ? global_options .x_flag_wrapv_pointer : ((any_integral_type_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 430, __FUNCTION__))->base.u.bits.unsigned_flag || global_options .x_flag_wrapv))); |
431 | |
432 | case FIXED_CST: |
433 | return true; |
434 | |
435 | case NEGATE_EXPR: |
436 | return !TYPE_OVERFLOW_SANITIZED (type)((((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (type)->base.code) == BOOLEAN_TYPE || ( (enum tree_code) (type)->base.code) == INTEGER_TYPE) && !((((enum tree_code) (type)->base.code) == POINTER_TYPE || ((enum tree_code) (type)->base.code) == REFERENCE_TYPE) ? global_options.x_flag_wrapv_pointer : ((any_integral_type_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 436, __FUNCTION__))->base.u.bits.unsigned_flag || global_options .x_flag_wrapv)) && (global_options.x_flag_sanitize & SANITIZE_SI_OVERFLOW)); |
437 | |
438 | case REAL_CST: |
439 | /* We want to canonicalize to positive real constants. Pretend |
440 | that only negative ones can be easily negated. */ |
441 | return REAL_VALUE_NEGATIVE (TREE_REAL_CST (t))real_isneg (&((*(&(tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 441, __FUNCTION__, (REAL_CST)))->real_cst.value)))); |
442 | |
443 | case COMPLEX_CST: |
444 | return negate_expr_p (TREE_REALPART (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 444, __FUNCTION__, (COMPLEX_CST)))->complex.real)) |
445 | && negate_expr_p (TREE_IMAGPART (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 445, __FUNCTION__, (COMPLEX_CST)))->complex.imag)); |
446 | |
447 | case VECTOR_CST: |
448 | { |
449 | if (FLOAT_TYPE_P (TREE_TYPE (type))((((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 449, __FUNCTION__))->typed.type))->base.code) == REAL_TYPE ) || ((((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 449, __FUNCTION__))->typed.type))->base.code) == COMPLEX_TYPE || (((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 449, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE )) && (((enum tree_code) (((contains_struct_check ((( (contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 449, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 449, __FUNCTION__))->typed.type))->base.code) == REAL_TYPE ))) || TYPE_OVERFLOW_WRAPS (type)((((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE) ? global_options .x_flag_wrapv_pointer : ((any_integral_type_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 449, __FUNCTION__))->base.u.bits.unsigned_flag || global_options .x_flag_wrapv))) |
450 | return true; |
451 | |
452 | /* Steps don't prevent negation. */ |
453 | unsigned int count = vector_cst_encoded_nelts (t); |
454 | for (unsigned int i = 0; i < count; ++i) |
455 | if (!negate_expr_p (VECTOR_CST_ENCODED_ELT (t, i)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 455, __FUNCTION__, (VECTOR_CST)))->vector.elts[i]))) |
456 | return false; |
457 | |
458 | return true; |
459 | } |
460 | |
461 | case COMPLEX_EXPR: |
462 | return negate_expr_p (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 462, __FUNCTION__)))))) |
463 | && negate_expr_p (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 463, __FUNCTION__)))))); |
464 | |
465 | case CONJ_EXPR: |
466 | return negate_expr_p (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 466, __FUNCTION__)))))); |
467 | |
468 | case PLUS_EXPR: |
469 | if (HONOR_SIGN_DEPENDENT_ROUNDING (type) |
470 | || HONOR_SIGNED_ZEROS (type) |
471 | || (ANY_INTEGRAL_TYPE_P (type)((((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (type)->base.code) == BOOLEAN_TYPE || ( (enum tree_code) (type)->base.code) == INTEGER_TYPE) || (( ((enum tree_code) (type)->base.code) == COMPLEX_TYPE || (( (enum tree_code) (type)->base.code) == VECTOR_TYPE)) && (((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 471, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 471, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 471, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE ))) |
472 | && ! TYPE_OVERFLOW_WRAPS (type)((((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE) ? global_options .x_flag_wrapv_pointer : ((any_integral_type_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 472, __FUNCTION__))->base.u.bits.unsigned_flag || global_options .x_flag_wrapv)))) |
473 | return false; |
474 | /* -(A + B) -> (-B) - A. */ |
475 | if (negate_expr_p (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 475, __FUNCTION__))))))) |
476 | return true; |
477 | /* -(A + B) -> (-A) - B. */ |
478 | return negate_expr_p (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 478, __FUNCTION__)))))); |
479 | |
480 | case MINUS_EXPR: |
481 | /* We can't turn -(A-B) into B-A when we honor signed zeros. */ |
482 | return !HONOR_SIGN_DEPENDENT_ROUNDING (type) |
483 | && !HONOR_SIGNED_ZEROS (type) |
484 | && (! ANY_INTEGRAL_TYPE_P (type)((((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (type)->base.code) == BOOLEAN_TYPE || ( (enum tree_code) (type)->base.code) == INTEGER_TYPE) || (( ((enum tree_code) (type)->base.code) == COMPLEX_TYPE || (( (enum tree_code) (type)->base.code) == VECTOR_TYPE)) && (((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 484, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 484, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 484, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE ))) |
485 | || TYPE_OVERFLOW_WRAPS (type)((((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE) ? global_options .x_flag_wrapv_pointer : ((any_integral_type_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 485, __FUNCTION__))->base.u.bits.unsigned_flag || global_options .x_flag_wrapv))); |
486 | |
487 | case MULT_EXPR: |
488 | if (TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 488, __FUNCTION__))->base.u.bits.unsigned_flag)) |
489 | break; |
490 | /* INT_MIN/n * n doesn't overflow while negating one operand it does |
491 | if n is a (negative) power of two. */ |
492 | if (INTEGRAL_TYPE_P (TREE_TYPE (t))(((enum tree_code) (((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 492, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 492, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 492, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE ) |
493 | && ! TYPE_OVERFLOW_WRAPS (TREE_TYPE (t))((((enum tree_code) (((contains_struct_check ((t), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 493, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 493, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ) ? global_options.x_flag_wrapv_pointer : ((any_integral_type_check ((((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 493, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 493, __FUNCTION__))->base.u.bits.unsigned_flag || global_options .x_flag_wrapv)) |
494 | && ! ((TREE_CODE (TREE_OPERAND (t, 0))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 494, __FUNCTION__))))))->base.code) == INTEGER_CST |
495 | && (wi::popcount |
496 | (wi::abs (wi::to_wide (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 496, __FUNCTION__))))))))) != 1) |
497 | || (TREE_CODE (TREE_OPERAND (t, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 497, __FUNCTION__))))))->base.code) == INTEGER_CST |
498 | && (wi::popcount |
499 | (wi::abs (wi::to_wide (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 499, __FUNCTION__))))))))) != 1))) |
500 | break; |
501 | |
502 | /* Fall through. */ |
503 | |
504 | case RDIV_EXPR: |
505 | if (! HONOR_SIGN_DEPENDENT_ROUNDING (t)) |
506 | return negate_expr_p (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 506, __FUNCTION__)))))) |
507 | || negate_expr_p (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 507, __FUNCTION__)))))); |
508 | break; |
509 | |
510 | case TRUNC_DIV_EXPR: |
511 | case ROUND_DIV_EXPR: |
512 | case EXACT_DIV_EXPR: |
513 | if (TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 513, __FUNCTION__))->base.u.bits.unsigned_flag)) |
514 | break; |
515 | /* In general we can't negate A in A / B, because if A is INT_MIN and |
516 | B is not 1 we change the sign of the result. */ |
517 | if (TREE_CODE (TREE_OPERAND (t, 0))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 517, __FUNCTION__))))))->base.code) == INTEGER_CST |
518 | && negate_expr_p (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 518, __FUNCTION__))))))) |
519 | return true; |
520 | /* In general we can't negate B in A / B, because if A is INT_MIN and |
521 | B is 1, we may turn this into INT_MIN / -1 which is undefined |
522 | and actually traps on some architectures. */ |
523 | if (! ANY_INTEGRAL_TYPE_P (TREE_TYPE (t))((((enum tree_code) (((contains_struct_check ((t), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 523, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 523, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 523, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE ) || ((((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 523, __FUNCTION__))->typed.type))->base.code) == COMPLEX_TYPE || (((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 523, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE )) && (((enum tree_code) (((contains_struct_check ((( (contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 523, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 523, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 523, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 523, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 523, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 523, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE ))) |
524 | || TYPE_OVERFLOW_WRAPS (TREE_TYPE (t))((((enum tree_code) (((contains_struct_check ((t), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 524, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 524, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ) ? global_options.x_flag_wrapv_pointer : ((any_integral_type_check ((((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 524, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 524, __FUNCTION__))->base.u.bits.unsigned_flag || global_options .x_flag_wrapv)) |
525 | || (TREE_CODE (TREE_OPERAND (t, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 525, __FUNCTION__))))))->base.code) == INTEGER_CST |
526 | && ! integer_onep (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 526, __FUNCTION__)))))))) |
527 | return negate_expr_p (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 527, __FUNCTION__)))))); |
528 | break; |
529 | |
530 | case NOP_EXPR: |
531 | /* Negate -((double)float) as (double)(-float). */ |
532 | if (TREE_CODE (type)((enum tree_code) (type)->base.code) == REAL_TYPE) |
533 | { |
534 | tree tem = strip_float_extensions (t); |
535 | if (tem != t) |
536 | return negate_expr_p (tem); |
537 | } |
538 | break; |
539 | |
540 | case CALL_EXPR: |
541 | /* Negate -f(x) as f(-x). */ |
542 | if (negate_mathfn_p (get_call_combined_fn (t))) |
543 | return negate_expr_p (CALL_EXPR_ARG (t, 0)(*((const_cast<tree*> (tree_operand_check (((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 543, __FUNCTION__, (CALL_EXPR)))), ((0) + 3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 543, __FUNCTION__)))))); |
544 | break; |
545 | |
546 | case RSHIFT_EXPR: |
547 | /* Optimize -((int)x >> 31) into (unsigned)x >> 31 for int. */ |
548 | if (TREE_CODE (TREE_OPERAND (t, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 548, __FUNCTION__))))))->base.code) == INTEGER_CST) |
549 | { |
550 | tree op1 = TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 550, __FUNCTION__))))); |
551 | if (wi::to_wide (op1) == element_precision (type) - 1) |
552 | return true; |
553 | } |
554 | break; |
555 | |
556 | default: |
557 | break; |
558 | } |
559 | return false; |
560 | } |
561 | |
562 | /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no |
563 | simplification is possible. |
564 | If negate_expr_p would return true for T, NULL_TREE will never be |
565 | returned. */ |
566 | |
567 | static tree |
568 | fold_negate_expr_1 (location_t loc, tree t) |
569 | { |
570 | tree type = TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 570, __FUNCTION__))->typed.type); |
571 | tree tem; |
572 | |
573 | switch (TREE_CODE (t)((enum tree_code) (t)->base.code)) |
574 | { |
575 | /* Convert - (~A) to A + 1. */ |
576 | case BIT_NOT_EXPR: |
577 | if (INTEGRAL_TYPE_P (type)(((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ( (enum tree_code) (type)->base.code) == BOOLEAN_TYPE || ((enum tree_code) (type)->base.code) == INTEGER_TYPE)) |
578 | return fold_build2_loc (loc, PLUS_EXPR, type, TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 578, __FUNCTION__))))), |
579 | build_one_cst (type)); |
580 | break; |
581 | |
582 | case INTEGER_CST: |
583 | tem = fold_negate_const (t, type); |
584 | if (TREE_OVERFLOW (tem)((tree_class_check ((tem), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 584, __FUNCTION__))->base.public_flag) == TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 584, __FUNCTION__))->base.public_flag) |
585 | || (ANY_INTEGRAL_TYPE_P (type)((((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (type)->base.code) == BOOLEAN_TYPE || ( (enum tree_code) (type)->base.code) == INTEGER_TYPE) || (( ((enum tree_code) (type)->base.code) == COMPLEX_TYPE || (( (enum tree_code) (type)->base.code) == VECTOR_TYPE)) && (((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 585, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 585, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 585, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE ))) |
586 | && !TYPE_OVERFLOW_TRAPS (type)(!(any_integral_type_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 586, __FUNCTION__))->base.u.bits.unsigned_flag && global_options.x_flag_trapv) |
587 | && TYPE_OVERFLOW_WRAPS (type)((((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE) ? global_options .x_flag_wrapv_pointer : ((any_integral_type_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 587, __FUNCTION__))->base.u.bits.unsigned_flag || global_options .x_flag_wrapv))) |
588 | || (flag_sanitizeglobal_options.x_flag_sanitize & SANITIZE_SI_OVERFLOW) == 0) |
589 | return tem; |
590 | break; |
591 | |
592 | case POLY_INT_CST: |
593 | case REAL_CST: |
594 | case FIXED_CST: |
595 | tem = fold_negate_const (t, type); |
596 | return tem; |
597 | |
598 | case COMPLEX_CST: |
599 | { |
600 | tree rpart = fold_negate_expr (loc, TREE_REALPART (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 600, __FUNCTION__, (COMPLEX_CST)))->complex.real)); |
601 | tree ipart = fold_negate_expr (loc, TREE_IMAGPART (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 601, __FUNCTION__, (COMPLEX_CST)))->complex.imag)); |
602 | if (rpart && ipart) |
603 | return build_complex (type, rpart, ipart); |
604 | } |
605 | break; |
606 | |
607 | case VECTOR_CST: |
608 | { |
609 | tree_vector_builder elts; |
610 | elts.new_unary_operation (type, t, true); |
611 | unsigned int count = elts.encoded_nelts (); |
612 | for (unsigned int i = 0; i < count; ++i) |
613 | { |
614 | tree elt = fold_negate_expr (loc, VECTOR_CST_ELT (t, i)vector_cst_elt (t, i)); |
615 | if (elt == NULL_TREE(tree) __null) |
616 | return NULL_TREE(tree) __null; |
617 | elts.quick_push (elt); |
618 | } |
619 | |
620 | return elts.build (); |
621 | } |
622 | |
623 | case COMPLEX_EXPR: |
624 | if (negate_expr_p (t)) |
625 | return fold_build2_loc (loc, COMPLEX_EXPR, type, |
626 | fold_negate_expr (loc, TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 626, __FUNCTION__)))))), |
627 | fold_negate_expr (loc, TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 627, __FUNCTION__))))))); |
628 | break; |
629 | |
630 | case CONJ_EXPR: |
631 | if (negate_expr_p (t)) |
632 | return fold_build1_loc (loc, CONJ_EXPR, type, |
633 | fold_negate_expr (loc, TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 633, __FUNCTION__))))))); |
634 | break; |
635 | |
636 | case NEGATE_EXPR: |
637 | if (!TYPE_OVERFLOW_SANITIZED (type)((((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (type)->base.code) == BOOLEAN_TYPE || ( (enum tree_code) (type)->base.code) == INTEGER_TYPE) && !((((enum tree_code) (type)->base.code) == POINTER_TYPE || ((enum tree_code) (type)->base.code) == REFERENCE_TYPE) ? global_options.x_flag_wrapv_pointer : ((any_integral_type_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 637, __FUNCTION__))->base.u.bits.unsigned_flag || global_options .x_flag_wrapv)) && (global_options.x_flag_sanitize & SANITIZE_SI_OVERFLOW))) |
638 | return TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 638, __FUNCTION__))))); |
639 | break; |
640 | |
641 | case PLUS_EXPR: |
642 | if (!HONOR_SIGN_DEPENDENT_ROUNDING (type) |
643 | && !HONOR_SIGNED_ZEROS (type)) |
644 | { |
645 | /* -(A + B) -> (-B) - A. */ |
646 | if (negate_expr_p (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 646, __FUNCTION__))))))) |
647 | { |
648 | tem = negate_expr (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 648, __FUNCTION__)))))); |
649 | return fold_build2_loc (loc, MINUS_EXPR, type, |
650 | tem, TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 650, __FUNCTION__)))))); |
651 | } |
652 | |
653 | /* -(A + B) -> (-A) - B. */ |
654 | if (negate_expr_p (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 654, __FUNCTION__))))))) |
655 | { |
656 | tem = negate_expr (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 656, __FUNCTION__)))))); |
657 | return fold_build2_loc (loc, MINUS_EXPR, type, |
658 | tem, TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 658, __FUNCTION__)))))); |
659 | } |
660 | } |
661 | break; |
662 | |
663 | case MINUS_EXPR: |
664 | /* - (A - B) -> B - A */ |
665 | if (!HONOR_SIGN_DEPENDENT_ROUNDING (type) |
666 | && !HONOR_SIGNED_ZEROS (type)) |
667 | return fold_build2_loc (loc, MINUS_EXPR, type, |
668 | TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 668, __FUNCTION__))))), TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 668, __FUNCTION__)))))); |
669 | break; |
670 | |
671 | case MULT_EXPR: |
672 | if (TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 672, __FUNCTION__))->base.u.bits.unsigned_flag)) |
673 | break; |
674 | |
675 | /* Fall through. */ |
676 | |
677 | case RDIV_EXPR: |
678 | if (! HONOR_SIGN_DEPENDENT_ROUNDING (type)) |
679 | { |
680 | tem = TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 680, __FUNCTION__))))); |
681 | if (negate_expr_p (tem)) |
682 | return fold_build2_loc (loc, TREE_CODE (t)((enum tree_code) (t)->base.code), type, |
683 | TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 683, __FUNCTION__))))), negate_expr (tem)); |
684 | tem = TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 684, __FUNCTION__))))); |
685 | if (negate_expr_p (tem)) |
686 | return fold_build2_loc (loc, TREE_CODE (t)((enum tree_code) (t)->base.code), type, |
687 | negate_expr (tem), TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 687, __FUNCTION__)))))); |
688 | } |
689 | break; |
690 | |
691 | case TRUNC_DIV_EXPR: |
692 | case ROUND_DIV_EXPR: |
693 | case EXACT_DIV_EXPR: |
694 | if (TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 694, __FUNCTION__))->base.u.bits.unsigned_flag)) |
695 | break; |
696 | /* In general we can't negate A in A / B, because if A is INT_MIN and |
697 | B is not 1 we change the sign of the result. */ |
698 | if (TREE_CODE (TREE_OPERAND (t, 0))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 698, __FUNCTION__))))))->base.code) == INTEGER_CST |
699 | && negate_expr_p (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 699, __FUNCTION__))))))) |
700 | return fold_build2_loc (loc, TREE_CODE (t)((enum tree_code) (t)->base.code), type, |
701 | negate_expr (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 701, __FUNCTION__)))))), |
702 | TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 702, __FUNCTION__)))))); |
703 | /* In general we can't negate B in A / B, because if A is INT_MIN and |
704 | B is 1, we may turn this into INT_MIN / -1 which is undefined |
705 | and actually traps on some architectures. */ |
706 | if ((! ANY_INTEGRAL_TYPE_P (TREE_TYPE (t))((((enum tree_code) (((contains_struct_check ((t), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 706, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 706, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 706, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE ) || ((((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 706, __FUNCTION__))->typed.type))->base.code) == COMPLEX_TYPE || (((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 706, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE )) && (((enum tree_code) (((contains_struct_check ((( (contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 706, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 706, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 706, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 706, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 706, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 706, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE ))) |
707 | || TYPE_OVERFLOW_WRAPS (TREE_TYPE (t))((((enum tree_code) (((contains_struct_check ((t), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 707, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((t), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 707, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ) ? global_options.x_flag_wrapv_pointer : ((any_integral_type_check ((((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 707, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 707, __FUNCTION__))->base.u.bits.unsigned_flag || global_options .x_flag_wrapv)) |
708 | || (TREE_CODE (TREE_OPERAND (t, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 708, __FUNCTION__))))))->base.code) == INTEGER_CST |
709 | && ! integer_onep (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 709, __FUNCTION__)))))))) |
710 | && negate_expr_p (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 710, __FUNCTION__))))))) |
711 | return fold_build2_loc (loc, TREE_CODE (t)((enum tree_code) (t)->base.code), type, |
712 | TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 712, __FUNCTION__))))), |
713 | negate_expr (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 713, __FUNCTION__))))))); |
714 | break; |
715 | |
716 | case NOP_EXPR: |
717 | /* Convert -((double)float) into (double)(-float). */ |
718 | if (TREE_CODE (type)((enum tree_code) (type)->base.code) == REAL_TYPE) |
719 | { |
720 | tem = strip_float_extensions (t); |
721 | if (tem != t && negate_expr_p (tem)) |
722 | return fold_convert_loc (loc, type, negate_expr (tem)); |
723 | } |
724 | break; |
725 | |
726 | case CALL_EXPR: |
727 | /* Negate -f(x) as f(-x). */ |
728 | if (negate_mathfn_p (get_call_combined_fn (t)) |
729 | && negate_expr_p (CALL_EXPR_ARG (t, 0)(*((const_cast<tree*> (tree_operand_check (((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 729, __FUNCTION__, (CALL_EXPR)))), ((0) + 3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 729, __FUNCTION__))))))) |
730 | { |
731 | tree fndecl, arg; |
732 | |
733 | fndecl = get_callee_fndecl (t); |
734 | arg = negate_expr (CALL_EXPR_ARG (t, 0)(*((const_cast<tree*> (tree_operand_check (((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 734, __FUNCTION__, (CALL_EXPR)))), ((0) + 3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 734, __FUNCTION__)))))); |
735 | return build_call_expr_loc (loc, fndecl, 1, arg); |
736 | } |
737 | break; |
738 | |
739 | case RSHIFT_EXPR: |
740 | /* Optimize -((int)x >> 31) into (unsigned)x >> 31 for int. */ |
741 | if (TREE_CODE (TREE_OPERAND (t, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 741, __FUNCTION__))))))->base.code) == INTEGER_CST) |
742 | { |
743 | tree op1 = TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 743, __FUNCTION__))))); |
744 | if (wi::to_wide (op1) == element_precision (type) - 1) |
745 | { |
746 | tree ntype = TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 746, __FUNCTION__))->base.u.bits.unsigned_flag) |
747 | ? signed_type_for (type) |
748 | : unsigned_type_for (type); |
749 | tree temp = fold_convert_loc (loc, ntype, TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 749, __FUNCTION__)))))); |
750 | temp = fold_build2_loc (loc, RSHIFT_EXPR, ntype, temp, op1); |
751 | return fold_convert_loc (loc, type, temp); |
752 | } |
753 | } |
754 | break; |
755 | |
756 | default: |
757 | break; |
758 | } |
759 | |
760 | return NULL_TREE(tree) __null; |
761 | } |
762 | |
763 | /* A wrapper for fold_negate_expr_1. */ |
764 | |
765 | static tree |
766 | fold_negate_expr (location_t loc, tree t) |
767 | { |
768 | tree type = TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 768, __FUNCTION__))->typed.type); |
769 | STRIP_SIGN_NOPS (t)(t) = tree_strip_sign_nop_conversions ((const_cast<union tree_node *> (((t))))); |
770 | tree tem = fold_negate_expr_1 (loc, t); |
771 | if (tem == NULL_TREE(tree) __null) |
772 | return NULL_TREE(tree) __null; |
773 | return fold_convert_loc (loc, type, tem); |
774 | } |
775 | |
776 | /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T cannot be |
777 | negated in a simpler way. Also allow for T to be NULL_TREE, in which case |
778 | return NULL_TREE. */ |
779 | |
780 | static tree |
781 | negate_expr (tree t) |
782 | { |
783 | tree type, tem; |
784 | location_t loc; |
785 | |
786 | if (t == NULL_TREE(tree) __null) |
787 | return NULL_TREE(tree) __null; |
788 | |
789 | loc = EXPR_LOCATION (t)((((t)) && ((tree_code_type_tmpl <0>::tree_code_type [(int) (((enum tree_code) ((t))->base.code))]) >= tcc_reference && (tree_code_type_tmpl <0>::tree_code_type[(int ) (((enum tree_code) ((t))->base.code))]) <= tcc_expression )) ? (t)->exp.locus : ((location_t) 0)); |
790 | type = TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 790, __FUNCTION__))->typed.type); |
791 | STRIP_SIGN_NOPS (t)(t) = tree_strip_sign_nop_conversions ((const_cast<union tree_node *> (((t))))); |
792 | |
793 | tem = fold_negate_expr (loc, t); |
794 | if (!tem) |
795 | tem = build1_loc (loc, NEGATE_EXPR, TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 795, __FUNCTION__))->typed.type), t); |
796 | return fold_convert_loc (loc, type, tem); |
797 | } |
798 | |
799 | /* Split a tree IN into a constant, literal and variable parts that could be |
800 | combined with CODE to make IN. "constant" means an expression with |
801 | TREE_CONSTANT but that isn't an actual constant. CODE must be a |
802 | commutative arithmetic operation. Store the constant part into *CONP, |
803 | the literal in *LITP and return the variable part. If a part isn't |
804 | present, set it to null. If the tree does not decompose in this way, |
805 | return the entire tree as the variable part and the other parts as null. |
806 | |
807 | If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR. In that |
808 | case, we negate an operand that was subtracted. Except if it is a |
809 | literal for which we use *MINUS_LITP instead. |
810 | |
811 | If NEGATE_P is true, we are negating all of IN, again except a literal |
812 | for which we use *MINUS_LITP instead. If a variable part is of pointer |
813 | type, it is negated after converting to TYPE. This prevents us from |
814 | generating illegal MINUS pointer expression. LOC is the location of |
815 | the converted variable part. |
816 | |
817 | If IN is itself a literal or constant, return it as appropriate. |
818 | |
819 | Note that we do not guarantee that any of the three values will be the |
820 | same type as IN, but they will have the same signedness and mode. */ |
821 | |
822 | static tree |
823 | split_tree (tree in, tree type, enum tree_code code, |
824 | tree *minus_varp, tree *conp, tree *minus_conp, |
825 | tree *litp, tree *minus_litp, int negate_p) |
826 | { |
827 | tree var = 0; |
828 | *minus_varp = 0; |
829 | *conp = 0; |
830 | *minus_conp = 0; |
831 | *litp = 0; |
832 | *minus_litp = 0; |
833 | |
834 | /* Strip any conversions that don't change the machine mode or signedness. */ |
835 | STRIP_SIGN_NOPS (in)(in) = tree_strip_sign_nop_conversions ((const_cast<union tree_node *> (((in))))); |
836 | |
837 | if (TREE_CODE (in)((enum tree_code) (in)->base.code) == INTEGER_CST || TREE_CODE (in)((enum tree_code) (in)->base.code) == REAL_CST |
838 | || TREE_CODE (in)((enum tree_code) (in)->base.code) == FIXED_CST) |
839 | *litp = in; |
840 | else if (TREE_CODE (in)((enum tree_code) (in)->base.code) == code |
841 | || ((! FLOAT_TYPE_P (TREE_TYPE (in))((((enum tree_code) (((contains_struct_check ((in), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 841, __FUNCTION__))->typed.type))->base.code) == REAL_TYPE ) || ((((enum tree_code) (((contains_struct_check ((in), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 841, __FUNCTION__))->typed.type))->base.code) == COMPLEX_TYPE || (((enum tree_code) (((contains_struct_check ((in), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 841, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE )) && (((enum tree_code) (((contains_struct_check ((( (contains_struct_check ((in), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 841, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 841, __FUNCTION__))->typed.type))->base.code) == REAL_TYPE ))) || flag_associative_mathglobal_options.x_flag_associative_math) |
842 | && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in))(((enum tree_code) (((contains_struct_check ((in), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 842, __FUNCTION__))->typed.type))->base.code) == FIXED_POINT_TYPE && ((tree_not_check4 ((((contains_struct_check ((in) , (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 842, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 842, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE ), (ARRAY_TYPE)))->base.u.bits.saturating_flag)) |
843 | /* We can associate addition and subtraction together (even |
844 | though the C standard doesn't say so) for integers because |
845 | the value is not affected. For reals, the value might be |
846 | affected, so we can't. */ |
847 | && ((code == PLUS_EXPR && TREE_CODE (in)((enum tree_code) (in)->base.code) == POINTER_PLUS_EXPR) |
848 | || (code == PLUS_EXPR && TREE_CODE (in)((enum tree_code) (in)->base.code) == MINUS_EXPR) |
849 | || (code == MINUS_EXPR |
850 | && (TREE_CODE (in)((enum tree_code) (in)->base.code) == PLUS_EXPR |
851 | || TREE_CODE (in)((enum tree_code) (in)->base.code) == POINTER_PLUS_EXPR))))) |
852 | { |
853 | tree op0 = TREE_OPERAND (in, 0)(*((const_cast<tree*> (tree_operand_check ((in), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 853, __FUNCTION__))))); |
854 | tree op1 = TREE_OPERAND (in, 1)(*((const_cast<tree*> (tree_operand_check ((in), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 854, __FUNCTION__))))); |
855 | int neg1_p = TREE_CODE (in)((enum tree_code) (in)->base.code) == MINUS_EXPR; |
856 | int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0; |
857 | |
858 | /* First see if either of the operands is a literal, then a constant. */ |
859 | if (TREE_CODE (op0)((enum tree_code) (op0)->base.code) == INTEGER_CST || TREE_CODE (op0)((enum tree_code) (op0)->base.code) == REAL_CST |
860 | || TREE_CODE (op0)((enum tree_code) (op0)->base.code) == FIXED_CST) |
861 | *litp = op0, op0 = 0; |
862 | else if (TREE_CODE (op1)((enum tree_code) (op1)->base.code) == INTEGER_CST || TREE_CODE (op1)((enum tree_code) (op1)->base.code) == REAL_CST |
863 | || TREE_CODE (op1)((enum tree_code) (op1)->base.code) == FIXED_CST) |
864 | *litp = op1, neg_litp_p = neg1_p, op1 = 0; |
865 | |
866 | if (op0 != 0 && TREE_CONSTANT (op0)((non_type_check ((op0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 866, __FUNCTION__))->base.constant_flag)) |
867 | *conp = op0, op0 = 0; |
868 | else if (op1 != 0 && TREE_CONSTANT (op1)((non_type_check ((op1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 868, __FUNCTION__))->base.constant_flag)) |
869 | *conp = op1, neg_conp_p = neg1_p, op1 = 0; |
870 | |
871 | /* If we haven't dealt with either operand, this is not a case we can |
872 | decompose. Otherwise, VAR is either of the ones remaining, if any. */ |
873 | if (op0 != 0 && op1 != 0) |
874 | var = in; |
875 | else if (op0 != 0) |
876 | var = op0; |
877 | else |
878 | var = op1, neg_var_p = neg1_p; |
879 | |
880 | /* Now do any needed negations. */ |
881 | if (neg_litp_p) |
882 | *minus_litp = *litp, *litp = 0; |
883 | if (neg_conp_p && *conp) |
884 | *minus_conp = *conp, *conp = 0; |
885 | if (neg_var_p && var) |
886 | *minus_varp = var, var = 0; |
887 | } |
888 | else if (TREE_CONSTANT (in)((non_type_check ((in), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 888, __FUNCTION__))->base.constant_flag)) |
889 | *conp = in; |
890 | else if (TREE_CODE (in)((enum tree_code) (in)->base.code) == BIT_NOT_EXPR |
891 | && code == PLUS_EXPR) |
892 | { |
893 | /* -1 - X is folded to ~X, undo that here. Do _not_ do this |
894 | when IN is constant. */ |
895 | *litp = build_minus_one_cst (type); |
896 | *minus_varp = TREE_OPERAND (in, 0)(*((const_cast<tree*> (tree_operand_check ((in), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 896, __FUNCTION__))))); |
897 | } |
898 | else |
899 | var = in; |
900 | |
901 | if (negate_p) |
902 | { |
903 | if (*litp) |
904 | *minus_litp = *litp, *litp = 0; |
905 | else if (*minus_litp) |
906 | *litp = *minus_litp, *minus_litp = 0; |
907 | if (*conp) |
908 | *minus_conp = *conp, *conp = 0; |
909 | else if (*minus_conp) |
910 | *conp = *minus_conp, *minus_conp = 0; |
911 | if (var) |
912 | *minus_varp = var, var = 0; |
913 | else if (*minus_varp) |
914 | var = *minus_varp, *minus_varp = 0; |
915 | } |
916 | |
917 | if (*litp |
918 | && TREE_OVERFLOW_P (*litp)((tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (*litp)->base.code))] == tcc_constant) && ((tree_class_check ((*litp), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 918, __FUNCTION__))->base.public_flag))) |
919 | *litp = drop_tree_overflow (*litp); |
920 | if (*minus_litp |
921 | && TREE_OVERFLOW_P (*minus_litp)((tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (*minus_litp)->base.code))] == tcc_constant) && ((tree_class_check ((*minus_litp), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 921, __FUNCTION__))->base.public_flag))) |
922 | *minus_litp = drop_tree_overflow (*minus_litp); |
923 | |
924 | return var; |
925 | } |
926 | |
927 | /* Re-associate trees split by the above function. T1 and T2 are |
928 | either expressions to associate or null. Return the new |
929 | expression, if any. LOC is the location of the new expression. If |
930 | we build an operation, do it in TYPE and with CODE. */ |
931 | |
932 | static tree |
933 | associate_trees (location_t loc, tree t1, tree t2, enum tree_code code, tree type) |
934 | { |
935 | if (t1 == 0) |
936 | { |
937 | gcc_assert (t2 == 0 || code != MINUS_EXPR)((void)(!(t2 == 0 || code != MINUS_EXPR) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 937, __FUNCTION__), 0 : 0)); |
938 | return t2; |
939 | } |
940 | else if (t2 == 0) |
941 | return t1; |
942 | |
943 | /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't |
944 | try to fold this since we will have infinite recursion. But do |
945 | deal with any NEGATE_EXPRs. */ |
946 | if (TREE_CODE (t1)((enum tree_code) (t1)->base.code) == code || TREE_CODE (t2)((enum tree_code) (t2)->base.code) == code |
947 | || TREE_CODE (t1)((enum tree_code) (t1)->base.code) == PLUS_EXPR || TREE_CODE (t2)((enum tree_code) (t2)->base.code) == PLUS_EXPR |
948 | || TREE_CODE (t1)((enum tree_code) (t1)->base.code) == MINUS_EXPR || TREE_CODE (t2)((enum tree_code) (t2)->base.code) == MINUS_EXPR) |
949 | { |
950 | if (code == PLUS_EXPR) |
951 | { |
952 | if (TREE_CODE (t1)((enum tree_code) (t1)->base.code) == NEGATE_EXPR) |
953 | return build2_loc (loc, MINUS_EXPR, type, |
954 | fold_convert_loc (loc, type, t2), |
955 | fold_convert_loc (loc, type, |
956 | TREE_OPERAND (t1, 0)(*((const_cast<tree*> (tree_operand_check ((t1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 956, __FUNCTION__))))))); |
957 | else if (TREE_CODE (t2)((enum tree_code) (t2)->base.code) == NEGATE_EXPR) |
958 | return build2_loc (loc, MINUS_EXPR, type, |
959 | fold_convert_loc (loc, type, t1), |
960 | fold_convert_loc (loc, type, |
961 | TREE_OPERAND (t2, 0)(*((const_cast<tree*> (tree_operand_check ((t2), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 961, __FUNCTION__))))))); |
962 | else if (integer_zerop (t2)) |
963 | return fold_convert_loc (loc, type, t1); |
964 | } |
965 | else if (code == MINUS_EXPR) |
966 | { |
967 | if (integer_zerop (t2)) |
968 | return fold_convert_loc (loc, type, t1); |
969 | } |
970 | |
971 | return build2_loc (loc, code, type, fold_convert_loc (loc, type, t1), |
972 | fold_convert_loc (loc, type, t2)); |
973 | } |
974 | |
975 | return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, t1), |
976 | fold_convert_loc (loc, type, t2)); |
977 | } |
978 | |
979 | /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable |
980 | for use in int_const_binop, size_binop and size_diffop. */ |
981 | |
982 | static bool |
983 | int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2) |
984 | { |
985 | if (!INTEGRAL_TYPE_P (type1)(((enum tree_code) (type1)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (type1)->base.code) == BOOLEAN_TYPE || ( (enum tree_code) (type1)->base.code) == INTEGER_TYPE) && !POINTER_TYPE_P (type1)(((enum tree_code) (type1)->base.code) == POINTER_TYPE || ( (enum tree_code) (type1)->base.code) == REFERENCE_TYPE)) |
986 | return false; |
987 | if (!INTEGRAL_TYPE_P (type2)(((enum tree_code) (type2)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (type2)->base.code) == BOOLEAN_TYPE || ( (enum tree_code) (type2)->base.code) == INTEGER_TYPE) && !POINTER_TYPE_P (type2)(((enum tree_code) (type2)->base.code) == POINTER_TYPE || ( (enum tree_code) (type2)->base.code) == REFERENCE_TYPE)) |
988 | return false; |
989 | |
990 | switch (code) |
991 | { |
992 | case LSHIFT_EXPR: |
993 | case RSHIFT_EXPR: |
994 | case LROTATE_EXPR: |
995 | case RROTATE_EXPR: |
996 | return true; |
997 | |
998 | default: |
999 | break; |
1000 | } |
1001 | |
1002 | return TYPE_UNSIGNED (type1)((tree_class_check ((type1), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1002, __FUNCTION__))->base.u.bits.unsigned_flag) == TYPE_UNSIGNED (type2)((tree_class_check ((type2), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1002, __FUNCTION__))->base.u.bits.unsigned_flag) |
1003 | && TYPE_PRECISION (type1)((tree_class_check ((type1), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1003, __FUNCTION__))->type_common.precision) == TYPE_PRECISION (type2)((tree_class_check ((type2), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1003, __FUNCTION__))->type_common.precision) |
1004 | && TYPE_MODE (type1)((((enum tree_code) ((tree_class_check ((type1), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1004, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type1) : (type1)->type_common.mode) == TYPE_MODE (type2)((((enum tree_code) ((tree_class_check ((type2), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1004, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type2) : (type2)->type_common.mode); |
1005 | } |
1006 | |
1007 | /* Combine two wide ints ARG1 and ARG2 under operation CODE to produce |
1008 | a new constant in RES. Return FALSE if we don't know how to |
1009 | evaluate CODE at compile-time. */ |
1010 | |
1011 | bool |
1012 | wide_int_binop (wide_int &res, |
1013 | enum tree_code code, const wide_int &arg1, const wide_int &arg2, |
1014 | signop sign, wi::overflow_type *overflow) |
1015 | { |
1016 | wide_int tmp; |
1017 | *overflow = wi::OVF_NONE; |
1018 | switch (code) |
1019 | { |
1020 | case BIT_IOR_EXPR: |
1021 | res = wi::bit_or (arg1, arg2); |
1022 | break; |
1023 | |
1024 | case BIT_XOR_EXPR: |
1025 | res = wi::bit_xor (arg1, arg2); |
1026 | break; |
1027 | |
1028 | case BIT_AND_EXPR: |
1029 | res = wi::bit_and (arg1, arg2); |
1030 | break; |
1031 | |
1032 | case LSHIFT_EXPR: |
1033 | if (wi::neg_p (arg2)) |
1034 | return false; |
1035 | res = wi::lshift (arg1, arg2); |
1036 | break; |
1037 | |
1038 | case RSHIFT_EXPR: |
1039 | if (wi::neg_p (arg2)) |
1040 | return false; |
1041 | /* It's unclear from the C standard whether shifts can overflow. |
1042 | The following code ignores overflow; perhaps a C standard |
1043 | interpretation ruling is needed. */ |
1044 | res = wi::rshift (arg1, arg2, sign); |
1045 | break; |
1046 | |
1047 | case RROTATE_EXPR: |
1048 | case LROTATE_EXPR: |
1049 | if (wi::neg_p (arg2)) |
1050 | { |
1051 | tmp = -arg2; |
1052 | if (code == RROTATE_EXPR) |
1053 | code = LROTATE_EXPR; |
1054 | else |
1055 | code = RROTATE_EXPR; |
1056 | } |
1057 | else |
1058 | tmp = arg2; |
1059 | |
1060 | if (code == RROTATE_EXPR) |
1061 | res = wi::rrotate (arg1, tmp); |
1062 | else |
1063 | res = wi::lrotate (arg1, tmp); |
1064 | break; |
1065 | |
1066 | case PLUS_EXPR: |
1067 | res = wi::add (arg1, arg2, sign, overflow); |
1068 | break; |
1069 | |
1070 | case MINUS_EXPR: |
1071 | res = wi::sub (arg1, arg2, sign, overflow); |
1072 | break; |
1073 | |
1074 | case MULT_EXPR: |
1075 | res = wi::mul (arg1, arg2, sign, overflow); |
1076 | break; |
1077 | |
1078 | case MULT_HIGHPART_EXPR: |
1079 | res = wi::mul_high (arg1, arg2, sign); |
1080 | break; |
1081 | |
1082 | case TRUNC_DIV_EXPR: |
1083 | case EXACT_DIV_EXPR: |
1084 | if (arg2 == 0) |
1085 | return false; |
1086 | res = wi::div_trunc (arg1, arg2, sign, overflow); |
1087 | break; |
1088 | |
1089 | case FLOOR_DIV_EXPR: |
1090 | if (arg2 == 0) |
1091 | return false; |
1092 | res = wi::div_floor (arg1, arg2, sign, overflow); |
1093 | break; |
1094 | |
1095 | case CEIL_DIV_EXPR: |
1096 | if (arg2 == 0) |
1097 | return false; |
1098 | res = wi::div_ceil (arg1, arg2, sign, overflow); |
1099 | break; |
1100 | |
1101 | case ROUND_DIV_EXPR: |
1102 | if (arg2 == 0) |
1103 | return false; |
1104 | res = wi::div_round (arg1, arg2, sign, overflow); |
1105 | break; |
1106 | |
1107 | case TRUNC_MOD_EXPR: |
1108 | if (arg2 == 0) |
1109 | return false; |
1110 | res = wi::mod_trunc (arg1, arg2, sign, overflow); |
1111 | break; |
1112 | |
1113 | case FLOOR_MOD_EXPR: |
1114 | if (arg2 == 0) |
1115 | return false; |
1116 | res = wi::mod_floor (arg1, arg2, sign, overflow); |
1117 | break; |
1118 | |
1119 | case CEIL_MOD_EXPR: |
1120 | if (arg2 == 0) |
1121 | return false; |
1122 | res = wi::mod_ceil (arg1, arg2, sign, overflow); |
1123 | break; |
1124 | |
1125 | case ROUND_MOD_EXPR: |
1126 | if (arg2 == 0) |
1127 | return false; |
1128 | res = wi::mod_round (arg1, arg2, sign, overflow); |
1129 | break; |
1130 | |
1131 | case MIN_EXPR: |
1132 | res = wi::min (arg1, arg2, sign); |
1133 | break; |
1134 | |
1135 | case MAX_EXPR: |
1136 | res = wi::max (arg1, arg2, sign); |
1137 | break; |
1138 | |
1139 | default: |
1140 | return false; |
1141 | } |
1142 | return true; |
1143 | } |
1144 | |
1145 | /* Combine two poly int's ARG1 and ARG2 under operation CODE to |
1146 | produce a new constant in RES. Return FALSE if we don't know how |
1147 | to evaluate CODE at compile-time. */ |
1148 | |
1149 | static bool |
1150 | poly_int_binop (poly_wide_int &res, enum tree_code code, |
1151 | const_tree arg1, const_tree arg2, |
1152 | signop sign, wi::overflow_type *overflow) |
1153 | { |
1154 | gcc_assert (NUM_POLY_INT_COEFFS != 1)((void)(!(1 != 1) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1154, __FUNCTION__), 0 : 0)); |
1155 | gcc_assert (poly_int_tree_p (arg1) && poly_int_tree_p (arg2))((void)(!(poly_int_tree_p (arg1) && poly_int_tree_p ( arg2)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1155, __FUNCTION__), 0 : 0)); |
1156 | switch (code) |
1157 | { |
1158 | case PLUS_EXPR: |
1159 | res = wi::add (wi::to_poly_wide (arg1), |
1160 | wi::to_poly_wide (arg2), sign, overflow); |
1161 | break; |
1162 | |
1163 | case MINUS_EXPR: |
1164 | res = wi::sub (wi::to_poly_wide (arg1), |
1165 | wi::to_poly_wide (arg2), sign, overflow); |
1166 | break; |
1167 | |
1168 | case MULT_EXPR: |
1169 | if (TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) == INTEGER_CST) |
1170 | res = wi::mul (wi::to_poly_wide (arg1), |
1171 | wi::to_wide (arg2), sign, overflow); |
1172 | else if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == INTEGER_CST) |
1173 | res = wi::mul (wi::to_poly_wide (arg2), |
1174 | wi::to_wide (arg1), sign, overflow); |
1175 | else |
1176 | return NULL_TREE(tree) __null; |
1177 | break; |
1178 | |
1179 | case LSHIFT_EXPR: |
1180 | if (TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) == INTEGER_CST) |
1181 | res = wi::to_poly_wide (arg1) << wi::to_wide (arg2); |
1182 | else |
1183 | return false; |
1184 | break; |
1185 | |
1186 | case BIT_IOR_EXPR: |
1187 | if (TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) != INTEGER_CST |
1188 | || !can_ior_p (wi::to_poly_wide (arg1), wi::to_wide (arg2), |
1189 | &res)) |
1190 | return false; |
1191 | break; |
1192 | |
1193 | default: |
1194 | return false; |
1195 | } |
1196 | return true; |
1197 | } |
1198 | |
1199 | /* Combine two integer constants ARG1 and ARG2 under operation CODE to |
1200 | produce a new constant. Return NULL_TREE if we don't know how to |
1201 | evaluate CODE at compile-time. */ |
1202 | |
1203 | tree |
1204 | int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2, |
1205 | int overflowable) |
1206 | { |
1207 | poly_wide_int poly_res; |
1208 | tree type = TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1208, __FUNCTION__))->typed.type); |
1209 | signop sign = TYPE_SIGN (type)((signop) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1209, __FUNCTION__))->base.u.bits.unsigned_flag)); |
1210 | wi::overflow_type overflow = wi::OVF_NONE; |
1211 | |
1212 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == INTEGER_CST && TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) == INTEGER_CST) |
1213 | { |
1214 | wide_int warg1 = wi::to_wide (arg1), res; |
1215 | wide_int warg2 = wi::to_wide (arg2, TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1215, __FUNCTION__))->type_common.precision)); |
1216 | if (!wide_int_binop (res, code, warg1, warg2, sign, &overflow)) |
1217 | return NULL_TREE(tree) __null; |
1218 | poly_res = res; |
1219 | } |
1220 | else if (!poly_int_tree_p (arg1) |
1221 | || !poly_int_tree_p (arg2) |
1222 | || !poly_int_binop (poly_res, code, arg1, arg2, sign, &overflow)) |
1223 | return NULL_TREE(tree) __null; |
1224 | return force_fit_type (type, poly_res, overflowable, |
1225 | (((sign == SIGNED || overflowable == -1) |
1226 | && overflow) |
1227 | | TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1227, __FUNCTION__))->base.public_flag) | TREE_OVERFLOW (arg2)((tree_class_check ((arg2), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1227, __FUNCTION__))->base.public_flag))); |
1228 | } |
1229 | |
1230 | /* Return true if binary operation OP distributes over addition in operand |
1231 | OPNO, with the other operand being held constant. OPNO counts from 1. */ |
1232 | |
1233 | static bool |
1234 | distributes_over_addition_p (tree_code op, int opno) |
1235 | { |
1236 | switch (op) |
1237 | { |
1238 | case PLUS_EXPR: |
1239 | case MINUS_EXPR: |
1240 | case MULT_EXPR: |
1241 | return true; |
1242 | |
1243 | case LSHIFT_EXPR: |
1244 | return opno == 1; |
1245 | |
1246 | default: |
1247 | return false; |
1248 | } |
1249 | } |
1250 | |
1251 | /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new |
1252 | constant. We assume ARG1 and ARG2 have the same data type, or at least |
1253 | are the same kind of constant and the same machine mode. Return zero if |
1254 | combining the constants is not allowed in the current operating mode. */ |
1255 | |
1256 | static tree |
1257 | const_binop (enum tree_code code, tree arg1, tree arg2) |
1258 | { |
1259 | /* Sanity check for the recursive cases. */ |
1260 | if (!arg1 || !arg2) |
1261 | return NULL_TREE(tree) __null; |
1262 | |
1263 | STRIP_NOPS (arg1)(arg1) = tree_strip_nop_conversions ((const_cast<union tree_node *> (((arg1))))); |
1264 | STRIP_NOPS (arg2)(arg2) = tree_strip_nop_conversions ((const_cast<union tree_node *> (((arg2))))); |
1265 | |
1266 | if (poly_int_tree_p (arg1) && poly_int_tree_p (arg2)) |
1267 | { |
1268 | if (code == POINTER_PLUS_EXPR) |
1269 | return int_const_binop (PLUS_EXPR, |
1270 | arg1, fold_convert (TREE_TYPE (arg1), arg2)fold_convert_loc (((location_t) 0), ((contains_struct_check ( (arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1270, __FUNCTION__))->typed.type), arg2)); |
1271 | |
1272 | return int_const_binop (code, arg1, arg2); |
1273 | } |
1274 | |
1275 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == REAL_CST && TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) == REAL_CST) |
1276 | { |
1277 | machine_mode mode; |
1278 | REAL_VALUE_TYPEstruct real_value d1; |
1279 | REAL_VALUE_TYPEstruct real_value d2; |
1280 | REAL_VALUE_TYPEstruct real_value value; |
1281 | REAL_VALUE_TYPEstruct real_value result; |
1282 | bool inexact; |
1283 | tree t, type; |
1284 | |
1285 | /* The following codes are handled by real_arithmetic. */ |
1286 | switch (code) |
1287 | { |
1288 | case PLUS_EXPR: |
1289 | case MINUS_EXPR: |
1290 | case MULT_EXPR: |
1291 | case RDIV_EXPR: |
1292 | case MIN_EXPR: |
1293 | case MAX_EXPR: |
1294 | break; |
1295 | |
1296 | default: |
1297 | return NULL_TREE(tree) __null; |
1298 | } |
1299 | |
1300 | d1 = TREE_REAL_CST (arg1)(*(&(tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1300, __FUNCTION__, (REAL_CST)))->real_cst.value)); |
1301 | d2 = TREE_REAL_CST (arg2)(*(&(tree_check ((arg2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1301, __FUNCTION__, (REAL_CST)))->real_cst.value)); |
1302 | |
1303 | type = TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1303, __FUNCTION__))->typed.type); |
1304 | mode = TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1304, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode); |
1305 | |
1306 | /* Don't perform operation if we honor signaling NaNs and |
1307 | either operand is a signaling NaN. */ |
1308 | if (HONOR_SNANS (mode) |
1309 | && (REAL_VALUE_ISSIGNALING_NAN (d1)real_issignaling_nan (&(d1)) |
1310 | || REAL_VALUE_ISSIGNALING_NAN (d2)real_issignaling_nan (&(d2)))) |
1311 | return NULL_TREE(tree) __null; |
1312 | |
1313 | /* Don't perform operation if it would raise a division |
1314 | by zero exception. */ |
1315 | if (code == RDIV_EXPR |
1316 | && real_equal (&d2, &dconst0) |
1317 | && (flag_trapping_mathglobal_options.x_flag_trapping_math || ! MODE_HAS_INFINITIES (mode)((((enum mode_class) mode_class[mode]) == MODE_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_DECIMAL_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_COMPLEX_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_VECTOR_FLOAT) && ((real_format_for_mode[(((enum mode_class) mode_class[as_a < scalar_float_mode> ((mode_to_inner (mode)))]) == MODE_DECIMAL_FLOAT ) ? (((as_a <scalar_float_mode> ((mode_to_inner (mode)) )) - MIN_MODE_DECIMAL_FLOAT) + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) : ((enum mode_class) mode_class[as_a <scalar_float_mode > ((mode_to_inner (mode)))]) == MODE_FLOAT ? ((as_a <scalar_float_mode > ((mode_to_inner (mode)))) - MIN_MODE_FLOAT) : ((fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1317, __FUNCTION__)), 0)]))->has_inf))) |
1318 | return NULL_TREE(tree) __null; |
1319 | |
1320 | /* If either operand is a NaN, just return it. Otherwise, set up |
1321 | for floating-point trap; we return an overflow. */ |
1322 | if (REAL_VALUE_ISNAN (d1)real_isnan (&(d1))) |
1323 | { |
1324 | /* Make resulting NaN value to be qNaN when flag_signaling_nans |
1325 | is off. */ |
1326 | d1.signalling = 0; |
1327 | t = build_real (type, d1); |
1328 | return t; |
1329 | } |
1330 | else if (REAL_VALUE_ISNAN (d2)real_isnan (&(d2))) |
1331 | { |
1332 | /* Make resulting NaN value to be qNaN when flag_signaling_nans |
1333 | is off. */ |
1334 | d2.signalling = 0; |
1335 | t = build_real (type, d2); |
1336 | return t; |
1337 | } |
1338 | |
1339 | inexact = real_arithmetic (&value, code, &d1, &d2); |
1340 | real_convert (&result, mode, &value); |
1341 | |
1342 | /* Don't constant fold this floating point operation if |
1343 | both operands are not NaN but the result is NaN, and |
1344 | flag_trapping_math. Such operations should raise an |
1345 | invalid operation exception. */ |
1346 | if (flag_trapping_mathglobal_options.x_flag_trapping_math |
1347 | && MODE_HAS_NANS (mode)((((enum mode_class) mode_class[mode]) == MODE_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_DECIMAL_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_COMPLEX_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_VECTOR_FLOAT) && ((real_format_for_mode[(((enum mode_class) mode_class[as_a < scalar_float_mode> ((mode_to_inner (mode)))]) == MODE_DECIMAL_FLOAT ) ? (((as_a <scalar_float_mode> ((mode_to_inner (mode)) )) - MIN_MODE_DECIMAL_FLOAT) + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) : ((enum mode_class) mode_class[as_a <scalar_float_mode > ((mode_to_inner (mode)))]) == MODE_FLOAT ? ((as_a <scalar_float_mode > ((mode_to_inner (mode)))) - MIN_MODE_FLOAT) : ((fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1347, __FUNCTION__)), 0)]))->has_nans) |
1348 | && REAL_VALUE_ISNAN (result)real_isnan (&(result)) |
1349 | && !REAL_VALUE_ISNAN (d1)real_isnan (&(d1)) |
1350 | && !REAL_VALUE_ISNAN (d2)real_isnan (&(d2))) |
1351 | return NULL_TREE(tree) __null; |
1352 | |
1353 | /* Don't constant fold this floating point operation if |
1354 | the result has overflowed and flag_trapping_math. */ |
1355 | if (flag_trapping_mathglobal_options.x_flag_trapping_math |
1356 | && MODE_HAS_INFINITIES (mode)((((enum mode_class) mode_class[mode]) == MODE_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_DECIMAL_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_COMPLEX_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_VECTOR_FLOAT) && ((real_format_for_mode[(((enum mode_class) mode_class[as_a < scalar_float_mode> ((mode_to_inner (mode)))]) == MODE_DECIMAL_FLOAT ) ? (((as_a <scalar_float_mode> ((mode_to_inner (mode)) )) - MIN_MODE_DECIMAL_FLOAT) + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) : ((enum mode_class) mode_class[as_a <scalar_float_mode > ((mode_to_inner (mode)))]) == MODE_FLOAT ? ((as_a <scalar_float_mode > ((mode_to_inner (mode)))) - MIN_MODE_FLOAT) : ((fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1356, __FUNCTION__)), 0)]))->has_inf) |
1357 | && REAL_VALUE_ISINF (result)real_isinf (&(result)) |
1358 | && !REAL_VALUE_ISINF (d1)real_isinf (&(d1)) |
1359 | && !REAL_VALUE_ISINF (d2)real_isinf (&(d2))) |
1360 | return NULL_TREE(tree) __null; |
1361 | |
1362 | /* Don't constant fold this floating point operation if the |
1363 | result may dependent upon the run-time rounding mode and |
1364 | flag_rounding_math is set, or if GCC's software emulation |
1365 | is unable to accurately represent the result. */ |
1366 | if ((flag_rounding_mathglobal_options.x_flag_rounding_math |
1367 | || (MODE_COMPOSITE_P (mode)((((enum mode_class) mode_class[mode]) == MODE_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_DECIMAL_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_COMPLEX_FLOAT || ((enum mode_class) mode_class[mode]) == MODE_VECTOR_FLOAT) && ((real_format_for_mode[(((enum mode_class) mode_class[as_a < scalar_float_mode> ((mode_to_inner (mode)))]) == MODE_DECIMAL_FLOAT ) ? (((as_a <scalar_float_mode> ((mode_to_inner (mode)) )) - MIN_MODE_DECIMAL_FLOAT) + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) : ((enum mode_class) mode_class[as_a <scalar_float_mode > ((mode_to_inner (mode)))]) == MODE_FLOAT ? ((as_a <scalar_float_mode > ((mode_to_inner (mode)))) - MIN_MODE_FLOAT) : ((fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1367, __FUNCTION__)), 0)]))->pnan < ((real_format_for_mode [(((enum mode_class) mode_class[as_a <scalar_float_mode> ((mode_to_inner (mode)))]) == MODE_DECIMAL_FLOAT) ? (((as_a < scalar_float_mode> ((mode_to_inner (mode)))) - MIN_MODE_DECIMAL_FLOAT ) + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) : ((enum mode_class ) mode_class[as_a <scalar_float_mode> ((mode_to_inner ( mode)))]) == MODE_FLOAT ? ((as_a <scalar_float_mode> (( mode_to_inner (mode)))) - MIN_MODE_FLOAT) : ((fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1367, __FUNCTION__)), 0)]))->p) && !flag_unsafe_math_optimizationsglobal_options.x_flag_unsafe_math_optimizations)) |
1368 | && (inexact || !real_identical (&result, &value))) |
1369 | return NULL_TREE(tree) __null; |
1370 | |
1371 | t = build_real (type, result); |
1372 | |
1373 | TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1373, __FUNCTION__))->base.public_flag) = TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1373, __FUNCTION__))->base.public_flag) | TREE_OVERFLOW (arg2)((tree_class_check ((arg2), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1373, __FUNCTION__))->base.public_flag); |
1374 | return t; |
1375 | } |
1376 | |
1377 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == FIXED_CST) |
1378 | { |
1379 | FIXED_VALUE_TYPEstruct fixed_value f1; |
1380 | FIXED_VALUE_TYPEstruct fixed_value f2; |
1381 | FIXED_VALUE_TYPEstruct fixed_value result; |
1382 | tree t, type; |
1383 | int sat_p; |
1384 | bool overflow_p; |
1385 | |
1386 | /* The following codes are handled by fixed_arithmetic. */ |
1387 | switch (code) |
1388 | { |
1389 | case PLUS_EXPR: |
1390 | case MINUS_EXPR: |
1391 | case MULT_EXPR: |
1392 | case TRUNC_DIV_EXPR: |
1393 | if (TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) != FIXED_CST) |
1394 | return NULL_TREE(tree) __null; |
1395 | f2 = TREE_FIXED_CST (arg2)(*((tree_check ((arg2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1395, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr )); |
1396 | break; |
1397 | |
1398 | case LSHIFT_EXPR: |
1399 | case RSHIFT_EXPR: |
1400 | { |
1401 | if (TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) != INTEGER_CST) |
1402 | return NULL_TREE(tree) __null; |
1403 | wi::tree_to_wide_ref w2 = wi::to_wide (arg2); |
1404 | f2.data.high = w2.elt (1); |
1405 | f2.data.low = w2.ulow (); |
1406 | f2.mode = SImode(scalar_int_mode ((scalar_int_mode::from_int) E_SImode)); |
1407 | } |
1408 | break; |
1409 | |
1410 | default: |
1411 | return NULL_TREE(tree) __null; |
1412 | } |
1413 | |
1414 | f1 = TREE_FIXED_CST (arg1)(*((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1414, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr )); |
1415 | type = TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1415, __FUNCTION__))->typed.type); |
1416 | sat_p = TYPE_SATURATING (type)((tree_not_check4 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1416, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE ), (ARRAY_TYPE)))->base.u.bits.saturating_flag); |
1417 | overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p); |
1418 | t = build_fixed (type, result); |
1419 | /* Propagate overflow flags. */ |
1420 | if (overflow_p | TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1420, __FUNCTION__))->base.public_flag) | TREE_OVERFLOW (arg2)((tree_class_check ((arg2), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1420, __FUNCTION__))->base.public_flag)) |
1421 | TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1421, __FUNCTION__))->base.public_flag) = 1; |
1422 | return t; |
1423 | } |
1424 | |
1425 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == COMPLEX_CST && TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) == COMPLEX_CST) |
1426 | { |
1427 | tree type = TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1427, __FUNCTION__))->typed.type); |
1428 | tree r1 = TREE_REALPART (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1428, __FUNCTION__, (COMPLEX_CST)))->complex.real); |
1429 | tree i1 = TREE_IMAGPART (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1429, __FUNCTION__, (COMPLEX_CST)))->complex.imag); |
1430 | tree r2 = TREE_REALPART (arg2)((tree_check ((arg2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1430, __FUNCTION__, (COMPLEX_CST)))->complex.real); |
1431 | tree i2 = TREE_IMAGPART (arg2)((tree_check ((arg2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1431, __FUNCTION__, (COMPLEX_CST)))->complex.imag); |
1432 | tree real, imag; |
1433 | |
1434 | switch (code) |
1435 | { |
1436 | case PLUS_EXPR: |
1437 | case MINUS_EXPR: |
1438 | real = const_binop (code, r1, r2); |
1439 | imag = const_binop (code, i1, i2); |
1440 | break; |
1441 | |
1442 | case MULT_EXPR: |
1443 | if (COMPLEX_FLOAT_TYPE_P (type)(((enum tree_code) (type)->base.code) == COMPLEX_TYPE && ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1443, __FUNCTION__))->typed.type))->base.code) == REAL_TYPE )) |
1444 | return do_mpc_arg2 (arg1, arg2, type, |
1445 | /* do_nonfinite= */ folding_initializer, |
1446 | mpc_mul); |
1447 | |
1448 | real = const_binop (MINUS_EXPR, |
1449 | const_binop (MULT_EXPR, r1, r2), |
1450 | const_binop (MULT_EXPR, i1, i2)); |
1451 | imag = const_binop (PLUS_EXPR, |
1452 | const_binop (MULT_EXPR, r1, i2), |
1453 | const_binop (MULT_EXPR, i1, r2)); |
1454 | break; |
1455 | |
1456 | case RDIV_EXPR: |
1457 | if (COMPLEX_FLOAT_TYPE_P (type)(((enum tree_code) (type)->base.code) == COMPLEX_TYPE && ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1457, __FUNCTION__))->typed.type))->base.code) == REAL_TYPE )) |
1458 | return do_mpc_arg2 (arg1, arg2, type, |
1459 | /* do_nonfinite= */ folding_initializer, |
1460 | mpc_div); |
1461 | /* Fallthru. */ |
1462 | case TRUNC_DIV_EXPR: |
1463 | case CEIL_DIV_EXPR: |
1464 | case FLOOR_DIV_EXPR: |
1465 | case ROUND_DIV_EXPR: |
1466 | if (flag_complex_methodglobal_options.x_flag_complex_method == 0) |
1467 | { |
1468 | /* Keep this algorithm in sync with |
1469 | tree-complex.cc:expand_complex_div_straight(). |
1470 | |
1471 | Expand complex division to scalars, straightforward algorithm. |
1472 | a / b = ((ar*br + ai*bi)/t) + i((ai*br - ar*bi)/t) |
1473 | t = br*br + bi*bi |
1474 | */ |
1475 | tree magsquared |
1476 | = const_binop (PLUS_EXPR, |
1477 | const_binop (MULT_EXPR, r2, r2), |
1478 | const_binop (MULT_EXPR, i2, i2)); |
1479 | tree t1 |
1480 | = const_binop (PLUS_EXPR, |
1481 | const_binop (MULT_EXPR, r1, r2), |
1482 | const_binop (MULT_EXPR, i1, i2)); |
1483 | tree t2 |
1484 | = const_binop (MINUS_EXPR, |
1485 | const_binop (MULT_EXPR, i1, r2), |
1486 | const_binop (MULT_EXPR, r1, i2)); |
1487 | |
1488 | real = const_binop (code, t1, magsquared); |
1489 | imag = const_binop (code, t2, magsquared); |
1490 | } |
1491 | else |
1492 | { |
1493 | /* Keep this algorithm in sync with |
1494 | tree-complex.cc:expand_complex_div_wide(). |
1495 | |
1496 | Expand complex division to scalars, modified algorithm to minimize |
1497 | overflow with wide input ranges. */ |
1498 | tree compare = fold_build2 (LT_EXPR, boolean_type_node,fold_build2_loc (((location_t) 0), LT_EXPR, global_trees[TI_BOOLEAN_TYPE ], fold_abs_const (r2, ((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1499, __FUNCTION__))->typed.type)), fold_abs_const (i2, ( (contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1500, __FUNCTION__))->typed.type)) ) |
1499 | fold_abs_const (r2, TREE_TYPE (type)),fold_build2_loc (((location_t) 0), LT_EXPR, global_trees[TI_BOOLEAN_TYPE ], fold_abs_const (r2, ((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1499, __FUNCTION__))->typed.type)), fold_abs_const (i2, ( (contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1500, __FUNCTION__))->typed.type)) ) |
1500 | fold_abs_const (i2, TREE_TYPE (type)))fold_build2_loc (((location_t) 0), LT_EXPR, global_trees[TI_BOOLEAN_TYPE ], fold_abs_const (r2, ((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1499, __FUNCTION__))->typed.type)), fold_abs_const (i2, ( (contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1500, __FUNCTION__))->typed.type)) ); |
1501 | |
1502 | if (integer_nonzerop (compare)) |
1503 | { |
1504 | /* In the TRUE branch, we compute |
1505 | ratio = br/bi; |
1506 | div = (br * ratio) + bi; |
1507 | tr = (ar * ratio) + ai; |
1508 | ti = (ai * ratio) - ar; |
1509 | tr = tr / div; |
1510 | ti = ti / div; */ |
1511 | tree ratio = const_binop (code, r2, i2); |
1512 | tree div = const_binop (PLUS_EXPR, i2, |
1513 | const_binop (MULT_EXPR, r2, ratio)); |
1514 | real = const_binop (MULT_EXPR, r1, ratio); |
1515 | real = const_binop (PLUS_EXPR, real, i1); |
1516 | real = const_binop (code, real, div); |
1517 | |
1518 | imag = const_binop (MULT_EXPR, i1, ratio); |
1519 | imag = const_binop (MINUS_EXPR, imag, r1); |
1520 | imag = const_binop (code, imag, div); |
1521 | } |
1522 | else |
1523 | { |
1524 | /* In the FALSE branch, we compute |
1525 | ratio = d/c; |
1526 | divisor = (d * ratio) + c; |
1527 | tr = (b * ratio) + a; |
1528 | ti = b - (a * ratio); |
1529 | tr = tr / div; |
1530 | ti = ti / div; */ |
1531 | tree ratio = const_binop (code, i2, r2); |
1532 | tree div = const_binop (PLUS_EXPR, r2, |
1533 | const_binop (MULT_EXPR, i2, ratio)); |
1534 | |
1535 | real = const_binop (MULT_EXPR, i1, ratio); |
1536 | real = const_binop (PLUS_EXPR, real, r1); |
1537 | real = const_binop (code, real, div); |
1538 | |
1539 | imag = const_binop (MULT_EXPR, r1, ratio); |
1540 | imag = const_binop (MINUS_EXPR, i1, imag); |
1541 | imag = const_binop (code, imag, div); |
1542 | } |
1543 | } |
1544 | break; |
1545 | |
1546 | default: |
1547 | return NULL_TREE(tree) __null; |
1548 | } |
1549 | |
1550 | if (real && imag) |
1551 | return build_complex (type, real, imag); |
1552 | } |
1553 | |
1554 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == VECTOR_CST |
1555 | && TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) == VECTOR_CST |
1556 | && known_eq (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)),(!maybe_ne (TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg1 ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1556, __FUNCTION__))->typed.type)), TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg2), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1557, __FUNCTION__))->typed.type)))) |
1557 | TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg2)))(!maybe_ne (TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg1 ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1556, __FUNCTION__))->typed.type)), TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg2), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1557, __FUNCTION__))->typed.type))))) |
1558 | { |
1559 | tree type = TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1559, __FUNCTION__))->typed.type); |
1560 | bool step_ok_p; |
1561 | if (VECTOR_CST_STEPPED_P (arg1)(((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1561, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern ) == 3) |
1562 | && VECTOR_CST_STEPPED_P (arg2)(((tree_check ((arg2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1562, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern ) == 3)) |
1563 | /* We can operate directly on the encoding if: |
1564 | |
1565 | a3 - a2 == a2 - a1 && b3 - b2 == b2 - b1 |
1566 | implies |
1567 | (a3 op b3) - (a2 op b2) == (a2 op b2) - (a1 op b1) |
1568 | |
1569 | Addition and subtraction are the supported operators |
1570 | for which this is true. */ |
1571 | step_ok_p = (code == PLUS_EXPR || code == MINUS_EXPR); |
1572 | else if (VECTOR_CST_STEPPED_P (arg1)(((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1572, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern ) == 3)) |
1573 | /* We can operate directly on stepped encodings if: |
1574 | |
1575 | a3 - a2 == a2 - a1 |
1576 | implies: |
1577 | (a3 op c) - (a2 op c) == (a2 op c) - (a1 op c) |
1578 | |
1579 | which is true if (x -> x op c) distributes over addition. */ |
1580 | step_ok_p = distributes_over_addition_p (code, 1); |
1581 | else |
1582 | /* Similarly in reverse. */ |
1583 | step_ok_p = distributes_over_addition_p (code, 2); |
1584 | tree_vector_builder elts; |
1585 | if (!elts.new_binary_operation (type, arg1, arg2, step_ok_p)) |
1586 | return NULL_TREE(tree) __null; |
1587 | unsigned int count = elts.encoded_nelts (); |
1588 | for (unsigned int i = 0; i < count; ++i) |
1589 | { |
1590 | tree elem1 = VECTOR_CST_ELT (arg1, i)vector_cst_elt (arg1, i); |
1591 | tree elem2 = VECTOR_CST_ELT (arg2, i)vector_cst_elt (arg2, i); |
1592 | |
1593 | tree elt = const_binop (code, elem1, elem2); |
1594 | |
1595 | /* It is possible that const_binop cannot handle the given |
1596 | code and return NULL_TREE */ |
1597 | if (elt == NULL_TREE(tree) __null) |
1598 | return NULL_TREE(tree) __null; |
1599 | elts.quick_push (elt); |
1600 | } |
1601 | |
1602 | return elts.build (); |
1603 | } |
1604 | |
1605 | /* Shifts allow a scalar offset for a vector. */ |
1606 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == VECTOR_CST |
1607 | && TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) == INTEGER_CST) |
1608 | { |
1609 | tree type = TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1609, __FUNCTION__))->typed.type); |
1610 | bool step_ok_p = distributes_over_addition_p (code, 1); |
1611 | tree_vector_builder elts; |
1612 | if (!elts.new_unary_operation (type, arg1, step_ok_p)) |
1613 | return NULL_TREE(tree) __null; |
1614 | unsigned int count = elts.encoded_nelts (); |
1615 | for (unsigned int i = 0; i < count; ++i) |
1616 | { |
1617 | tree elem1 = VECTOR_CST_ELT (arg1, i)vector_cst_elt (arg1, i); |
1618 | |
1619 | tree elt = const_binop (code, elem1, arg2); |
1620 | |
1621 | /* It is possible that const_binop cannot handle the given |
1622 | code and return NULL_TREE. */ |
1623 | if (elt == NULL_TREE(tree) __null) |
1624 | return NULL_TREE(tree) __null; |
1625 | elts.quick_push (elt); |
1626 | } |
1627 | |
1628 | return elts.build (); |
1629 | } |
1630 | return NULL_TREE(tree) __null; |
1631 | } |
1632 | |
1633 | /* Overload that adds a TYPE parameter to be able to dispatch |
1634 | to fold_relational_const. */ |
1635 | |
1636 | tree |
1637 | const_binop (enum tree_code code, tree type, tree arg1, tree arg2) |
1638 | { |
1639 | if (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_comparison) |
1640 | return fold_relational_const (code, type, arg1, arg2); |
1641 | |
1642 | /* ??? Until we make the const_binop worker take the type of the |
1643 | result as argument put those cases that need it here. */ |
1644 | switch (code) |
1645 | { |
1646 | case VEC_SERIES_EXPR: |
1647 | if (CONSTANT_CLASS_P (arg1)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (arg1)->base.code))] == tcc_constant) |
1648 | && CONSTANT_CLASS_P (arg2)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (arg2)->base.code))] == tcc_constant)) |
1649 | return build_vec_series (type, arg1, arg2); |
1650 | return NULL_TREE(tree) __null; |
1651 | |
1652 | case COMPLEX_EXPR: |
1653 | if ((TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == REAL_CST |
1654 | && TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) == REAL_CST) |
1655 | || (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == INTEGER_CST |
1656 | && TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) == INTEGER_CST)) |
1657 | return build_complex (type, arg1, arg2); |
1658 | return NULL_TREE(tree) __null; |
1659 | |
1660 | case POINTER_DIFF_EXPR: |
1661 | if (poly_int_tree_p (arg1) && poly_int_tree_p (arg2)) |
1662 | { |
1663 | poly_offset_int res = (wi::to_poly_offset (arg1) |
1664 | - wi::to_poly_offset (arg2)); |
1665 | return force_fit_type (type, res, 1, |
1666 | TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1666, __FUNCTION__))->base.public_flag) | TREE_OVERFLOW (arg2)((tree_class_check ((arg2), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1666, __FUNCTION__))->base.public_flag)); |
1667 | } |
1668 | return NULL_TREE(tree) __null; |
1669 | |
1670 | case VEC_PACK_TRUNC_EXPR: |
1671 | case VEC_PACK_FIX_TRUNC_EXPR: |
1672 | case VEC_PACK_FLOAT_EXPR: |
1673 | { |
1674 | unsigned int HOST_WIDE_INTlong out_nelts, in_nelts, i; |
1675 | |
1676 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) != VECTOR_CST |
1677 | || TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) != VECTOR_CST) |
1678 | return NULL_TREE(tree) __null; |
1679 | |
1680 | if (!VECTOR_CST_NELTS (arg1)(TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1680, __FUNCTION__))->typed.type))).is_constant (&in_nelts)) |
1681 | return NULL_TREE(tree) __null; |
1682 | |
1683 | out_nelts = in_nelts * 2; |
1684 | gcc_assert (known_eq (in_nelts, VECTOR_CST_NELTS (arg2))((void)(!((!maybe_ne (in_nelts, (TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg2), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1684, __FUNCTION__))->typed.type))))) && (!maybe_ne (out_nelts, TYPE_VECTOR_SUBPARTS (type)))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1685, __FUNCTION__), 0 : 0)) |
1685 | && known_eq (out_nelts, TYPE_VECTOR_SUBPARTS (type)))((void)(!((!maybe_ne (in_nelts, (TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg2), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1684, __FUNCTION__))->typed.type))))) && (!maybe_ne (out_nelts, TYPE_VECTOR_SUBPARTS (type)))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1685, __FUNCTION__), 0 : 0)); |
1686 | |
1687 | tree_vector_builder elts (type, out_nelts, 1); |
1688 | for (i = 0; i < out_nelts; i++) |
1689 | { |
1690 | tree elt = (i < in_nelts |
1691 | ? VECTOR_CST_ELT (arg1, i)vector_cst_elt (arg1, i) |
1692 | : VECTOR_CST_ELT (arg2, i - in_nelts)vector_cst_elt (arg2, i - in_nelts)); |
1693 | elt = fold_convert_const (code == VEC_PACK_TRUNC_EXPR |
1694 | ? NOP_EXPR |
1695 | : code == VEC_PACK_FLOAT_EXPR |
1696 | ? FLOAT_EXPR : FIX_TRUNC_EXPR, |
1697 | TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1697, __FUNCTION__))->typed.type), elt); |
1698 | if (elt == NULL_TREE(tree) __null || !CONSTANT_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (elt)->base.code))] == tcc_constant)) |
1699 | return NULL_TREE(tree) __null; |
1700 | elts.quick_push (elt); |
1701 | } |
1702 | |
1703 | return elts.build (); |
1704 | } |
1705 | |
1706 | case VEC_WIDEN_MULT_LO_EXPR: |
1707 | case VEC_WIDEN_MULT_HI_EXPR: |
1708 | case VEC_WIDEN_MULT_EVEN_EXPR: |
1709 | case VEC_WIDEN_MULT_ODD_EXPR: |
1710 | { |
1711 | unsigned HOST_WIDE_INTlong out_nelts, in_nelts, out, ofs, scale; |
1712 | |
1713 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) != VECTOR_CST || TREE_CODE (arg2)((enum tree_code) (arg2)->base.code) != VECTOR_CST) |
1714 | return NULL_TREE(tree) __null; |
1715 | |
1716 | if (!VECTOR_CST_NELTS (arg1)(TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1716, __FUNCTION__))->typed.type))).is_constant (&in_nelts)) |
1717 | return NULL_TREE(tree) __null; |
1718 | out_nelts = in_nelts / 2; |
1719 | gcc_assert (known_eq (in_nelts, VECTOR_CST_NELTS (arg2))((void)(!((!maybe_ne (in_nelts, (TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg2), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1719, __FUNCTION__))->typed.type))))) && (!maybe_ne (out_nelts, TYPE_VECTOR_SUBPARTS (type)))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1720, __FUNCTION__), 0 : 0)) |
1720 | && known_eq (out_nelts, TYPE_VECTOR_SUBPARTS (type)))((void)(!((!maybe_ne (in_nelts, (TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg2), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1719, __FUNCTION__))->typed.type))))) && (!maybe_ne (out_nelts, TYPE_VECTOR_SUBPARTS (type)))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1720, __FUNCTION__), 0 : 0)); |
1721 | |
1722 | if (code == VEC_WIDEN_MULT_LO_EXPR) |
1723 | scale = 0, ofs = BYTES_BIG_ENDIAN0 ? out_nelts : 0; |
1724 | else if (code == VEC_WIDEN_MULT_HI_EXPR) |
1725 | scale = 0, ofs = BYTES_BIG_ENDIAN0 ? 0 : out_nelts; |
1726 | else if (code == VEC_WIDEN_MULT_EVEN_EXPR) |
1727 | scale = 1, ofs = 0; |
1728 | else /* if (code == VEC_WIDEN_MULT_ODD_EXPR) */ |
1729 | scale = 1, ofs = 1; |
1730 | |
1731 | tree_vector_builder elts (type, out_nelts, 1); |
1732 | for (out = 0; out < out_nelts; out++) |
1733 | { |
1734 | unsigned int in = (out << scale) + ofs; |
1735 | tree t1 = fold_convert_const (NOP_EXPR, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1735, __FUNCTION__))->typed.type), |
1736 | VECTOR_CST_ELT (arg1, in)vector_cst_elt (arg1, in)); |
1737 | tree t2 = fold_convert_const (NOP_EXPR, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1737, __FUNCTION__))->typed.type), |
1738 | VECTOR_CST_ELT (arg2, in)vector_cst_elt (arg2, in)); |
1739 | |
1740 | if (t1 == NULL_TREE(tree) __null || t2 == NULL_TREE(tree) __null) |
1741 | return NULL_TREE(tree) __null; |
1742 | tree elt = const_binop (MULT_EXPR, t1, t2); |
1743 | if (elt == NULL_TREE(tree) __null || !CONSTANT_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (elt)->base.code))] == tcc_constant)) |
1744 | return NULL_TREE(tree) __null; |
1745 | elts.quick_push (elt); |
1746 | } |
1747 | |
1748 | return elts.build (); |
1749 | } |
1750 | |
1751 | default:; |
1752 | } |
1753 | |
1754 | if (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] != tcc_binary) |
1755 | return NULL_TREE(tree) __null; |
1756 | |
1757 | /* Make sure type and arg0 have the same saturating flag. */ |
1758 | gcc_checking_assert (TYPE_SATURATING (type)((void)(!(((tree_not_check4 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1758, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE ), (ARRAY_TYPE)))->base.u.bits.saturating_flag) == ((tree_not_check4 ((((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1759, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1759, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE ), (ARRAY_TYPE)))->base.u.bits.saturating_flag)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1759, __FUNCTION__), 0 : 0)) |
1759 | == TYPE_SATURATING (TREE_TYPE (arg1)))((void)(!(((tree_not_check4 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1758, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE ), (ARRAY_TYPE)))->base.u.bits.saturating_flag) == ((tree_not_check4 ((((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1759, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1759, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE ), (ARRAY_TYPE)))->base.u.bits.saturating_flag)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1759, __FUNCTION__), 0 : 0)); |
1760 | |
1761 | return const_binop (code, arg1, arg2); |
1762 | } |
1763 | |
1764 | /* Compute CODE ARG1 with resulting type TYPE with ARG1 being constant. |
1765 | Return zero if computing the constants is not possible. */ |
1766 | |
1767 | tree |
1768 | const_unop (enum tree_code code, tree type, tree arg0) |
1769 | { |
1770 | /* Don't perform the operation, other than NEGATE and ABS, if |
1771 | flag_signaling_nans is on and the operand is a signaling NaN. */ |
1772 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == REAL_CST |
1773 | && HONOR_SNANS (arg0) |
1774 | && REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg0))real_issignaling_nan (&((*(&(tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1774, __FUNCTION__, (REAL_CST)))->real_cst.value)))) |
1775 | && code != NEGATE_EXPR |
1776 | && code != ABS_EXPR |
1777 | && code != ABSU_EXPR) |
1778 | return NULL_TREE(tree) __null; |
1779 | |
1780 | switch (code) |
1781 | { |
1782 | CASE_CONVERTcase NOP_EXPR: case CONVERT_EXPR: |
1783 | case FLOAT_EXPR: |
1784 | case FIX_TRUNC_EXPR: |
1785 | case FIXED_CONVERT_EXPR: |
1786 | return fold_convert_const (code, type, arg0); |
1787 | |
1788 | case ADDR_SPACE_CONVERT_EXPR: |
1789 | /* If the source address is 0, and the source address space |
1790 | cannot have a valid object at 0, fold to dest type null. */ |
1791 | if (integer_zerop (arg0) |
1792 | && !(targetm.addr_space.zero_address_valid |
1793 | (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg0)))((tree_class_check ((((contains_struct_check ((((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1793, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1793, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1793, __FUNCTION__))->base.u.bits.address_space)))) |
1794 | return fold_convert_const (code, type, arg0); |
1795 | break; |
1796 | |
1797 | case VIEW_CONVERT_EXPR: |
1798 | return fold_view_convert_expr (type, arg0); |
1799 | |
1800 | case NEGATE_EXPR: |
1801 | { |
1802 | /* Can't call fold_negate_const directly here as that doesn't |
1803 | handle all cases and we might not be able to negate some |
1804 | constants. */ |
1805 | tree tem = fold_negate_expr (UNKNOWN_LOCATION((location_t) 0), arg0); |
1806 | if (tem && CONSTANT_CLASS_P (tem)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (tem)->base.code))] == tcc_constant)) |
1807 | return tem; |
1808 | break; |
1809 | } |
1810 | |
1811 | case ABS_EXPR: |
1812 | case ABSU_EXPR: |
1813 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == INTEGER_CST || TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == REAL_CST) |
1814 | return fold_abs_const (arg0, type); |
1815 | break; |
1816 | |
1817 | case CONJ_EXPR: |
1818 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == COMPLEX_CST) |
1819 | { |
1820 | tree ipart = fold_negate_const (TREE_IMAGPART (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1820, __FUNCTION__, (COMPLEX_CST)))->complex.imag), |
1821 | TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1821, __FUNCTION__))->typed.type)); |
1822 | return build_complex (type, TREE_REALPART (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1822, __FUNCTION__, (COMPLEX_CST)))->complex.real), ipart); |
1823 | } |
1824 | break; |
1825 | |
1826 | case BIT_NOT_EXPR: |
1827 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == INTEGER_CST) |
1828 | return fold_not_const (arg0, type); |
1829 | else if (POLY_INT_CST_P (arg0)(1 > 1 && ((enum tree_code) (arg0)->base.code) == POLY_INT_CST)) |
1830 | return wide_int_to_tree (type, -poly_int_cst_value (arg0)); |
1831 | /* Perform BIT_NOT_EXPR on each element individually. */ |
1832 | else if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == VECTOR_CST) |
1833 | { |
1834 | tree elem; |
1835 | |
1836 | /* This can cope with stepped encodings because ~x == -1 - x. */ |
1837 | tree_vector_builder elements; |
1838 | elements.new_unary_operation (type, arg0, true); |
1839 | unsigned int i, count = elements.encoded_nelts (); |
1840 | for (i = 0; i < count; ++i) |
1841 | { |
1842 | elem = VECTOR_CST_ELT (arg0, i)vector_cst_elt (arg0, i); |
1843 | elem = const_unop (BIT_NOT_EXPR, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1843, __FUNCTION__))->typed.type), elem); |
1844 | if (elem == NULL_TREE(tree) __null) |
1845 | break; |
1846 | elements.quick_push (elem); |
1847 | } |
1848 | if (i == count) |
1849 | return elements.build (); |
1850 | } |
1851 | break; |
1852 | |
1853 | case TRUTH_NOT_EXPR: |
1854 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == INTEGER_CST) |
1855 | return constant_boolean_node (integer_zerop (arg0), type); |
1856 | break; |
1857 | |
1858 | case REALPART_EXPR: |
1859 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == COMPLEX_CST) |
1860 | return fold_convert (type, TREE_REALPART (arg0))fold_convert_loc (((location_t) 0), type, ((tree_check ((arg0 ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1860, __FUNCTION__, (COMPLEX_CST)))->complex.real)); |
1861 | break; |
1862 | |
1863 | case IMAGPART_EXPR: |
1864 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == COMPLEX_CST) |
1865 | return fold_convert (type, TREE_IMAGPART (arg0))fold_convert_loc (((location_t) 0), type, ((tree_check ((arg0 ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1865, __FUNCTION__, (COMPLEX_CST)))->complex.imag)); |
1866 | break; |
1867 | |
1868 | case VEC_UNPACK_LO_EXPR: |
1869 | case VEC_UNPACK_HI_EXPR: |
1870 | case VEC_UNPACK_FLOAT_LO_EXPR: |
1871 | case VEC_UNPACK_FLOAT_HI_EXPR: |
1872 | case VEC_UNPACK_FIX_TRUNC_LO_EXPR: |
1873 | case VEC_UNPACK_FIX_TRUNC_HI_EXPR: |
1874 | { |
1875 | unsigned HOST_WIDE_INTlong out_nelts, in_nelts, i; |
1876 | enum tree_code subcode; |
1877 | |
1878 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) != VECTOR_CST) |
1879 | return NULL_TREE(tree) __null; |
1880 | |
1881 | if (!VECTOR_CST_NELTS (arg0)(TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1881, __FUNCTION__))->typed.type))).is_constant (&in_nelts)) |
1882 | return NULL_TREE(tree) __null; |
1883 | out_nelts = in_nelts / 2; |
1884 | gcc_assert (known_eq (out_nelts, TYPE_VECTOR_SUBPARTS (type)))((void)(!((!maybe_ne (out_nelts, TYPE_VECTOR_SUBPARTS (type)) )) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1884, __FUNCTION__), 0 : 0)); |
1885 | |
1886 | unsigned int offset = 0; |
1887 | if ((!BYTES_BIG_ENDIAN0) ^ (code == VEC_UNPACK_LO_EXPR |
1888 | || code == VEC_UNPACK_FLOAT_LO_EXPR |
1889 | || code == VEC_UNPACK_FIX_TRUNC_LO_EXPR)) |
1890 | offset = out_nelts; |
1891 | |
1892 | if (code == VEC_UNPACK_LO_EXPR || code == VEC_UNPACK_HI_EXPR) |
1893 | subcode = NOP_EXPR; |
1894 | else if (code == VEC_UNPACK_FLOAT_LO_EXPR |
1895 | || code == VEC_UNPACK_FLOAT_HI_EXPR) |
1896 | subcode = FLOAT_EXPR; |
1897 | else |
1898 | subcode = FIX_TRUNC_EXPR; |
1899 | |
1900 | tree_vector_builder elts (type, out_nelts, 1); |
1901 | for (i = 0; i < out_nelts; i++) |
1902 | { |
1903 | tree elt = fold_convert_const (subcode, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1903, __FUNCTION__))->typed.type), |
1904 | VECTOR_CST_ELT (arg0, i + offset)vector_cst_elt (arg0, i + offset)); |
1905 | if (elt == NULL_TREE(tree) __null || !CONSTANT_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (elt)->base.code))] == tcc_constant)) |
1906 | return NULL_TREE(tree) __null; |
1907 | elts.quick_push (elt); |
1908 | } |
1909 | |
1910 | return elts.build (); |
1911 | } |
1912 | |
1913 | case VEC_DUPLICATE_EXPR: |
1914 | if (CONSTANT_CLASS_P (arg0)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (arg0)->base.code))] == tcc_constant)) |
1915 | return build_vector_from_val (type, arg0); |
1916 | return NULL_TREE(tree) __null; |
1917 | |
1918 | default: |
1919 | break; |
1920 | } |
1921 | |
1922 | return NULL_TREE(tree) __null; |
1923 | } |
1924 | |
1925 | /* Create a sizetype INT_CST node with NUMBER sign extended. KIND |
1926 | indicates which particular sizetype to create. */ |
1927 | |
1928 | tree |
1929 | size_int_kind (poly_int64 number, enum size_type_kind kind) |
1930 | { |
1931 | return build_int_cst (sizetype_tab[(int) kind], number); |
1932 | } |
1933 | |
1934 | /* Combine operands OP1 and OP2 with arithmetic operation CODE. CODE |
1935 | is a tree code. The type of the result is taken from the operands. |
1936 | Both must be equivalent integer types, ala int_binop_types_match_p. |
1937 | If the operands are constant, so is the result. */ |
1938 | |
1939 | tree |
1940 | size_binop_loc (location_t loc, enum tree_code code, tree arg0, tree arg1) |
1941 | { |
1942 | tree type = TREE_TYPE (arg0)((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1942, __FUNCTION__))->typed.type); |
1943 | |
1944 | if (arg0 == error_mark_nodeglobal_trees[TI_ERROR_MARK] || arg1 == error_mark_nodeglobal_trees[TI_ERROR_MARK]) |
1945 | return error_mark_nodeglobal_trees[TI_ERROR_MARK]; |
1946 | |
1947 | gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),((void)(!(int_binop_types_match_p (code, ((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1947, __FUNCTION__))->typed.type), ((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1948, __FUNCTION__))->typed.type))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1948, __FUNCTION__), 0 : 0)) |
1948 | TREE_TYPE (arg1)))((void)(!(int_binop_types_match_p (code, ((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1947, __FUNCTION__))->typed.type), ((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1948, __FUNCTION__))->typed.type))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1948, __FUNCTION__), 0 : 0)); |
1949 | |
1950 | /* Handle the special case of two poly_int constants faster. */ |
1951 | if (poly_int_tree_p (arg0) && poly_int_tree_p (arg1)) |
1952 | { |
1953 | /* And some specific cases even faster than that. */ |
1954 | if (code == PLUS_EXPR) |
1955 | { |
1956 | if (integer_zerop (arg0) |
1957 | && !TREE_OVERFLOW (tree_strip_any_location_wrapper (arg0))((tree_class_check ((tree_strip_any_location_wrapper (arg0)), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1957, __FUNCTION__))->base.public_flag)) |
1958 | return arg1; |
1959 | if (integer_zerop (arg1) |
1960 | && !TREE_OVERFLOW (tree_strip_any_location_wrapper (arg1))((tree_class_check ((tree_strip_any_location_wrapper (arg1)), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1960, __FUNCTION__))->base.public_flag)) |
1961 | return arg0; |
1962 | } |
1963 | else if (code == MINUS_EXPR) |
1964 | { |
1965 | if (integer_zerop (arg1) |
1966 | && !TREE_OVERFLOW (tree_strip_any_location_wrapper (arg1))((tree_class_check ((tree_strip_any_location_wrapper (arg1)), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1966, __FUNCTION__))->base.public_flag)) |
1967 | return arg0; |
1968 | } |
1969 | else if (code == MULT_EXPR) |
1970 | { |
1971 | if (integer_onep (arg0) |
1972 | && !TREE_OVERFLOW (tree_strip_any_location_wrapper (arg0))((tree_class_check ((tree_strip_any_location_wrapper (arg0)), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1972, __FUNCTION__))->base.public_flag)) |
1973 | return arg1; |
1974 | } |
1975 | |
1976 | /* Handle general case of two integer constants. For sizetype |
1977 | constant calculations we always want to know about overflow, |
1978 | even in the unsigned case. */ |
1979 | tree res = int_const_binop (code, arg0, arg1, -1); |
1980 | if (res != NULL_TREE(tree) __null) |
1981 | return res; |
1982 | } |
1983 | |
1984 | return fold_build2_loc (loc, code, type, arg0, arg1); |
1985 | } |
1986 | |
1987 | /* Given two values, either both of sizetype or both of bitsizetype, |
1988 | compute the difference between the two values. Return the value |
1989 | in signed type corresponding to the type of the operands. */ |
1990 | |
1991 | tree |
1992 | size_diffop_loc (location_t loc, tree arg0, tree arg1) |
1993 | { |
1994 | tree type = TREE_TYPE (arg0)((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1994, __FUNCTION__))->typed.type); |
1995 | tree ctype; |
1996 | |
1997 | gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),((void)(!(int_binop_types_match_p (MINUS_EXPR, ((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1997, __FUNCTION__))->typed.type), ((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1998, __FUNCTION__))->typed.type))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1998, __FUNCTION__), 0 : 0)) |
1998 | TREE_TYPE (arg1)))((void)(!(int_binop_types_match_p (MINUS_EXPR, ((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1997, __FUNCTION__))->typed.type), ((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1998, __FUNCTION__))->typed.type))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 1998, __FUNCTION__), 0 : 0)); |
1999 | |
2000 | /* If the type is already signed, just do the simple thing. */ |
2001 | if (!TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2001, __FUNCTION__))->base.u.bits.unsigned_flag)) |
2002 | return size_binop_loc (loc, MINUS_EXPR, arg0, arg1); |
2003 | |
2004 | if (type == sizetypesizetype_tab[(int) stk_sizetype]) |
2005 | ctype = ssizetypesizetype_tab[(int) stk_ssizetype]; |
2006 | else if (type == bitsizetypesizetype_tab[(int) stk_bitsizetype]) |
2007 | ctype = sbitsizetypesizetype_tab[(int) stk_sbitsizetype]; |
2008 | else |
2009 | ctype = signed_type_for (type); |
2010 | |
2011 | /* If either operand is not a constant, do the conversions to the signed |
2012 | type and subtract. The hardware will do the right thing with any |
2013 | overflow in the subtraction. */ |
2014 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) != INTEGER_CST || TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) != INTEGER_CST) |
2015 | return size_binop_loc (loc, MINUS_EXPR, |
2016 | fold_convert_loc (loc, ctype, arg0), |
2017 | fold_convert_loc (loc, ctype, arg1)); |
2018 | |
2019 | /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE. |
2020 | Otherwise, subtract the other way, convert to CTYPE (we know that can't |
2021 | overflow) and negate (which can't either). Special-case a result |
2022 | of zero while we're here. */ |
2023 | if (tree_int_cst_equal (arg0, arg1)) |
2024 | return build_int_cst (ctype, 0); |
2025 | else if (tree_int_cst_lt (arg1, arg0)) |
2026 | return fold_convert_loc (loc, ctype, |
2027 | size_binop_loc (loc, MINUS_EXPR, arg0, arg1)); |
2028 | else |
2029 | return size_binop_loc (loc, MINUS_EXPR, build_int_cst (ctype, 0), |
2030 | fold_convert_loc (loc, ctype, |
2031 | size_binop_loc (loc, |
2032 | MINUS_EXPR, |
2033 | arg1, arg0))); |
2034 | } |
2035 | |
2036 | /* A subroutine of fold_convert_const handling conversions of an |
2037 | INTEGER_CST to another integer type. */ |
2038 | |
2039 | static tree |
2040 | fold_convert_const_int_from_int (tree type, const_tree arg1) |
2041 | { |
2042 | /* Given an integer constant, make new constant with new type, |
2043 | appropriately sign-extended or truncated. Use widest_int |
2044 | so that any extension is done according ARG1's type. */ |
2045 | return force_fit_type (type, wi::to_widest (arg1), |
2046 | !POINTER_TYPE_P (TREE_TYPE (arg1))(((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2046, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2046, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ), |
2047 | TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2047, __FUNCTION__))->base.public_flag)); |
2048 | } |
2049 | |
2050 | /* A subroutine of fold_convert_const handling conversions a REAL_CST |
2051 | to an integer type. */ |
2052 | |
2053 | static tree |
2054 | fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1) |
2055 | { |
2056 | bool overflow = false; |
2057 | tree t; |
2058 | |
2059 | /* The following code implements the floating point to integer |
2060 | conversion rules required by the Java Language Specification, |
2061 | that IEEE NaNs are mapped to zero and values that overflow |
2062 | the target precision saturate, i.e. values greater than |
2063 | INT_MAX are mapped to INT_MAX, and values less than INT_MIN |
2064 | are mapped to INT_MIN. These semantics are allowed by the |
2065 | C and C++ standards that simply state that the behavior of |
2066 | FP-to-integer conversion is unspecified upon overflow. */ |
2067 | |
2068 | wide_int val; |
2069 | REAL_VALUE_TYPEstruct real_value r; |
2070 | REAL_VALUE_TYPEstruct real_value x = TREE_REAL_CST (arg1)(*(&(tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2070, __FUNCTION__, (REAL_CST)))->real_cst.value)); |
2071 | |
2072 | switch (code) |
2073 | { |
2074 | case FIX_TRUNC_EXPR: |
2075 | real_trunc (&r, VOIDmode((void) 0, E_VOIDmode), &x); |
2076 | break; |
2077 | |
2078 | default: |
2079 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2079, __FUNCTION__)); |
2080 | } |
2081 | |
2082 | /* If R is NaN, return zero and show we have an overflow. */ |
2083 | if (REAL_VALUE_ISNAN (r)real_isnan (&(r))) |
2084 | { |
2085 | overflow = true; |
2086 | val = wi::zero (TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2086, __FUNCTION__))->type_common.precision)); |
2087 | } |
2088 | |
2089 | /* See if R is less than the lower bound or greater than the |
2090 | upper bound. */ |
2091 | |
2092 | if (! overflow) |
2093 | { |
2094 | tree lt = TYPE_MIN_VALUE (type)((tree_check5 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2094, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE ), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.minval ); |
2095 | REAL_VALUE_TYPEstruct real_value l = real_value_from_int_cst (NULL_TREE(tree) __null, lt); |
2096 | if (real_less (&r, &l)) |
2097 | { |
2098 | overflow = true; |
2099 | val = wi::to_wide (lt); |
2100 | } |
2101 | } |
2102 | |
2103 | if (! overflow) |
2104 | { |
2105 | tree ut = TYPE_MAX_VALUE (type)((tree_check5 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2105, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE ), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.maxval ); |
2106 | if (ut) |
2107 | { |
2108 | REAL_VALUE_TYPEstruct real_value u = real_value_from_int_cst (NULL_TREE(tree) __null, ut); |
2109 | if (real_less (&u, &r)) |
2110 | { |
2111 | overflow = true; |
2112 | val = wi::to_wide (ut); |
2113 | } |
2114 | } |
2115 | } |
2116 | |
2117 | if (! overflow) |
2118 | val = real_to_integer (&r, &overflow, TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2118, __FUNCTION__))->type_common.precision)); |
2119 | |
2120 | t = force_fit_type (type, val, -1, overflow | TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2120, __FUNCTION__))->base.public_flag)); |
2121 | return t; |
2122 | } |
2123 | |
2124 | /* A subroutine of fold_convert_const handling conversions of a |
2125 | FIXED_CST to an integer type. */ |
2126 | |
2127 | static tree |
2128 | fold_convert_const_int_from_fixed (tree type, const_tree arg1) |
2129 | { |
2130 | tree t; |
2131 | double_int temp, temp_trunc; |
2132 | scalar_mode mode; |
2133 | |
2134 | /* Right shift FIXED_CST to temp by fbit. */ |
2135 | temp = TREE_FIXED_CST (arg1)(*((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2135, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr )).data; |
2136 | mode = TREE_FIXED_CST (arg1)(*((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2136, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr )).mode; |
2137 | if (GET_MODE_FBIT (mode)mode_fbit[mode] < HOST_BITS_PER_DOUBLE_INT(2 * 64)) |
2138 | { |
2139 | temp = temp.rshift (GET_MODE_FBIT (mode)mode_fbit[mode], |
2140 | HOST_BITS_PER_DOUBLE_INT(2 * 64), |
2141 | SIGNED_FIXED_POINT_MODE_P (mode)((((enum mode_class) mode_class[mode]) == MODE_FRACT || ((enum mode_class) mode_class[mode]) == MODE_VECTOR_FRACT) || (((enum mode_class) mode_class[mode]) == MODE_ACCUM || ((enum mode_class ) mode_class[mode]) == MODE_VECTOR_ACCUM))); |
2142 | |
2143 | /* Left shift temp to temp_trunc by fbit. */ |
2144 | temp_trunc = temp.lshift (GET_MODE_FBIT (mode)mode_fbit[mode], |
2145 | HOST_BITS_PER_DOUBLE_INT(2 * 64), |
2146 | SIGNED_FIXED_POINT_MODE_P (mode)((((enum mode_class) mode_class[mode]) == MODE_FRACT || ((enum mode_class) mode_class[mode]) == MODE_VECTOR_FRACT) || (((enum mode_class) mode_class[mode]) == MODE_ACCUM || ((enum mode_class ) mode_class[mode]) == MODE_VECTOR_ACCUM))); |
2147 | } |
2148 | else |
2149 | { |
2150 | temp = double_int_zero(double_int::from_shwi (0)); |
2151 | temp_trunc = double_int_zero(double_int::from_shwi (0)); |
2152 | } |
2153 | |
2154 | /* If FIXED_CST is negative, we need to round the value toward 0. |
2155 | By checking if the fractional bits are not zero to add 1 to temp. */ |
2156 | if (SIGNED_FIXED_POINT_MODE_P (mode)((((enum mode_class) mode_class[mode]) == MODE_FRACT || ((enum mode_class) mode_class[mode]) == MODE_VECTOR_FRACT) || (((enum mode_class) mode_class[mode]) == MODE_ACCUM || ((enum mode_class ) mode_class[mode]) == MODE_VECTOR_ACCUM)) |
2157 | && temp_trunc.is_negative () |
2158 | && TREE_FIXED_CST (arg1)(*((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2158, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr )).data != temp_trunc) |
2159 | temp += double_int_one(double_int::from_shwi (1)); |
2160 | |
2161 | /* Given a fixed-point constant, make new constant with new type, |
2162 | appropriately sign-extended or truncated. */ |
2163 | t = force_fit_type (type, temp, -1, |
2164 | (temp.is_negative () |
2165 | && (TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2165, __FUNCTION__))->base.u.bits.unsigned_flag) |
2166 | < TYPE_UNSIGNED (TREE_TYPE (arg1))((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2166, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2166, __FUNCTION__))->base.u.bits.unsigned_flag))) |
2167 | | TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2167, __FUNCTION__))->base.public_flag)); |
2168 | |
2169 | return t; |
2170 | } |
2171 | |
2172 | /* A subroutine of fold_convert_const handling conversions a REAL_CST |
2173 | to another floating point type. */ |
2174 | |
2175 | static tree |
2176 | fold_convert_const_real_from_real (tree type, const_tree arg1) |
2177 | { |
2178 | REAL_VALUE_TYPEstruct real_value value; |
2179 | tree t; |
2180 | |
2181 | /* If the underlying modes are the same, simply treat it as |
2182 | copy and rebuild with TREE_REAL_CST information and the |
2183 | given type. */ |
2184 | if (TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2184, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode) == TYPE_MODE (TREE_TYPE (arg1))((((enum tree_code) ((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2184, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2184, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2184, __FUNCTION__))->typed.type)) : (((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2184, __FUNCTION__))->typed.type))->type_common.mode)) |
2185 | { |
2186 | t = build_real (type, TREE_REAL_CST (arg1)(*(&(tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2186, __FUNCTION__, (REAL_CST)))->real_cst.value))); |
2187 | return t; |
2188 | } |
2189 | |
2190 | /* Don't perform the operation if flag_signaling_nans is on |
2191 | and the operand is a signaling NaN. */ |
2192 | if (HONOR_SNANS (arg1) |
2193 | && REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg1))real_issignaling_nan (&((*(&(tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2193, __FUNCTION__, (REAL_CST)))->real_cst.value))))) |
2194 | return NULL_TREE(tree) __null; |
2195 | |
2196 | /* With flag_rounding_math we should respect the current rounding mode |
2197 | unless the conversion is exact. */ |
2198 | if (HONOR_SIGN_DEPENDENT_ROUNDING (arg1) |
2199 | && !exact_real_truncate (TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2199, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode), &TREE_REAL_CST (arg1)(*(&(tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2199, __FUNCTION__, (REAL_CST)))->real_cst.value)))) |
2200 | return NULL_TREE(tree) __null; |
2201 | |
2202 | real_convert (&value, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2202, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode), &TREE_REAL_CST (arg1)(*(&(tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2202, __FUNCTION__, (REAL_CST)))->real_cst.value))); |
2203 | t = build_real (type, value); |
2204 | |
2205 | /* If converting an infinity or NAN to a representation that doesn't |
2206 | have one, set the overflow bit so that we can produce some kind of |
2207 | error message at the appropriate point if necessary. It's not the |
2208 | most user-friendly message, but it's better than nothing. */ |
2209 | if (REAL_VALUE_ISINF (TREE_REAL_CST (arg1))real_isinf (&((*(&(tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2209, __FUNCTION__, (REAL_CST)))->real_cst.value)))) |
2210 | && !MODE_HAS_INFINITIES (TYPE_MODE (type))((((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2210, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_FLOAT || ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2210, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_DECIMAL_FLOAT || ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2210, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_COMPLEX_FLOAT || ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2210, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_VECTOR_FLOAT ) && ((real_format_for_mode[(((enum mode_class) mode_class [as_a <scalar_float_mode> ((mode_to_inner (((((enum tree_code ) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2210, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))]) == MODE_DECIMAL_FLOAT ) ? (((as_a <scalar_float_mode> ((mode_to_inner (((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2210, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))) - MIN_MODE_DECIMAL_FLOAT ) + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) : ((enum mode_class ) mode_class[as_a <scalar_float_mode> ((mode_to_inner ( ((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2210, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))]) == MODE_FLOAT ? ( (as_a <scalar_float_mode> ((mode_to_inner (((((enum tree_code ) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2210, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))) - MIN_MODE_FLOAT) : ((fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2210, __FUNCTION__)), 0)]))->has_inf)) |
2211 | TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2211, __FUNCTION__))->base.public_flag) = 1; |
2212 | else if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))real_isnan (&((*(&(tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2212, __FUNCTION__, (REAL_CST)))->real_cst.value)))) |
2213 | && !MODE_HAS_NANS (TYPE_MODE (type))((((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2213, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_FLOAT || ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2213, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_DECIMAL_FLOAT || ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2213, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_COMPLEX_FLOAT || ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2213, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_VECTOR_FLOAT ) && ((real_format_for_mode[(((enum mode_class) mode_class [as_a <scalar_float_mode> ((mode_to_inner (((((enum tree_code ) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2213, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))]) == MODE_DECIMAL_FLOAT ) ? (((as_a <scalar_float_mode> ((mode_to_inner (((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2213, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))) - MIN_MODE_DECIMAL_FLOAT ) + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) : ((enum mode_class ) mode_class[as_a <scalar_float_mode> ((mode_to_inner ( ((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2213, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))]) == MODE_FLOAT ? ( (as_a <scalar_float_mode> ((mode_to_inner (((((enum tree_code ) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2213, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))) - MIN_MODE_FLOAT) : ((fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2213, __FUNCTION__)), 0)]))->has_nans)) |
2214 | TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2214, __FUNCTION__))->base.public_flag) = 1; |
2215 | /* Regular overflow, conversion produced an infinity in a mode that |
2216 | can't represent them. */ |
2217 | else if (!MODE_HAS_INFINITIES (TYPE_MODE (type))((((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2217, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_FLOAT || ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2217, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_DECIMAL_FLOAT || ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2217, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_COMPLEX_FLOAT || ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2217, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)]) == MODE_VECTOR_FLOAT ) && ((real_format_for_mode[(((enum mode_class) mode_class [as_a <scalar_float_mode> ((mode_to_inner (((((enum tree_code ) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2217, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))]) == MODE_DECIMAL_FLOAT ) ? (((as_a <scalar_float_mode> ((mode_to_inner (((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2217, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))) - MIN_MODE_DECIMAL_FLOAT ) + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) : ((enum mode_class ) mode_class[as_a <scalar_float_mode> ((mode_to_inner ( ((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2217, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))]) == MODE_FLOAT ? ( (as_a <scalar_float_mode> ((mode_to_inner (((((enum tree_code ) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2217, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode))))) - MIN_MODE_FLOAT) : ((fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2217, __FUNCTION__)), 0)]))->has_inf) |
2218 | && REAL_VALUE_ISINF (value)real_isinf (&(value)) |
2219 | && !REAL_VALUE_ISINF (TREE_REAL_CST (arg1))real_isinf (&((*(&(tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2219, __FUNCTION__, (REAL_CST)))->real_cst.value))))) |
2220 | TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2220, __FUNCTION__))->base.public_flag) = 1; |
2221 | else |
2222 | TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2222, __FUNCTION__))->base.public_flag) = TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2222, __FUNCTION__))->base.public_flag); |
2223 | return t; |
2224 | } |
2225 | |
2226 | /* A subroutine of fold_convert_const handling conversions a FIXED_CST |
2227 | to a floating point type. */ |
2228 | |
2229 | static tree |
2230 | fold_convert_const_real_from_fixed (tree type, const_tree arg1) |
2231 | { |
2232 | REAL_VALUE_TYPEstruct real_value value; |
2233 | tree t; |
2234 | |
2235 | real_convert_from_fixed (&value, SCALAR_FLOAT_TYPE_MODE (type)(as_a <scalar_float_mode> ((tree_class_check ((type), ( tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2235, __FUNCTION__))->type_common.mode)), |
2236 | &TREE_FIXED_CST (arg1)(*((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2236, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr ))); |
2237 | t = build_real (type, value); |
2238 | |
2239 | TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2239, __FUNCTION__))->base.public_flag) = TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2239, __FUNCTION__))->base.public_flag); |
2240 | return t; |
2241 | } |
2242 | |
2243 | /* A subroutine of fold_convert_const handling conversions a FIXED_CST |
2244 | to another fixed-point type. */ |
2245 | |
2246 | static tree |
2247 | fold_convert_const_fixed_from_fixed (tree type, const_tree arg1) |
2248 | { |
2249 | FIXED_VALUE_TYPEstruct fixed_value value; |
2250 | tree t; |
2251 | bool overflow_p; |
2252 | |
2253 | overflow_p = fixed_convert (&value, SCALAR_TYPE_MODE (type)(as_a <scalar_mode> ((tree_class_check ((type), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2253, __FUNCTION__))->type_common.mode)), |
2254 | &TREE_FIXED_CST (arg1)(*((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2254, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr )), TYPE_SATURATING (type)((tree_not_check4 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2254, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE ), (ARRAY_TYPE)))->base.u.bits.saturating_flag)); |
2255 | t = build_fixed (type, value); |
2256 | |
2257 | /* Propagate overflow flags. */ |
2258 | if (overflow_p | TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2258, __FUNCTION__))->base.public_flag)) |
2259 | TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2259, __FUNCTION__))->base.public_flag) = 1; |
2260 | return t; |
2261 | } |
2262 | |
2263 | /* A subroutine of fold_convert_const handling conversions an INTEGER_CST |
2264 | to a fixed-point type. */ |
2265 | |
2266 | static tree |
2267 | fold_convert_const_fixed_from_int (tree type, const_tree arg1) |
2268 | { |
2269 | FIXED_VALUE_TYPEstruct fixed_value value; |
2270 | tree t; |
2271 | bool overflow_p; |
2272 | double_int di; |
2273 | |
2274 | gcc_assert (TREE_INT_CST_NUNITS (arg1) <= 2)((void)(!(((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2274, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended ) <= 2) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2274, __FUNCTION__), 0 : 0)); |
2275 | |
2276 | di.low = TREE_INT_CST_ELT (arg1, 0)(*tree_int_cst_elt_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2276, __FUNCTION__)); |
2277 | if (TREE_INT_CST_NUNITS (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2277, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended ) == 1) |
2278 | di.high = (HOST_WIDE_INTlong) di.low < 0 ? HOST_WIDE_INT_M1-1L : 0; |
2279 | else |
2280 | di.high = TREE_INT_CST_ELT (arg1, 1)(*tree_int_cst_elt_check ((arg1), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2280, __FUNCTION__)); |
2281 | |
2282 | overflow_p = fixed_convert_from_int (&value, SCALAR_TYPE_MODE (type)(as_a <scalar_mode> ((tree_class_check ((type), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2282, __FUNCTION__))->type_common.mode)), di, |
2283 | TYPE_UNSIGNED (TREE_TYPE (arg1))((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2283, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2283, __FUNCTION__))->base.u.bits.unsigned_flag), |
2284 | TYPE_SATURATING (type)((tree_not_check4 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2284, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE ), (ARRAY_TYPE)))->base.u.bits.saturating_flag)); |
2285 | t = build_fixed (type, value); |
2286 | |
2287 | /* Propagate overflow flags. */ |
2288 | if (overflow_p | TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2288, __FUNCTION__))->base.public_flag)) |
2289 | TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2289, __FUNCTION__))->base.public_flag) = 1; |
2290 | return t; |
2291 | } |
2292 | |
2293 | /* A subroutine of fold_convert_const handling conversions a REAL_CST |
2294 | to a fixed-point type. */ |
2295 | |
2296 | static tree |
2297 | fold_convert_const_fixed_from_real (tree type, const_tree arg1) |
2298 | { |
2299 | FIXED_VALUE_TYPEstruct fixed_value value; |
2300 | tree t; |
2301 | bool overflow_p; |
2302 | |
2303 | overflow_p = fixed_convert_from_real (&value, SCALAR_TYPE_MODE (type)(as_a <scalar_mode> ((tree_class_check ((type), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2303, __FUNCTION__))->type_common.mode)), |
2304 | &TREE_REAL_CST (arg1)(*(&(tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2304, __FUNCTION__, (REAL_CST)))->real_cst.value)), |
2305 | TYPE_SATURATING (type)((tree_not_check4 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2305, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE ), (ARRAY_TYPE)))->base.u.bits.saturating_flag)); |
2306 | t = build_fixed (type, value); |
2307 | |
2308 | /* Propagate overflow flags. */ |
2309 | if (overflow_p | TREE_OVERFLOW (arg1)((tree_class_check ((arg1), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2309, __FUNCTION__))->base.public_flag)) |
2310 | TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2310, __FUNCTION__))->base.public_flag) = 1; |
2311 | return t; |
2312 | } |
2313 | |
2314 | /* Attempt to fold type conversion operation CODE of expression ARG1 to |
2315 | type TYPE. If no simplification can be done return NULL_TREE. */ |
2316 | |
2317 | static tree |
2318 | fold_convert_const (enum tree_code code, tree type, tree arg1) |
2319 | { |
2320 | tree arg_type = TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2320, __FUNCTION__))->typed.type); |
2321 | if (arg_type == type) |
2322 | return arg1; |
2323 | |
2324 | /* We can't widen types, since the runtime value could overflow the |
2325 | original type before being extended to the new type. */ |
2326 | if (POLY_INT_CST_P (arg1)(1 > 1 && ((enum tree_code) (arg1)->base.code) == POLY_INT_CST) |
2327 | && (POINTER_TYPE_P (type)(((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE) || INTEGRAL_TYPE_P (type)(((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ( (enum tree_code) (type)->base.code) == BOOLEAN_TYPE || ((enum tree_code) (type)->base.code) == INTEGER_TYPE)) |
2328 | && TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2328, __FUNCTION__))->type_common.precision) <= TYPE_PRECISION (arg_type)((tree_class_check ((arg_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2328, __FUNCTION__))->type_common.precision)) |
2329 | return build_poly_int_cst (type, |
2330 | poly_wide_int::from (poly_int_cst_value (arg1), |
2331 | TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2331, __FUNCTION__))->type_common.precision), |
2332 | TYPE_SIGN (arg_type)((signop) ((tree_class_check ((arg_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2332, __FUNCTION__))->base.u.bits.unsigned_flag)))); |
2333 | |
2334 | if (POINTER_TYPE_P (type)(((enum tree_code) (type)->base.code) == POINTER_TYPE || ( (enum tree_code) (type)->base.code) == REFERENCE_TYPE) || INTEGRAL_TYPE_P (type)(((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ( (enum tree_code) (type)->base.code) == BOOLEAN_TYPE || ((enum tree_code) (type)->base.code) == INTEGER_TYPE) |
2335 | || TREE_CODE (type)((enum tree_code) (type)->base.code) == OFFSET_TYPE) |
2336 | { |
2337 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == INTEGER_CST) |
2338 | return fold_convert_const_int_from_int (type, arg1); |
2339 | else if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == REAL_CST) |
2340 | return fold_convert_const_int_from_real (code, type, arg1); |
2341 | else if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == FIXED_CST) |
2342 | return fold_convert_const_int_from_fixed (type, arg1); |
2343 | } |
2344 | else if (TREE_CODE (type)((enum tree_code) (type)->base.code) == REAL_TYPE) |
2345 | { |
2346 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == INTEGER_CST) |
2347 | { |
2348 | tree res = build_real_from_int_cst (type, arg1); |
2349 | /* Avoid the folding if flag_rounding_math is on and the |
2350 | conversion is not exact. */ |
2351 | if (HONOR_SIGN_DEPENDENT_ROUNDING (type)) |
2352 | { |
2353 | bool fail = false; |
2354 | wide_int w = real_to_integer (&TREE_REAL_CST (res)(*(&(tree_check ((res), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2354, __FUNCTION__, (REAL_CST)))->real_cst.value)), &fail, |
2355 | TYPE_PRECISION (TREE_TYPE (arg1))((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2355, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2355, __FUNCTION__))->type_common.precision)); |
2356 | if (fail || wi::ne_p (w, wi::to_wide (arg1))) |
2357 | return NULL_TREE(tree) __null; |
2358 | } |
2359 | return res; |
2360 | } |
2361 | else if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == REAL_CST) |
2362 | return fold_convert_const_real_from_real (type, arg1); |
2363 | else if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == FIXED_CST) |
2364 | return fold_convert_const_real_from_fixed (type, arg1); |
2365 | } |
2366 | else if (TREE_CODE (type)((enum tree_code) (type)->base.code) == FIXED_POINT_TYPE) |
2367 | { |
2368 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == FIXED_CST) |
2369 | return fold_convert_const_fixed_from_fixed (type, arg1); |
2370 | else if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == INTEGER_CST) |
2371 | return fold_convert_const_fixed_from_int (type, arg1); |
2372 | else if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == REAL_CST) |
2373 | return fold_convert_const_fixed_from_real (type, arg1); |
2374 | } |
2375 | else if (TREE_CODE (type)((enum tree_code) (type)->base.code) == VECTOR_TYPE) |
2376 | { |
2377 | if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == VECTOR_CST |
2378 | && known_eq (TYPE_VECTOR_SUBPARTS (type), VECTOR_CST_NELTS (arg1))(!maybe_ne (TYPE_VECTOR_SUBPARTS (type), (TYPE_VECTOR_SUBPARTS (((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2378, __FUNCTION__))->typed.type)))))) |
2379 | { |
2380 | tree elttype = TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2380, __FUNCTION__))->typed.type); |
2381 | tree arg1_elttype = TREE_TYPE (TREE_TYPE (arg1))((contains_struct_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2381, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2381, __FUNCTION__))->typed.type); |
2382 | /* We can't handle steps directly when extending, since the |
2383 | values need to wrap at the original precision first. */ |
2384 | bool step_ok_p |
2385 | = (INTEGRAL_TYPE_P (elttype)(((enum tree_code) (elttype)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (elttype)->base.code) == BOOLEAN_TYPE || ((enum tree_code) (elttype)->base.code) == INTEGER_TYPE) |
2386 | && INTEGRAL_TYPE_P (arg1_elttype)(((enum tree_code) (arg1_elttype)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (arg1_elttype)->base.code) == BOOLEAN_TYPE || ((enum tree_code) (arg1_elttype)->base.code) == INTEGER_TYPE ) |
2387 | && TYPE_PRECISION (elttype)((tree_class_check ((elttype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2387, __FUNCTION__))->type_common.precision) <= TYPE_PRECISION (arg1_elttype)((tree_class_check ((arg1_elttype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2387, __FUNCTION__))->type_common.precision)); |
2388 | tree_vector_builder v; |
2389 | if (!v.new_unary_operation (type, arg1, step_ok_p)) |
2390 | return NULL_TREE(tree) __null; |
2391 | unsigned int len = v.encoded_nelts (); |
2392 | for (unsigned int i = 0; i < len; ++i) |
2393 | { |
2394 | tree elt = VECTOR_CST_ELT (arg1, i)vector_cst_elt (arg1, i); |
2395 | tree cvt = fold_convert_const (code, elttype, elt); |
2396 | if (cvt == NULL_TREE(tree) __null) |
2397 | return NULL_TREE(tree) __null; |
2398 | v.quick_push (cvt); |
2399 | } |
2400 | return v.build (); |
2401 | } |
2402 | } |
2403 | return NULL_TREE(tree) __null; |
2404 | } |
2405 | |
2406 | /* Construct a vector of zero elements of vector type TYPE. */ |
2407 | |
2408 | static tree |
2409 | build_zero_vector (tree type) |
2410 | { |
2411 | tree t; |
2412 | |
2413 | t = fold_convert_const (NOP_EXPR, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2413, __FUNCTION__))->typed.type), integer_zero_nodeglobal_trees[TI_INTEGER_ZERO]); |
2414 | return build_vector_from_val (type, t); |
2415 | } |
2416 | |
2417 | /* Returns true, if ARG is convertible to TYPE using a NOP_EXPR. */ |
2418 | |
2419 | bool |
2420 | fold_convertible_p (const_tree type, const_tree arg) |
2421 | { |
2422 | const_tree orig = TREE_TYPE (arg)((contains_struct_check ((arg), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2422, __FUNCTION__))->typed.type); |
2423 | |
2424 | if (type == orig) |
2425 | return true; |
2426 | |
2427 | if (TREE_CODE (arg)((enum tree_code) (arg)->base.code) == ERROR_MARK |
2428 | || TREE_CODE (type)((enum tree_code) (type)->base.code) == ERROR_MARK |
2429 | || TREE_CODE (orig)((enum tree_code) (orig)->base.code) == ERROR_MARK) |
2430 | return false; |
2431 | |
2432 | if (TYPE_MAIN_VARIANT (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2432, __FUNCTION__))->type_common.main_variant) == TYPE_MAIN_VARIANT (orig)((tree_class_check ((orig), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2432, __FUNCTION__))->type_common.main_variant)) |
2433 | return true; |
2434 | |
2435 | switch (TREE_CODE (type)((enum tree_code) (type)->base.code)) |
2436 | { |
2437 | case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: |
2438 | case POINTER_TYPE: case REFERENCE_TYPE: |
2439 | case OFFSET_TYPE: |
2440 | return (INTEGRAL_TYPE_P (orig)(((enum tree_code) (orig)->base.code) == ENUMERAL_TYPE || ( (enum tree_code) (orig)->base.code) == BOOLEAN_TYPE || ((enum tree_code) (orig)->base.code) == INTEGER_TYPE) |
2441 | || (POINTER_TYPE_P (orig)(((enum tree_code) (orig)->base.code) == POINTER_TYPE || ( (enum tree_code) (orig)->base.code) == REFERENCE_TYPE) |
2442 | && TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2442, __FUNCTION__))->type_common.precision) <= TYPE_PRECISION (orig)((tree_class_check ((orig), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2442, __FUNCTION__))->type_common.precision)) |
2443 | || TREE_CODE (orig)((enum tree_code) (orig)->base.code) == OFFSET_TYPE); |
2444 | |
2445 | case REAL_TYPE: |
2446 | case FIXED_POINT_TYPE: |
2447 | case VOID_TYPE: |
2448 | return TREE_CODE (type)((enum tree_code) (type)->base.code) == TREE_CODE (orig)((enum tree_code) (orig)->base.code); |
2449 | |
2450 | case VECTOR_TYPE: |
2451 | return (VECTOR_TYPE_P (orig)(((enum tree_code) (orig)->base.code) == VECTOR_TYPE) |
2452 | && known_eq (TYPE_VECTOR_SUBPARTS (type),(!maybe_ne (TYPE_VECTOR_SUBPARTS (type), TYPE_VECTOR_SUBPARTS (orig))) |
2453 | TYPE_VECTOR_SUBPARTS (orig))(!maybe_ne (TYPE_VECTOR_SUBPARTS (type), TYPE_VECTOR_SUBPARTS (orig))) |
2454 | && tree_int_cst_equal (TYPE_SIZE (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2454, __FUNCTION__))->type_common.size), TYPE_SIZE (orig)((tree_class_check ((orig), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2454, __FUNCTION__))->type_common.size))); |
2455 | |
2456 | default: |
2457 | return false; |
2458 | } |
2459 | } |
2460 | |
2461 | /* Convert expression ARG to type TYPE. Used by the middle-end for |
2462 | simple conversions in preference to calling the front-end's convert. */ |
2463 | |
2464 | tree |
2465 | fold_convert_loc (location_t loc, tree type, tree arg) |
2466 | { |
2467 | tree orig = TREE_TYPE (arg)((contains_struct_check ((arg), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2467, __FUNCTION__))->typed.type); |
2468 | tree tem; |
2469 | |
2470 | if (type == orig) |
2471 | return arg; |
2472 | |
2473 | if (TREE_CODE (arg)((enum tree_code) (arg)->base.code) == ERROR_MARK |
2474 | || TREE_CODE (type)((enum tree_code) (type)->base.code) == ERROR_MARK |
2475 | || TREE_CODE (orig)((enum tree_code) (orig)->base.code) == ERROR_MARK) |
2476 | return error_mark_nodeglobal_trees[TI_ERROR_MARK]; |
2477 | |
2478 | switch (TREE_CODE (type)((enum tree_code) (type)->base.code)) |
2479 | { |
2480 | case POINTER_TYPE: |
2481 | case REFERENCE_TYPE: |
2482 | /* Handle conversions between pointers to different address spaces. */ |
2483 | if (POINTER_TYPE_P (orig)(((enum tree_code) (orig)->base.code) == POINTER_TYPE || ( (enum tree_code) (orig)->base.code) == REFERENCE_TYPE) |
2484 | && (TYPE_ADDR_SPACE (TREE_TYPE (type))((tree_class_check ((((contains_struct_check ((type), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2484, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2484, __FUNCTION__))->base.u.bits.address_space) |
2485 | != TYPE_ADDR_SPACE (TREE_TYPE (orig))((tree_class_check ((((contains_struct_check ((orig), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2485, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2485, __FUNCTION__))->base.u.bits.address_space))) |
2486 | return fold_build1_loc (loc, ADDR_SPACE_CONVERT_EXPR, type, arg); |
2487 | /* fall through */ |
2488 | |
2489 | case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: |
2490 | case OFFSET_TYPE: |
2491 | if (TREE_CODE (arg)((enum tree_code) (arg)->base.code) == INTEGER_CST) |
2492 | { |
2493 | tem = fold_convert_const (NOP_EXPR, type, arg); |
2494 | if (tem != NULL_TREE(tree) __null) |
2495 | return tem; |
2496 | } |
2497 | if (INTEGRAL_TYPE_P (orig)(((enum tree_code) (orig)->base.code) == ENUMERAL_TYPE || ( (enum tree_code) (orig)->base.code) == BOOLEAN_TYPE || ((enum tree_code) (orig)->base.code) == INTEGER_TYPE) || POINTER_TYPE_P (orig)(((enum tree_code) (orig)->base.code) == POINTER_TYPE || ( (enum tree_code) (orig)->base.code) == REFERENCE_TYPE) |
2498 | || TREE_CODE (orig)((enum tree_code) (orig)->base.code) == OFFSET_TYPE) |
2499 | return fold_build1_loc (loc, NOP_EXPR, type, arg); |
2500 | if (TREE_CODE (orig)((enum tree_code) (orig)->base.code) == COMPLEX_TYPE) |
2501 | return fold_convert_loc (loc, type, |
2502 | fold_build1_loc (loc, REALPART_EXPR, |
2503 | TREE_TYPE (orig)((contains_struct_check ((orig), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2503, __FUNCTION__))->typed.type), arg)); |
2504 | gcc_assert (TREE_CODE (orig) == VECTOR_TYPE((void)(!(((enum tree_code) (orig)->base.code) == VECTOR_TYPE && tree_int_cst_equal (((tree_class_check ((type), ( tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2505, __FUNCTION__))->type_common.size), ((tree_class_check ((orig), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2505, __FUNCTION__))->type_common.size))) ? fancy_abort ( "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2505, __FUNCTION__), 0 : 0)) |
2505 | && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)))((void)(!(((enum tree_code) (orig)->base.code) == VECTOR_TYPE && tree_int_cst_equal (((tree_class_check ((type), ( tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2505, __FUNCTION__))->type_common.size), ((tree_class_check ((orig), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2505, __FUNCTION__))->type_common.size))) ? fancy_abort ( "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2505, __FUNCTION__), 0 : 0)); |
2506 | return fold_build1_loc (loc, VIEW_CONVERT_EXPR, type, arg); |
2507 | |
2508 | case REAL_TYPE: |
2509 | if (TREE_CODE (arg)((enum tree_code) (arg)->base.code) == INTEGER_CST) |
2510 | { |
2511 | tem = fold_convert_const (FLOAT_EXPR, type, arg); |
2512 | if (tem != NULL_TREE(tree) __null) |
2513 | return tem; |
2514 | } |
2515 | else if (TREE_CODE (arg)((enum tree_code) (arg)->base.code) == REAL_CST) |
2516 | { |
2517 | tem = fold_convert_const (NOP_EXPR, type, arg); |
2518 | if (tem != NULL_TREE(tree) __null) |
2519 | return tem; |
2520 | } |
2521 | else if (TREE_CODE (arg)((enum tree_code) (arg)->base.code) == FIXED_CST) |
2522 | { |
2523 | tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg); |
2524 | if (tem != NULL_TREE(tree) __null) |
2525 | return tem; |
2526 | } |
2527 | |
2528 | switch (TREE_CODE (orig)((enum tree_code) (orig)->base.code)) |
2529 | { |
2530 | case INTEGER_TYPE: |
2531 | case BOOLEAN_TYPE: case ENUMERAL_TYPE: |
2532 | case POINTER_TYPE: case REFERENCE_TYPE: |
2533 | return fold_build1_loc (loc, FLOAT_EXPR, type, arg); |
2534 | |
2535 | case REAL_TYPE: |
2536 | return fold_build1_loc (loc, NOP_EXPR, type, arg); |
2537 | |
2538 | case FIXED_POINT_TYPE: |
2539 | return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg); |
2540 | |
2541 | case COMPLEX_TYPE: |
2542 | tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig)((contains_struct_check ((orig), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2542, __FUNCTION__))->typed.type), arg); |
2543 | return fold_convert_loc (loc, type, tem); |
2544 | |
2545 | default: |
2546 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2546, __FUNCTION__)); |
2547 | } |
2548 | |
2549 | case FIXED_POINT_TYPE: |
2550 | if (TREE_CODE (arg)((enum tree_code) (arg)->base.code) == FIXED_CST || TREE_CODE (arg)((enum tree_code) (arg)->base.code) == INTEGER_CST |
2551 | || TREE_CODE (arg)((enum tree_code) (arg)->base.code) == REAL_CST) |
2552 | { |
2553 | tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg); |
2554 | if (tem != NULL_TREE(tree) __null) |
2555 | goto fold_convert_exit; |
2556 | } |
2557 | |
2558 | switch (TREE_CODE (orig)((enum tree_code) (orig)->base.code)) |
2559 | { |
2560 | case FIXED_POINT_TYPE: |
2561 | case INTEGER_TYPE: |
2562 | case ENUMERAL_TYPE: |
2563 | case BOOLEAN_TYPE: |
2564 | case REAL_TYPE: |
2565 | return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg); |
2566 | |
2567 | case COMPLEX_TYPE: |
2568 | tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig)((contains_struct_check ((orig), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2568, __FUNCTION__))->typed.type), arg); |
2569 | return fold_convert_loc (loc, type, tem); |
2570 | |
2571 | default: |
2572 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2572, __FUNCTION__)); |
2573 | } |
2574 | |
2575 | case COMPLEX_TYPE: |
2576 | switch (TREE_CODE (orig)((enum tree_code) (orig)->base.code)) |
2577 | { |
2578 | case INTEGER_TYPE: |
2579 | case BOOLEAN_TYPE: case ENUMERAL_TYPE: |
2580 | case POINTER_TYPE: case REFERENCE_TYPE: |
2581 | case REAL_TYPE: |
2582 | case FIXED_POINT_TYPE: |
2583 | return fold_build2_loc (loc, COMPLEX_EXPR, type, |
2584 | fold_convert_loc (loc, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2584, __FUNCTION__))->typed.type), arg), |
2585 | fold_convert_loc (loc, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2585, __FUNCTION__))->typed.type), |
2586 | integer_zero_nodeglobal_trees[TI_INTEGER_ZERO])); |
2587 | case COMPLEX_TYPE: |
2588 | { |
2589 | tree rpart, ipart; |
2590 | |
2591 | if (TREE_CODE (arg)((enum tree_code) (arg)->base.code) == COMPLEX_EXPR) |
2592 | { |
2593 | rpart = fold_convert_loc (loc, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2593, __FUNCTION__))->typed.type), |
2594 | TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2594, __FUNCTION__)))))); |
2595 | ipart = fold_convert_loc (loc, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2595, __FUNCTION__))->typed.type), |
2596 | TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2596, __FUNCTION__)))))); |
2597 | return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart); |
2598 | } |
2599 | |
2600 | arg = save_expr (arg); |
2601 | rpart = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig)((contains_struct_check ((orig), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2601, __FUNCTION__))->typed.type), arg); |
2602 | ipart = fold_build1_loc (loc, IMAGPART_EXPR, TREE_TYPE (orig)((contains_struct_check ((orig), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2602, __FUNCTION__))->typed.type), arg); |
2603 | rpart = fold_convert_loc (loc, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2603, __FUNCTION__))->typed.type), rpart); |
2604 | ipart = fold_convert_loc (loc, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2604, __FUNCTION__))->typed.type), ipart); |
2605 | return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart); |
2606 | } |
2607 | |
2608 | default: |
2609 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2609, __FUNCTION__)); |
2610 | } |
2611 | |
2612 | case VECTOR_TYPE: |
2613 | if (integer_zerop (arg)) |
2614 | return build_zero_vector (type); |
2615 | gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)))((void)(!(tree_int_cst_equal (((tree_class_check ((type), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2615, __FUNCTION__))->type_common.size), ((tree_class_check ((orig), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2615, __FUNCTION__))->type_common.size))) ? fancy_abort ( "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2615, __FUNCTION__), 0 : 0)); |
2616 | gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)((void)(!((((enum tree_code) (orig)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (orig)->base.code) == BOOLEAN_TYPE || ((enum tree_code) (orig)->base.code) == INTEGER_TYPE) || ( ((enum tree_code) (orig)->base.code) == POINTER_TYPE || (( enum tree_code) (orig)->base.code) == REFERENCE_TYPE) || ( (enum tree_code) (orig)->base.code) == VECTOR_TYPE) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2617, __FUNCTION__), 0 : 0)) |
2617 | || TREE_CODE (orig) == VECTOR_TYPE)((void)(!((((enum tree_code) (orig)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (orig)->base.code) == BOOLEAN_TYPE || ((enum tree_code) (orig)->base.code) == INTEGER_TYPE) || ( ((enum tree_code) (orig)->base.code) == POINTER_TYPE || (( enum tree_code) (orig)->base.code) == REFERENCE_TYPE) || ( (enum tree_code) (orig)->base.code) == VECTOR_TYPE) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2617, __FUNCTION__), 0 : 0)); |
2618 | return fold_build1_loc (loc, VIEW_CONVERT_EXPR, type, arg); |
2619 | |
2620 | case VOID_TYPE: |
2621 | tem = fold_ignored_result (arg); |
2622 | return fold_build1_loc (loc, NOP_EXPR, type, tem); |
2623 | |
2624 | default: |
2625 | if (TYPE_MAIN_VARIANT (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2625, __FUNCTION__))->type_common.main_variant) == TYPE_MAIN_VARIANT (orig)((tree_class_check ((orig), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2625, __FUNCTION__))->type_common.main_variant)) |
2626 | return fold_build1_loc (loc, NOP_EXPR, type, arg); |
2627 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2627, __FUNCTION__)); |
2628 | } |
2629 | fold_convert_exit: |
2630 | tem = protected_set_expr_location_unshare (tem, loc); |
2631 | return tem; |
2632 | } |
2633 | |
2634 | /* Return false if expr can be assumed not to be an lvalue, true |
2635 | otherwise. */ |
2636 | |
2637 | static bool |
2638 | maybe_lvalue_p (const_tree x) |
2639 | { |
2640 | /* We only need to wrap lvalue tree codes. */ |
2641 | switch (TREE_CODE (x)((enum tree_code) (x)->base.code)) |
2642 | { |
2643 | case VAR_DECL: |
2644 | case PARM_DECL: |
2645 | case RESULT_DECL: |
2646 | case LABEL_DECL: |
2647 | case FUNCTION_DECL: |
2648 | case SSA_NAME: |
2649 | case COMPOUND_LITERAL_EXPR: |
2650 | |
2651 | case COMPONENT_REF: |
2652 | case MEM_REF: |
2653 | case INDIRECT_REF: |
2654 | case ARRAY_REF: |
2655 | case ARRAY_RANGE_REF: |
2656 | case BIT_FIELD_REF: |
2657 | case OBJ_TYPE_REF: |
2658 | |
2659 | case REALPART_EXPR: |
2660 | case IMAGPART_EXPR: |
2661 | case PREINCREMENT_EXPR: |
2662 | case PREDECREMENT_EXPR: |
2663 | case SAVE_EXPR: |
2664 | case TRY_CATCH_EXPR: |
2665 | case WITH_CLEANUP_EXPR: |
2666 | case COMPOUND_EXPR: |
2667 | case MODIFY_EXPR: |
2668 | case TARGET_EXPR: |
2669 | case COND_EXPR: |
2670 | case BIND_EXPR: |
2671 | case VIEW_CONVERT_EXPR: |
2672 | break; |
2673 | |
2674 | default: |
2675 | /* Assume the worst for front-end tree codes. */ |
2676 | if ((int)TREE_CODE (x)((enum tree_code) (x)->base.code) >= NUM_TREE_CODES((int) LAST_AND_UNUSED_TREE_CODE)) |
2677 | break; |
2678 | return false; |
2679 | } |
2680 | |
2681 | return true; |
2682 | } |
2683 | |
2684 | /* Return an expr equal to X but certainly not valid as an lvalue. */ |
2685 | |
2686 | tree |
2687 | non_lvalue_loc (location_t loc, tree x) |
2688 | { |
2689 | /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to |
2690 | us. */ |
2691 | if (in_gimple_form) |
2692 | return x; |
2693 | |
2694 | if (! maybe_lvalue_p (x)) |
2695 | return x; |
2696 | return build1_loc (loc, NON_LVALUE_EXPR, TREE_TYPE (x)((contains_struct_check ((x), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2696, __FUNCTION__))->typed.type), x); |
2697 | } |
2698 | |
2699 | /* Given a tree comparison code, return the code that is the logical inverse. |
2700 | It is generally not safe to do this for floating-point comparisons, except |
2701 | for EQ_EXPR, NE_EXPR, ORDERED_EXPR and UNORDERED_EXPR, so we return |
2702 | ERROR_MARK in this case. */ |
2703 | |
2704 | enum tree_code |
2705 | invert_tree_comparison (enum tree_code code, bool honor_nans) |
2706 | { |
2707 | if (honor_nans && flag_trapping_mathglobal_options.x_flag_trapping_math && code != EQ_EXPR && code != NE_EXPR |
2708 | && code != ORDERED_EXPR && code != UNORDERED_EXPR) |
2709 | return ERROR_MARK; |
2710 | |
2711 | switch (code) |
2712 | { |
2713 | case EQ_EXPR: |
2714 | return NE_EXPR; |
2715 | case NE_EXPR: |
2716 | return EQ_EXPR; |
2717 | case GT_EXPR: |
2718 | return honor_nans ? UNLE_EXPR : LE_EXPR; |
2719 | case GE_EXPR: |
2720 | return honor_nans ? UNLT_EXPR : LT_EXPR; |
2721 | case LT_EXPR: |
2722 | return honor_nans ? UNGE_EXPR : GE_EXPR; |
2723 | case LE_EXPR: |
2724 | return honor_nans ? UNGT_EXPR : GT_EXPR; |
2725 | case LTGT_EXPR: |
2726 | return UNEQ_EXPR; |
2727 | case UNEQ_EXPR: |
2728 | return LTGT_EXPR; |
2729 | case UNGT_EXPR: |
2730 | return LE_EXPR; |
2731 | case UNGE_EXPR: |
2732 | return LT_EXPR; |
2733 | case UNLT_EXPR: |
2734 | return GE_EXPR; |
2735 | case UNLE_EXPR: |
2736 | return GT_EXPR; |
2737 | case ORDERED_EXPR: |
2738 | return UNORDERED_EXPR; |
2739 | case UNORDERED_EXPR: |
2740 | return ORDERED_EXPR; |
2741 | default: |
2742 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2742, __FUNCTION__)); |
2743 | } |
2744 | } |
2745 | |
2746 | /* Similar, but return the comparison that results if the operands are |
2747 | swapped. This is safe for floating-point. */ |
2748 | |
2749 | enum tree_code |
2750 | swap_tree_comparison (enum tree_code code) |
2751 | { |
2752 | switch (code) |
2753 | { |
2754 | case EQ_EXPR: |
2755 | case NE_EXPR: |
2756 | case ORDERED_EXPR: |
2757 | case UNORDERED_EXPR: |
2758 | case LTGT_EXPR: |
2759 | case UNEQ_EXPR: |
2760 | return code; |
2761 | case GT_EXPR: |
2762 | return LT_EXPR; |
2763 | case GE_EXPR: |
2764 | return LE_EXPR; |
2765 | case LT_EXPR: |
2766 | return GT_EXPR; |
2767 | case LE_EXPR: |
2768 | return GE_EXPR; |
2769 | case UNGT_EXPR: |
2770 | return UNLT_EXPR; |
2771 | case UNGE_EXPR: |
2772 | return UNLE_EXPR; |
2773 | case UNLT_EXPR: |
2774 | return UNGT_EXPR; |
2775 | case UNLE_EXPR: |
2776 | return UNGE_EXPR; |
2777 | default: |
2778 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2778, __FUNCTION__)); |
2779 | } |
2780 | } |
2781 | |
2782 | |
2783 | /* Convert a comparison tree code from an enum tree_code representation |
2784 | into a compcode bit-based encoding. This function is the inverse of |
2785 | compcode_to_comparison. */ |
2786 | |
2787 | static enum comparison_code |
2788 | comparison_to_compcode (enum tree_code code) |
2789 | { |
2790 | switch (code) |
2791 | { |
2792 | case LT_EXPR: |
2793 | return COMPCODE_LT; |
2794 | case EQ_EXPR: |
2795 | return COMPCODE_EQ; |
2796 | case LE_EXPR: |
2797 | return COMPCODE_LE; |
2798 | case GT_EXPR: |
2799 | return COMPCODE_GT; |
2800 | case NE_EXPR: |
2801 | return COMPCODE_NE; |
2802 | case GE_EXPR: |
2803 | return COMPCODE_GE; |
2804 | case ORDERED_EXPR: |
2805 | return COMPCODE_ORD; |
2806 | case UNORDERED_EXPR: |
2807 | return COMPCODE_UNORD; |
2808 | case UNLT_EXPR: |
2809 | return COMPCODE_UNLT; |
2810 | case UNEQ_EXPR: |
2811 | return COMPCODE_UNEQ; |
2812 | case UNLE_EXPR: |
2813 | return COMPCODE_UNLE; |
2814 | case UNGT_EXPR: |
2815 | return COMPCODE_UNGT; |
2816 | case LTGT_EXPR: |
2817 | return COMPCODE_LTGT; |
2818 | case UNGE_EXPR: |
2819 | return COMPCODE_UNGE; |
2820 | default: |
2821 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2821, __FUNCTION__)); |
2822 | } |
2823 | } |
2824 | |
2825 | /* Convert a compcode bit-based encoding of a comparison operator back |
2826 | to GCC's enum tree_code representation. This function is the |
2827 | inverse of comparison_to_compcode. */ |
2828 | |
2829 | static enum tree_code |
2830 | compcode_to_comparison (enum comparison_code code) |
2831 | { |
2832 | switch (code) |
2833 | { |
2834 | case COMPCODE_LT: |
2835 | return LT_EXPR; |
2836 | case COMPCODE_EQ: |
2837 | return EQ_EXPR; |
2838 | case COMPCODE_LE: |
2839 | return LE_EXPR; |
2840 | case COMPCODE_GT: |
2841 | return GT_EXPR; |
2842 | case COMPCODE_NE: |
2843 | return NE_EXPR; |
2844 | case COMPCODE_GE: |
2845 | return GE_EXPR; |
2846 | case COMPCODE_ORD: |
2847 | return ORDERED_EXPR; |
2848 | case COMPCODE_UNORD: |
2849 | return UNORDERED_EXPR; |
2850 | case COMPCODE_UNLT: |
2851 | return UNLT_EXPR; |
2852 | case COMPCODE_UNEQ: |
2853 | return UNEQ_EXPR; |
2854 | case COMPCODE_UNLE: |
2855 | return UNLE_EXPR; |
2856 | case COMPCODE_UNGT: |
2857 | return UNGT_EXPR; |
2858 | case COMPCODE_LTGT: |
2859 | return LTGT_EXPR; |
2860 | case COMPCODE_UNGE: |
2861 | return UNGE_EXPR; |
2862 | default: |
2863 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2863, __FUNCTION__)); |
2864 | } |
2865 | } |
2866 | |
2867 | /* Return true if COND1 tests the opposite condition of COND2. */ |
2868 | |
2869 | bool |
2870 | inverse_conditions_p (const_tree cond1, const_tree cond2) |
2871 | { |
2872 | return (COMPARISON_CLASS_P (cond1)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (cond1)->base.code))] == tcc_comparison) |
2873 | && COMPARISON_CLASS_P (cond2)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (cond2)->base.code))] == tcc_comparison) |
2874 | && (invert_tree_comparison |
2875 | (TREE_CODE (cond1)((enum tree_code) (cond1)->base.code), |
2876 | HONOR_NANS (TREE_OPERAND (cond1, 0)(*((const_cast<tree*> (tree_operand_check ((cond1), (0) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2876, __FUNCTION__))))))) == TREE_CODE (cond2)((enum tree_code) (cond2)->base.code)) |
2877 | && operand_equal_p (TREE_OPERAND (cond1, 0)(*((const_cast<tree*> (tree_operand_check ((cond1), (0) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2877, __FUNCTION__))))), |
2878 | TREE_OPERAND (cond2, 0)(*((const_cast<tree*> (tree_operand_check ((cond2), (0) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2878, __FUNCTION__))))), 0) |
2879 | && operand_equal_p (TREE_OPERAND (cond1, 1)(*((const_cast<tree*> (tree_operand_check ((cond1), (1) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2879, __FUNCTION__))))), |
2880 | TREE_OPERAND (cond2, 1)(*((const_cast<tree*> (tree_operand_check ((cond2), (1) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 2880, __FUNCTION__))))), 0)); |
2881 | } |
2882 | |
2883 | /* Return a tree for the comparison which is the combination of |
2884 | doing the AND or OR (depending on CODE) of the two operations LCODE |
2885 | and RCODE on the identical operands LL_ARG and LR_ARG. Take into account |
2886 | the possibility of trapping if the mode has NaNs, and return NULL_TREE |
2887 | if this makes the transformation invalid. */ |
2888 | |
2889 | tree |
2890 | combine_comparisons (location_t loc, |
2891 | enum tree_code code, enum tree_code lcode, |
2892 | enum tree_code rcode, tree truth_type, |
2893 | tree ll_arg, tree lr_arg) |
2894 | { |
2895 | bool honor_nans = HONOR_NANS (ll_arg); |
2896 | enum comparison_code lcompcode = comparison_to_compcode (lcode); |
2897 | enum comparison_code rcompcode = comparison_to_compcode (rcode); |
2898 | int compcode; |
2899 | |
2900 | switch (code) |
2901 | { |
2902 | case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR: |
2903 | compcode = lcompcode & rcompcode; |
2904 | break; |
2905 | |
2906 | case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR: |
2907 | compcode = lcompcode | rcompcode; |
2908 | break; |
2909 | |
2910 | default: |
2911 | return NULL_TREE(tree) __null; |
2912 | } |
2913 | |
2914 | if (!honor_nans) |
2915 | { |
2916 | /* Eliminate unordered comparisons, as well as LTGT and ORD |
2917 | which are not used unless the mode has NaNs. */ |
2918 | compcode &= ~COMPCODE_UNORD; |
2919 | if (compcode == COMPCODE_LTGT) |
2920 | compcode = COMPCODE_NE; |
2921 | else if (compcode == COMPCODE_ORD) |
2922 | compcode = COMPCODE_TRUE; |
2923 | } |
2924 | else if (flag_trapping_mathglobal_options.x_flag_trapping_math) |
2925 | { |
2926 | /* Check that the original operation and the optimized ones will trap |
2927 | under the same condition. */ |
2928 | bool ltrap = (lcompcode & COMPCODE_UNORD) == 0 |
2929 | && (lcompcode != COMPCODE_EQ) |
2930 | && (lcompcode != COMPCODE_ORD); |
2931 | bool rtrap = (rcompcode & COMPCODE_UNORD) == 0 |
2932 | && (rcompcode != COMPCODE_EQ) |
2933 | && (rcompcode != COMPCODE_ORD); |
2934 | bool trap = (compcode & COMPCODE_UNORD) == 0 |
2935 | && (compcode != COMPCODE_EQ) |
2936 | && (compcode != COMPCODE_ORD); |
2937 | |
2938 | /* In a short-circuited boolean expression the LHS might be |
2939 | such that the RHS, if evaluated, will never trap. For |
2940 | example, in ORD (x, y) && (x < y), we evaluate the RHS only |
2941 | if neither x nor y is NaN. (This is a mixed blessing: for |
2942 | example, the expression above will never trap, hence |
2943 | optimizing it to x < y would be invalid). */ |
2944 | if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD)) |
2945 | || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD))) |
2946 | rtrap = false; |
2947 | |
2948 | /* If the comparison was short-circuited, and only the RHS |
2949 | trapped, we may now generate a spurious trap. */ |
2950 | if (rtrap && !ltrap |
2951 | && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)) |
2952 | return NULL_TREE(tree) __null; |
2953 | |
2954 | /* If we changed the conditions that cause a trap, we lose. */ |
2955 | if ((ltrap || rtrap) != trap) |
2956 | return NULL_TREE(tree) __null; |
2957 | } |
2958 | |
2959 | if (compcode == COMPCODE_TRUE) |
2960 | return constant_boolean_node (true, truth_type); |
2961 | else if (compcode == COMPCODE_FALSE) |
2962 | return constant_boolean_node (false, truth_type); |
2963 | else |
2964 | { |
2965 | enum tree_code tcode; |
2966 | |
2967 | tcode = compcode_to_comparison ((enum comparison_code) compcode); |
2968 | return fold_build2_loc (loc, tcode, truth_type, ll_arg, lr_arg); |
2969 | } |
2970 | } |
2971 | |
2972 | /* Return nonzero if two operands (typically of the same tree node) |
2973 | are necessarily equal. FLAGS modifies behavior as follows: |
2974 | |
2975 | If OEP_ONLY_CONST is set, only return nonzero for constants. |
2976 | This function tests whether the operands are indistinguishable; |
2977 | it does not test whether they are equal using C's == operation. |
2978 | The distinction is important for IEEE floating point, because |
2979 | (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and |
2980 | (2) two NaNs may be indistinguishable, but NaN!=NaN. |
2981 | |
2982 | If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself |
2983 | even though it may hold multiple values during a function. |
2984 | This is because a GCC tree node guarantees that nothing else is |
2985 | executed between the evaluation of its "operands" (which may often |
2986 | be evaluated in arbitrary order). Hence if the operands themselves |
2987 | don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the |
2988 | same value in each operand/subexpression. Hence leaving OEP_ONLY_CONST |
2989 | unset means assuming isochronic (or instantaneous) tree equivalence. |
2990 | Unless comparing arbitrary expression trees, such as from different |
2991 | statements, this flag can usually be left unset. |
2992 | |
2993 | If OEP_PURE_SAME is set, then pure functions with identical arguments |
2994 | are considered the same. It is used when the caller has other ways |
2995 | to ensure that global memory is unchanged in between. |
2996 | |
2997 | If OEP_ADDRESS_OF is set, we are actually comparing addresses of objects, |
2998 | not values of expressions. |
2999 | |
3000 | If OEP_LEXICOGRAPHIC is set, then also handle expressions with side-effects |
3001 | such as MODIFY_EXPR, RETURN_EXPR, as well as STATEMENT_LISTs. |
3002 | |
3003 | If OEP_BITWISE is set, then require the values to be bitwise identical |
3004 | rather than simply numerically equal. Do not take advantage of things |
3005 | like math-related flags or undefined behavior; only return true for |
3006 | values that are provably bitwise identical in all circumstances. |
3007 | |
3008 | Unless OEP_MATCH_SIDE_EFFECTS is set, the function returns false on |
3009 | any operand with side effect. This is unnecesarily conservative in the |
3010 | case we know that arg0 and arg1 are in disjoint code paths (such as in |
3011 | ?: operator). In addition OEP_MATCH_SIDE_EFFECTS is used when comparing |
3012 | addresses with TREE_CONSTANT flag set so we know that &var == &var |
3013 | even if var is volatile. */ |
3014 | |
3015 | bool |
3016 | operand_compare::operand_equal_p (const_tree arg0, const_tree arg1, |
3017 | unsigned int flags) |
3018 | { |
3019 | bool r; |
3020 | if (verify_hash_value (arg0, arg1, flags, &r)) |
3021 | return r; |
3022 | |
3023 | STRIP_ANY_LOCATION_WRAPPER (arg0)(arg0) = tree_strip_any_location_wrapper ((const_cast<union tree_node *> (((arg0))))); |
3024 | STRIP_ANY_LOCATION_WRAPPER (arg1)(arg1) = tree_strip_any_location_wrapper ((const_cast<union tree_node *> (((arg1))))); |
3025 | |
3026 | /* If either is ERROR_MARK, they aren't equal. */ |
3027 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == ERROR_MARK || TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == ERROR_MARK |
3028 | || TREE_TYPE (arg0)((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3028, __FUNCTION__))->typed.type) == error_mark_nodeglobal_trees[TI_ERROR_MARK] |
3029 | || TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3029, __FUNCTION__))->typed.type) == error_mark_nodeglobal_trees[TI_ERROR_MARK]) |
3030 | return false; |
3031 | |
3032 | /* Similar, if either does not have a type (like a template id), |
3033 | they aren't equal. */ |
3034 | if (!TREE_TYPE (arg0)((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3034, __FUNCTION__))->typed.type) || !TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3034, __FUNCTION__))->typed.type)) |
3035 | return false; |
3036 | |
3037 | /* Bitwise identity makes no sense if the values have different layouts. */ |
3038 | if ((flags & OEP_BITWISE) |
3039 | && !tree_nop_conversion_p (TREE_TYPE (arg0)((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3039, __FUNCTION__))->typed.type), TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3039, __FUNCTION__))->typed.type))) |
3040 | return false; |
3041 | |
3042 | /* We cannot consider pointers to different address space equal. */ |
3043 | if (POINTER_TYPE_P (TREE_TYPE (arg0))(((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3043, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3043, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ) |
3044 | && POINTER_TYPE_P (TREE_TYPE (arg1))(((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3044, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3044, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ) |
3045 | && (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg0)))((tree_class_check ((((contains_struct_check ((((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3045, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3045, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3045, __FUNCTION__))->base.u.bits.address_space) |
3046 | != TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg1)))((tree_class_check ((((contains_struct_check ((((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3046, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3046, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3046, __FUNCTION__))->base.u.bits.address_space))) |
3047 | return false; |
3048 | |
3049 | /* Check equality of integer constants before bailing out due to |
3050 | precision differences. */ |
3051 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == INTEGER_CST && TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == INTEGER_CST) |
3052 | { |
3053 | /* Address of INTEGER_CST is not defined; check that we did not forget |
3054 | to drop the OEP_ADDRESS_OF flags. */ |
3055 | gcc_checking_assert (!(flags & OEP_ADDRESS_OF))((void)(!(!(flags & OEP_ADDRESS_OF)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3055, __FUNCTION__), 0 : 0)); |
3056 | return tree_int_cst_equal (arg0, arg1); |
3057 | } |
3058 | |
3059 | if (!(flags & OEP_ADDRESS_OF)) |
3060 | { |
3061 | /* If both types don't have the same signedness, then we can't consider |
3062 | them equal. We must check this before the STRIP_NOPS calls |
3063 | because they may change the signedness of the arguments. As pointers |
3064 | strictly don't have a signedness, require either two pointers or |
3065 | two non-pointers as well. */ |
3066 | if (TYPE_UNSIGNED (TREE_TYPE (arg0))((tree_class_check ((((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3066, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3066, __FUNCTION__))->base.u.bits.unsigned_flag) != TYPE_UNSIGNED (TREE_TYPE (arg1))((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3066, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3066, __FUNCTION__))->base.u.bits.unsigned_flag) |
3067 | || POINTER_TYPE_P (TREE_TYPE (arg0))(((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3067, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3067, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ) |
3068 | != POINTER_TYPE_P (TREE_TYPE (arg1))(((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3068, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3068, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
3069 | return false; |
3070 | |
3071 | /* If both types don't have the same precision, then it is not safe |
3072 | to strip NOPs. */ |
3073 | if (element_precision (TREE_TYPE (arg0)((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3073, __FUNCTION__))->typed.type)) |
3074 | != element_precision (TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3074, __FUNCTION__))->typed.type))) |
3075 | return false; |
3076 | |
3077 | STRIP_NOPS (arg0)(arg0) = tree_strip_nop_conversions ((const_cast<union tree_node *> (((arg0))))); |
3078 | STRIP_NOPS (arg1)(arg1) = tree_strip_nop_conversions ((const_cast<union tree_node *> (((arg1))))); |
3079 | } |
3080 | #if 0 |
3081 | /* FIXME: Fortran FE currently produce ADDR_EXPR of NOP_EXPR. Enable the |
3082 | sanity check once the issue is solved. */ |
3083 | else |
3084 | /* Addresses of conversions and SSA_NAMEs (and many other things) |
3085 | are not defined. Check that we did not forget to drop the |
3086 | OEP_ADDRESS_OF/OEP_CONSTANT_ADDRESS_OF flags. */ |
3087 | gcc_checking_assert (!CONVERT_EXPR_P (arg0) && !CONVERT_EXPR_P (arg1)((void)(!(!((((enum tree_code) (arg0)->base.code)) == NOP_EXPR || (((enum tree_code) (arg0)->base.code)) == CONVERT_EXPR ) && !((((enum tree_code) (arg1)->base.code)) == NOP_EXPR || (((enum tree_code) (arg1)->base.code)) == CONVERT_EXPR ) && ((enum tree_code) (arg0)->base.code) != SSA_NAME ) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3088, __FUNCTION__), 0 : 0)) |
3088 | && TREE_CODE (arg0) != SSA_NAME)((void)(!(!((((enum tree_code) (arg0)->base.code)) == NOP_EXPR || (((enum tree_code) (arg0)->base.code)) == CONVERT_EXPR ) && !((((enum tree_code) (arg1)->base.code)) == NOP_EXPR || (((enum tree_code) (arg1)->base.code)) == CONVERT_EXPR ) && ((enum tree_code) (arg0)->base.code) != SSA_NAME ) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3088, __FUNCTION__), 0 : 0)); |
3089 | #endif |
3090 | |
3091 | /* In case both args are comparisons but with different comparison |
3092 | code, try to swap the comparison operands of one arg to produce |
3093 | a match and compare that variant. */ |
3094 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) != TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) |
3095 | && COMPARISON_CLASS_P (arg0)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (arg0)->base.code))] == tcc_comparison) |
3096 | && COMPARISON_CLASS_P (arg1)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (arg1)->base.code))] == tcc_comparison)) |
3097 | { |
3098 | enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code)); |
3099 | |
3100 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == swap_code) |
3101 | return operand_equal_p (TREE_OPERAND (arg0, 0)(*((const_cast<tree*> (tree_operand_check ((arg0), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3101, __FUNCTION__))))), |
3102 | TREE_OPERAND (arg1, 1)(*((const_cast<tree*> (tree_operand_check ((arg1), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3102, __FUNCTION__))))), flags) |
3103 | && operand_equal_p (TREE_OPERAND (arg0, 1)(*((const_cast<tree*> (tree_operand_check ((arg0), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3103, __FUNCTION__))))), |
3104 | TREE_OPERAND (arg1, 0)(*((const_cast<tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3104, __FUNCTION__))))), flags); |
3105 | } |
3106 | |
3107 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) != TREE_CODE (arg1)((enum tree_code) (arg1)->base.code)) |
3108 | { |
3109 | /* NOP_EXPR and CONVERT_EXPR are considered equal. */ |
3110 | if (CONVERT_EXPR_P (arg0)((((enum tree_code) (arg0)->base.code)) == NOP_EXPR || ((( enum tree_code) (arg0)->base.code)) == CONVERT_EXPR) && CONVERT_EXPR_P (arg1)((((enum tree_code) (arg1)->base.code)) == NOP_EXPR || ((( enum tree_code) (arg1)->base.code)) == CONVERT_EXPR)) |
3111 | ; |
3112 | else if (flags & OEP_ADDRESS_OF) |
3113 | { |
3114 | /* If we are interested in comparing addresses ignore |
3115 | MEM_REF wrappings of the base that can appear just for |
3116 | TBAA reasons. */ |
3117 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == MEM_REF |
3118 | && DECL_P (arg1)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (arg1)->base.code))] == tcc_declaration) |
3119 | && TREE_CODE (TREE_OPERAND (arg0, 0))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((arg0), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3119, __FUNCTION__))))))->base.code) == ADDR_EXPR |
3120 | && TREE_OPERAND (TREE_OPERAND (arg0, 0), 0)(*((const_cast<tree*> (tree_operand_check (((*((const_cast <tree*> (tree_operand_check ((arg0), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3120, __FUNCTION__)))))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3120, __FUNCTION__))))) == arg1 |
3121 | && integer_zerop (TREE_OPERAND (arg0, 1)(*((const_cast<tree*> (tree_operand_check ((arg0), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3121, __FUNCTION__))))))) |
3122 | return true; |
3123 | else if (TREE_CODE (arg1)((enum tree_code) (arg1)->base.code) == MEM_REF |
3124 | && DECL_P (arg0)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (arg0)->base.code))] == tcc_declaration) |
3125 | && TREE_CODE (TREE_OPERAND (arg1, 0))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3125, __FUNCTION__))))))->base.code) == ADDR_EXPR |
3126 | && TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)(*((const_cast<tree*> (tree_operand_check (((*((const_cast <tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3126, __FUNCTION__)))))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3126, __FUNCTION__))))) == arg0 |
3127 | && integer_zerop (TREE_OPERAND (arg1, 1)(*((const_cast<tree*> (tree_operand_check ((arg1), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3127, __FUNCTION__))))))) |
3128 | return true; |
3129 | return false; |
3130 | } |
3131 | else |
3132 | return false; |
3133 | } |
3134 | |
3135 | /* When not checking adddresses, this is needed for conversions and for |
3136 | COMPONENT_REF. Might as well play it safe and always test this. */ |
3137 | if (TREE_CODE (TREE_TYPE (arg0))((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3137, __FUNCTION__))->typed.type))->base.code) == ERROR_MARK |
3138 | || TREE_CODE (TREE_TYPE (arg1))((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3138, __FUNCTION__))->typed.type))->base.code) == ERROR_MARK |
3139 | || (TYPE_MODE (TREE_TYPE (arg0))((((enum tree_code) ((tree_class_check ((((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3139, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3139, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3139, __FUNCTION__))->typed.type)) : (((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3139, __FUNCTION__))->typed.type))->type_common.mode) != TYPE_MODE (TREE_TYPE (arg1))((((enum tree_code) ((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3139, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3139, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3139, __FUNCTION__))->typed.type)) : (((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3139, __FUNCTION__))->typed.type))->type_common.mode) |
3140 | && !(flags & OEP_ADDRESS_OF))) |
3141 | return false; |
3142 | |
3143 | /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal. |
3144 | We don't care about side effects in that case because the SAVE_EXPR |
3145 | takes care of that for us. In all other cases, two expressions are |
3146 | equal if they have no side effects. If we have two identical |
3147 | expressions with side effects that should be treated the same due |
3148 | to the only side effects being identical SAVE_EXPR's, that will |
3149 | be detected in the recursive calls below. |
3150 | If we are taking an invariant address of two identical objects |
3151 | they are necessarily equal as well. */ |
3152 | if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST) |
3153 | && (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == SAVE_EXPR |
3154 | || (flags & OEP_MATCH_SIDE_EFFECTS) |
3155 | || (! TREE_SIDE_EFFECTS (arg0)((non_type_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3155, __FUNCTION__))->base.side_effects_flag) && ! TREE_SIDE_EFFECTS (arg1)((non_type_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3155, __FUNCTION__))->base.side_effects_flag)))) |
3156 | return true; |
3157 | |
3158 | /* Next handle constant cases, those for which we can return 1 even |
3159 | if ONLY_CONST is set. */ |
3160 | if (TREE_CONSTANT (arg0)((non_type_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3160, __FUNCTION__))->base.constant_flag) && TREE_CONSTANT (arg1)((non_type_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3160, __FUNCTION__))->base.constant_flag)) |
3161 | switch (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code)) |
3162 | { |
3163 | case INTEGER_CST: |
3164 | return tree_int_cst_equal (arg0, arg1); |
3165 | |
3166 | case FIXED_CST: |
3167 | return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),fixed_identical (&((*((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3167, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr ))), &((*((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3168, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr )))) |
3168 | TREE_FIXED_CST (arg1))fixed_identical (&((*((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3167, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr ))), &((*((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3168, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr )))); |
3169 | |
3170 | case REAL_CST: |
3171 | if (real_identical (&TREE_REAL_CST (arg0)(*(&(tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3171, __FUNCTION__, (REAL_CST)))->real_cst.value)), &TREE_REAL_CST (arg1)(*(&(tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3171, __FUNCTION__, (REAL_CST)))->real_cst.value)))) |
3172 | return true; |
3173 | |
3174 | if (!(flags & OEP_BITWISE) && !HONOR_SIGNED_ZEROS (arg0)) |
3175 | { |
3176 | /* If we do not distinguish between signed and unsigned zero, |
3177 | consider them equal. */ |
3178 | if (real_zerop (arg0) && real_zerop (arg1)) |
3179 | return true; |
3180 | } |
3181 | return false; |
3182 | |
3183 | case VECTOR_CST: |
3184 | { |
3185 | if (VECTOR_CST_LOG2_NPATTERNS (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3185, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.log2_npatterns ) |
3186 | != VECTOR_CST_LOG2_NPATTERNS (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3186, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.log2_npatterns )) |
3187 | return false; |
3188 | |
3189 | if (VECTOR_CST_NELTS_PER_PATTERN (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3189, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern ) |
3190 | != VECTOR_CST_NELTS_PER_PATTERN (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3190, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern )) |
3191 | return false; |
3192 | |
3193 | unsigned int count = vector_cst_encoded_nelts (arg0); |
3194 | for (unsigned int i = 0; i < count; ++i) |
3195 | if (!operand_equal_p (VECTOR_CST_ENCODED_ELT (arg0, i)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3195, __FUNCTION__, (VECTOR_CST)))->vector.elts[i]), |
3196 | VECTOR_CST_ENCODED_ELT (arg1, i)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3196, __FUNCTION__, (VECTOR_CST)))->vector.elts[i]), flags)) |
3197 | return false; |
3198 | return true; |
3199 | } |
3200 | |
3201 | case COMPLEX_CST: |
3202 | return (operand_equal_p (TREE_REALPART (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3202, __FUNCTION__, (COMPLEX_CST)))->complex.real), TREE_REALPART (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3202, __FUNCTION__, (COMPLEX_CST)))->complex.real), |
3203 | flags) |
3204 | && operand_equal_p (TREE_IMAGPART (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3204, __FUNCTION__, (COMPLEX_CST)))->complex.imag), TREE_IMAGPART (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3204, __FUNCTION__, (COMPLEX_CST)))->complex.imag), |
3205 | flags)); |
3206 | |
3207 | case STRING_CST: |
3208 | return (TREE_STRING_LENGTH (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3208, __FUNCTION__, (STRING_CST)))->string.length) == TREE_STRING_LENGTH (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3208, __FUNCTION__, (STRING_CST)))->string.length) |
3209 | && ! memcmp (TREE_STRING_POINTER (arg0)((const char *)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3209, __FUNCTION__, (STRING_CST)))->string.str)), |
3210 | TREE_STRING_POINTER (arg1)((const char *)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3210, __FUNCTION__, (STRING_CST)))->string.str)), |
3211 | TREE_STRING_LENGTH (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3211, __FUNCTION__, (STRING_CST)))->string.length))); |
3212 | |
3213 | case ADDR_EXPR: |
3214 | gcc_checking_assert (!(flags & OEP_ADDRESS_OF))((void)(!(!(flags & OEP_ADDRESS_OF)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3214, __FUNCTION__), 0 : 0)); |
3215 | return operand_equal_p (TREE_OPERAND (arg0, 0)(*((const_cast<tree*> (tree_operand_check ((arg0), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3215, __FUNCTION__))))), TREE_OPERAND (arg1, 0)(*((const_cast<tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3215, __FUNCTION__))))), |
3216 | flags | OEP_ADDRESS_OF |
3217 | | OEP_MATCH_SIDE_EFFECTS); |
3218 | case CONSTRUCTOR: |
3219 | /* In GIMPLE empty constructors are allowed in initializers of |
3220 | aggregates. */ |
3221 | return !CONSTRUCTOR_NELTS (arg0)(vec_safe_length (((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3221, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts))) && !CONSTRUCTOR_NELTS (arg1)(vec_safe_length (((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3221, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts))); |
3222 | default: |
3223 | break; |
3224 | } |
3225 | |
3226 | /* Don't handle more cases for OEP_BITWISE, since we can't guarantee that |
3227 | two instances of undefined behavior will give identical results. */ |
3228 | if (flags & (OEP_ONLY_CONST | OEP_BITWISE)) |
3229 | return false; |
3230 | |
3231 | /* Define macros to test an operand from arg0 and arg1 for equality and a |
3232 | variant that allows null and views null as being different from any |
3233 | non-null value. In the latter case, if either is null, the both |
3234 | must be; otherwise, do the normal comparison. */ |
3235 | #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N)(*((const_cast<tree*> (tree_operand_check ((arg0), (N), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3235, __FUNCTION__))))), \ |
3236 | TREE_OPERAND (arg1, N)(*((const_cast<tree*> (tree_operand_check ((arg1), (N), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3236, __FUNCTION__))))), flags) |
3237 | |
3238 | #define OP_SAME_WITH_NULL(N) \ |
3239 | ((!TREE_OPERAND (arg0, N)(*((const_cast<tree*> (tree_operand_check ((arg0), (N), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3239, __FUNCTION__))))) || !TREE_OPERAND (arg1, N)(*((const_cast<tree*> (tree_operand_check ((arg1), (N), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3239, __FUNCTION__)))))) \ |
3240 | ? TREE_OPERAND (arg0, N)(*((const_cast<tree*> (tree_operand_check ((arg0), (N), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3240, __FUNCTION__))))) == TREE_OPERAND (arg1, N)(*((const_cast<tree*> (tree_operand_check ((arg1), (N), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3240, __FUNCTION__))))) : OP_SAME (N)) |
3241 | |
3242 | switch (TREE_CODE_CLASS (TREE_CODE (arg0))tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (arg0)->base.code))]) |
3243 | { |
3244 | case tcc_unary: |
3245 | /* Two conversions are equal only if signedness and modes match. */ |
3246 | switch (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code)) |
3247 | { |
3248 | CASE_CONVERTcase NOP_EXPR: case CONVERT_EXPR: |
3249 | case FIX_TRUNC_EXPR: |
3250 | if (TYPE_UNSIGNED (TREE_TYPE (arg0))((tree_class_check ((((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3250, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3250, __FUNCTION__))->base.u.bits.unsigned_flag) |
3251 | != TYPE_UNSIGNED (TREE_TYPE (arg1))((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3251, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3251, __FUNCTION__))->base.u.bits.unsigned_flag)) |
3252 | return false; |
3253 | break; |
3254 | default: |
3255 | break; |
3256 | } |
3257 | |
3258 | return OP_SAME (0); |
3259 | |
3260 | |
3261 | case tcc_comparison: |
3262 | case tcc_binary: |
3263 | if (OP_SAME (0) && OP_SAME (1)) |
3264 | return true; |
3265 | |
3266 | /* For commutative ops, allow the other order. */ |
3267 | return (commutative_tree_code (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code)) |
3268 | && operand_equal_p (TREE_OPERAND (arg0, 0)(*((const_cast<tree*> (tree_operand_check ((arg0), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3268, __FUNCTION__))))), |
3269 | TREE_OPERAND (arg1, 1)(*((const_cast<tree*> (tree_operand_check ((arg1), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3269, __FUNCTION__))))), flags) |
3270 | && operand_equal_p (TREE_OPERAND (arg0, 1)(*((const_cast<tree*> (tree_operand_check ((arg0), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3270, __FUNCTION__))))), |
3271 | TREE_OPERAND (arg1, 0)(*((const_cast<tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3271, __FUNCTION__))))), flags)); |
3272 | |
3273 | case tcc_reference: |
3274 | /* If either of the pointer (or reference) expressions we are |
3275 | dereferencing contain a side effect, these cannot be equal, |
3276 | but their addresses can be. */ |
3277 | if ((flags & OEP_MATCH_SIDE_EFFECTS) == 0 |
3278 | && (TREE_SIDE_EFFECTS (arg0)((non_type_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3278, __FUNCTION__))->base.side_effects_flag) |
3279 | || TREE_SIDE_EFFECTS (arg1)((non_type_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3279, __FUNCTION__))->base.side_effects_flag))) |
3280 | return false; |
3281 | |
3282 | switch (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code)) |
3283 | { |
3284 | case INDIRECT_REF: |
3285 | if (!(flags & OEP_ADDRESS_OF)) |
3286 | { |
3287 | if (TYPE_ALIGN (TREE_TYPE (arg0))(((tree_class_check ((((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3287, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3287, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((arg0 ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3287, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3287, __FUNCTION__))->type_common.align) - 1) : 0) |
3288 | != TYPE_ALIGN (TREE_TYPE (arg1))(((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3288, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3288, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((arg1 ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3288, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3288, __FUNCTION__))->type_common.align) - 1) : 0)) |
3289 | return false; |
3290 | /* Verify that the access types are compatible. */ |
3291 | if (TYPE_MAIN_VARIANT (TREE_TYPE (arg0))((tree_class_check ((((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3291, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3291, __FUNCTION__))->type_common.main_variant) |
3292 | != TYPE_MAIN_VARIANT (TREE_TYPE (arg1))((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3292, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3292, __FUNCTION__))->type_common.main_variant)) |
3293 | return false; |
3294 | } |
3295 | flags &= ~OEP_ADDRESS_OF; |
3296 | return OP_SAME (0); |
3297 | |
3298 | case IMAGPART_EXPR: |
3299 | /* Require the same offset. */ |
3300 | if (!operand_equal_p (TYPE_SIZE (TREE_TYPE (arg0))((tree_class_check ((((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3300, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3300, __FUNCTION__))->type_common.size), |
3301 | TYPE_SIZE (TREE_TYPE (arg1))((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3301, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3301, __FUNCTION__))->type_common.size), |
3302 | flags & ~OEP_ADDRESS_OF)) |
3303 | return false; |
3304 | |
3305 | /* Fallthru. */ |
3306 | case REALPART_EXPR: |
3307 | case VIEW_CONVERT_EXPR: |
3308 | return OP_SAME (0); |
3309 | |
3310 | case TARGET_MEM_REF: |
3311 | case MEM_REF: |
3312 | if (!(flags & OEP_ADDRESS_OF)) |
3313 | { |
3314 | /* Require equal access sizes */ |
3315 | if (TYPE_SIZE (TREE_TYPE (arg0))((tree_class_check ((((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3315, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3315, __FUNCTION__))->type_common.size) != TYPE_SIZE (TREE_TYPE (arg1))((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3315, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3315, __FUNCTION__))->type_common.size) |
3316 | && (!TYPE_SIZE (TREE_TYPE (arg0))((tree_class_check ((((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3316, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3316, __FUNCTION__))->type_common.size) |
3317 | || !TYPE_SIZE (TREE_TYPE (arg1))((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3317, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3317, __FUNCTION__))->type_common.size) |
3318 | || !operand_equal_p (TYPE_SIZE (TREE_TYPE (arg0))((tree_class_check ((((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3318, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3318, __FUNCTION__))->type_common.size), |
3319 | TYPE_SIZE (TREE_TYPE (arg1))((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3319, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3319, __FUNCTION__))->type_common.size), |
3320 | flags))) |
3321 | return false; |
3322 | /* Verify that access happens in similar types. */ |
3323 | if (!types_compatible_p (TREE_TYPE (arg0)((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3323, __FUNCTION__))->typed.type), TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3323, __FUNCTION__))->typed.type))) |
3324 | return false; |
3325 | /* Verify that accesses are TBAA compatible. */ |
3326 | if (!alias_ptr_types_compatible_p |
3327 | (TREE_TYPE (TREE_OPERAND (arg0, 1))((contains_struct_check (((*((const_cast<tree*> (tree_operand_check ((arg0), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3327, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3327, __FUNCTION__))->typed.type), |
3328 | TREE_TYPE (TREE_OPERAND (arg1, 1))((contains_struct_check (((*((const_cast<tree*> (tree_operand_check ((arg1), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3328, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3328, __FUNCTION__))->typed.type)) |
3329 | || (MR_DEPENDENCE_CLIQUE (arg0)((tree_check2 ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3329, __FUNCTION__, (MEM_REF), (TARGET_MEM_REF)))->base. u.dependence_info.clique) |
3330 | != MR_DEPENDENCE_CLIQUE (arg1)((tree_check2 ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3330, __FUNCTION__, (MEM_REF), (TARGET_MEM_REF)))->base. u.dependence_info.clique)) |
3331 | || (MR_DEPENDENCE_BASE (arg0)((tree_check2 ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3331, __FUNCTION__, (MEM_REF), (TARGET_MEM_REF)))->base. u.dependence_info.base) |
3332 | != MR_DEPENDENCE_BASE (arg1)((tree_check2 ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3332, __FUNCTION__, (MEM_REF), (TARGET_MEM_REF)))->base. u.dependence_info.base))) |
3333 | return false; |
3334 | /* Verify that alignment is compatible. */ |
3335 | if (TYPE_ALIGN (TREE_TYPE (arg0))(((tree_class_check ((((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3335, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3335, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((arg0 ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3335, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3335, __FUNCTION__))->type_common.align) - 1) : 0) |
3336 | != TYPE_ALIGN (TREE_TYPE (arg1))(((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3336, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3336, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((arg1 ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3336, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3336, __FUNCTION__))->type_common.align) - 1) : 0)) |
3337 | return false; |
3338 | } |
3339 | flags &= ~OEP_ADDRESS_OF; |
3340 | return (OP_SAME (0) && OP_SAME (1) |
3341 | /* TARGET_MEM_REF require equal extra operands. */ |
3342 | && (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) != TARGET_MEM_REF |
3343 | || (OP_SAME_WITH_NULL (2) |
3344 | && OP_SAME_WITH_NULL (3) |
3345 | && OP_SAME_WITH_NULL (4)))); |
3346 | |
3347 | case ARRAY_REF: |
3348 | case ARRAY_RANGE_REF: |
3349 | if (!OP_SAME (0)) |
3350 | return false; |
3351 | flags &= ~OEP_ADDRESS_OF; |
3352 | /* Compare the array index by value if it is constant first as we |
3353 | may have different types but same value here. */ |
3354 | return ((tree_int_cst_equal (TREE_OPERAND (arg0, 1)(*((const_cast<tree*> (tree_operand_check ((arg0), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3354, __FUNCTION__))))), |
3355 | TREE_OPERAND (arg1, 1)(*((const_cast<tree*> (tree_operand_check ((arg1), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3355, __FUNCTION__)))))) |
3356 | || OP_SAME (1)) |
3357 | && OP_SAME_WITH_NULL (2) |
3358 | && OP_SAME_WITH_NULL (3) |
3359 | /* Compare low bound and element size as with OEP_ADDRESS_OF |
3360 | we have to account for the offset of the ref. */ |
3361 | && (TREE_TYPE (TREE_OPERAND (arg0, 0))((contains_struct_check (((*((const_cast<tree*> (tree_operand_check ((arg0), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3361, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3361, __FUNCTION__))->typed.type) |
3362 | == TREE_TYPE (TREE_OPERAND (arg1, 0))((contains_struct_check (((*((const_cast<tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3362, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3362, __FUNCTION__))->typed.type) |
3363 | || (operand_equal_p (array_ref_low_bound |
3364 | (CONST_CAST_TREE (arg0)(const_cast<union tree_node *> (((arg0))))), |
3365 | array_ref_low_bound |
3366 | (CONST_CAST_TREE (arg1)(const_cast<union tree_node *> (((arg1))))), flags) |
3367 | && operand_equal_p (array_ref_element_size |
3368 | (CONST_CAST_TREE (arg0)(const_cast<union tree_node *> (((arg0))))), |
3369 | array_ref_element_size |
3370 | (CONST_CAST_TREE (arg1)(const_cast<union tree_node *> (((arg1))))), |
3371 | flags)))); |
3372 | |
3373 | case COMPONENT_REF: |
3374 | /* Handle operand 2 the same as for ARRAY_REF. Operand 0 |
3375 | may be NULL when we're called to compare MEM_EXPRs. */ |
3376 | if (!OP_SAME_WITH_NULL (0)) |
3377 | return false; |
3378 | { |
3379 | bool compare_address = flags & OEP_ADDRESS_OF; |
3380 | |
3381 | /* Most of time we only need to compare FIELD_DECLs for equality. |
3382 | However when determining address look into actual offsets. |
3383 | These may match for unions and unshared record types. */ |
3384 | flags &= ~OEP_ADDRESS_OF; |
3385 | if (!OP_SAME (1)) |
3386 | { |
3387 | if (compare_address |
3388 | && (flags & OEP_ADDRESS_OF_SAME_FIELD) == 0) |
3389 | { |
3390 | tree field0 = TREE_OPERAND (arg0, 1)(*((const_cast<tree*> (tree_operand_check ((arg0), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3390, __FUNCTION__))))); |
3391 | tree field1 = TREE_OPERAND (arg1, 1)(*((const_cast<tree*> (tree_operand_check ((arg1), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3391, __FUNCTION__))))); |
3392 | |
3393 | /* Non-FIELD_DECL operands can appear in C++ templates. */ |
3394 | if (TREE_CODE (field0)((enum tree_code) (field0)->base.code) != FIELD_DECL |
3395 | || TREE_CODE (field1)((enum tree_code) (field1)->base.code) != FIELD_DECL |
3396 | || !operand_equal_p (DECL_FIELD_OFFSET (field0)((tree_check ((field0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3396, __FUNCTION__, (FIELD_DECL)))->field_decl.offset), |
3397 | DECL_FIELD_OFFSET (field1)((tree_check ((field1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3397, __FUNCTION__, (FIELD_DECL)))->field_decl.offset), flags) |
3398 | || !operand_equal_p (DECL_FIELD_BIT_OFFSET (field0)((tree_check ((field0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3398, __FUNCTION__, (FIELD_DECL)))->field_decl.bit_offset ), |
3399 | DECL_FIELD_BIT_OFFSET (field1)((tree_check ((field1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3399, __FUNCTION__, (FIELD_DECL)))->field_decl.bit_offset ), |
3400 | flags)) |
3401 | return false; |
3402 | } |
3403 | else |
3404 | return false; |
3405 | } |
3406 | } |
3407 | return OP_SAME_WITH_NULL (2); |
3408 | |
3409 | case BIT_FIELD_REF: |
3410 | if (!OP_SAME (0)) |
3411 | return false; |
3412 | flags &= ~OEP_ADDRESS_OF; |
3413 | return OP_SAME (1) && OP_SAME (2); |
3414 | |
3415 | default: |
3416 | return false; |
3417 | } |
3418 | |
3419 | case tcc_expression: |
3420 | switch (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code)) |
3421 | { |
3422 | case ADDR_EXPR: |
3423 | /* Be sure we pass right ADDRESS_OF flag. */ |
3424 | gcc_checking_assert (!(flags & OEP_ADDRESS_OF))((void)(!(!(flags & OEP_ADDRESS_OF)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3424, __FUNCTION__), 0 : 0)); |
3425 | return operand_equal_p (TREE_OPERAND (arg0, 0)(*((const_cast<tree*> (tree_operand_check ((arg0), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3425, __FUNCTION__))))), |
3426 | TREE_OPERAND (arg1, 0)(*((const_cast<tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3426, __FUNCTION__))))), |
3427 | flags | OEP_ADDRESS_OF); |
3428 | |
3429 | case TRUTH_NOT_EXPR: |
3430 | return OP_SAME (0); |
3431 | |
3432 | case TRUTH_ANDIF_EXPR: |
3433 | case TRUTH_ORIF_EXPR: |
3434 | return OP_SAME (0) && OP_SAME (1); |
3435 | |
3436 | case WIDEN_MULT_PLUS_EXPR: |
3437 | case WIDEN_MULT_MINUS_EXPR: |
3438 | if (!OP_SAME (2)) |
3439 | return false; |
3440 | /* The multiplcation operands are commutative. */ |
3441 | /* FALLTHRU */ |
3442 | |
3443 | case TRUTH_AND_EXPR: |
3444 | case TRUTH_OR_EXPR: |
3445 | case TRUTH_XOR_EXPR: |
3446 | if (OP_SAME (0) && OP_SAME (1)) |
3447 | return true; |
3448 | |
3449 | /* Otherwise take into account this is a commutative operation. */ |
3450 | return (operand_equal_p (TREE_OPERAND (arg0, 0)(*((const_cast<tree*> (tree_operand_check ((arg0), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3450, __FUNCTION__))))), |
3451 | TREE_OPERAND (arg1, 1)(*((const_cast<tree*> (tree_operand_check ((arg1), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3451, __FUNCTION__))))), flags) |
3452 | && operand_equal_p (TREE_OPERAND (arg0, 1)(*((const_cast<tree*> (tree_operand_check ((arg0), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3452, __FUNCTION__))))), |
3453 | TREE_OPERAND (arg1, 0)(*((const_cast<tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3453, __FUNCTION__))))), flags)); |
3454 | |
3455 | case COND_EXPR: |
3456 | if (! OP_SAME (1) || ! OP_SAME_WITH_NULL (2)) |
3457 | return false; |
3458 | flags &= ~OEP_ADDRESS_OF; |
3459 | return OP_SAME (0); |
3460 | |
3461 | case BIT_INSERT_EXPR: |
3462 | /* BIT_INSERT_EXPR has an implict operand as the type precision |
3463 | of op1. Need to check to make sure they are the same. */ |
3464 | if (TREE_CODE (TREE_OPERAND (arg0, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((arg0), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3464, __FUNCTION__))))))->base.code) == INTEGER_CST |
3465 | && TREE_CODE (TREE_OPERAND (arg1, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((arg1), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3465, __FUNCTION__))))))->base.code) == INTEGER_CST |
3466 | && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 1)))((tree_class_check ((((contains_struct_check (((*((const_cast <tree*> (tree_operand_check ((arg0), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3466, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3466, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3466, __FUNCTION__))->type_common.precision) |
3467 | != TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 1)))((tree_class_check ((((contains_struct_check (((*((const_cast <tree*> (tree_operand_check ((arg1), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3467, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3467, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3467, __FUNCTION__))->type_common.precision)) |
3468 | return false; |
3469 | /* FALLTHRU */ |
3470 | |
3471 | case VEC_COND_EXPR: |
3472 | case DOT_PROD_EXPR: |
3473 | return OP_SAME (0) && OP_SAME (1) && OP_SAME (2); |
3474 | |
3475 | case MODIFY_EXPR: |
3476 | case INIT_EXPR: |
3477 | case COMPOUND_EXPR: |
3478 | case PREDECREMENT_EXPR: |
3479 | case PREINCREMENT_EXPR: |
3480 | case POSTDECREMENT_EXPR: |
3481 | case POSTINCREMENT_EXPR: |
3482 | if (flags & OEP_LEXICOGRAPHIC) |
3483 | return OP_SAME (0) && OP_SAME (1); |
3484 | return false; |
3485 | |
3486 | case CLEANUP_POINT_EXPR: |
3487 | case EXPR_STMT: |
3488 | case SAVE_EXPR: |
3489 | if (flags & OEP_LEXICOGRAPHIC) |
3490 | return OP_SAME (0); |
3491 | return false; |
3492 | |
3493 | case OBJ_TYPE_REF: |
3494 | /* Virtual table reference. */ |
3495 | if (!operand_equal_p (OBJ_TYPE_REF_EXPR (arg0)(*((const_cast<tree*> (tree_operand_check (((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3495, __FUNCTION__, (OBJ_TYPE_REF)))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3495, __FUNCTION__))))), |
3496 | OBJ_TYPE_REF_EXPR (arg1)(*((const_cast<tree*> (tree_operand_check (((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3496, __FUNCTION__, (OBJ_TYPE_REF)))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3496, __FUNCTION__))))), flags)) |
3497 | return false; |
3498 | flags &= ~OEP_ADDRESS_OF; |
3499 | if (tree_to_uhwi (OBJ_TYPE_REF_TOKEN (arg0)(*((const_cast<tree*> (tree_operand_check (((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3499, __FUNCTION__, (OBJ_TYPE_REF)))), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3499, __FUNCTION__)))))) |
3500 | != tree_to_uhwi (OBJ_TYPE_REF_TOKEN (arg1)(*((const_cast<tree*> (tree_operand_check (((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3500, __FUNCTION__, (OBJ_TYPE_REF)))), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3500, __FUNCTION__))))))) |
3501 | return false; |
3502 | if (!operand_equal_p (OBJ_TYPE_REF_OBJECT (arg0)(*((const_cast<tree*> (tree_operand_check (((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3502, __FUNCTION__, (OBJ_TYPE_REF)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3502, __FUNCTION__))))), |
3503 | OBJ_TYPE_REF_OBJECT (arg1)(*((const_cast<tree*> (tree_operand_check (((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3503, __FUNCTION__, (OBJ_TYPE_REF)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3503, __FUNCTION__))))), flags)) |
3504 | return false; |
3505 | if (virtual_method_call_p (arg0)) |
3506 | { |
3507 | if (!virtual_method_call_p (arg1)) |
3508 | return false; |
3509 | return types_same_for_odr (obj_type_ref_class (arg0), |
3510 | obj_type_ref_class (arg1)); |
3511 | } |
3512 | return false; |
3513 | |
3514 | default: |
3515 | return false; |
3516 | } |
3517 | |
3518 | case tcc_vl_exp: |
3519 | switch (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code)) |
3520 | { |
3521 | case CALL_EXPR: |
3522 | if ((CALL_EXPR_FN (arg0)(*((const_cast<tree*> (tree_operand_check (((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3522, __FUNCTION__, (CALL_EXPR)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3522, __FUNCTION__))))) == NULL_TREE(tree) __null) |
3523 | != (CALL_EXPR_FN (arg1)(*((const_cast<tree*> (tree_operand_check (((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3523, __FUNCTION__, (CALL_EXPR)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3523, __FUNCTION__))))) == NULL_TREE(tree) __null)) |
3524 | /* If not both CALL_EXPRs are either internal or normal function |
3525 | functions, then they are not equal. */ |
3526 | return false; |
3527 | else if (CALL_EXPR_FN (arg0)(*((const_cast<tree*> (tree_operand_check (((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3527, __FUNCTION__, (CALL_EXPR)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3527, __FUNCTION__))))) == NULL_TREE(tree) __null) |
3528 | { |
3529 | /* If the CALL_EXPRs call different internal functions, then they |
3530 | are not equal. */ |
3531 | if (CALL_EXPR_IFN (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3531, __FUNCTION__, (CALL_EXPR)))->base.u.ifn) != CALL_EXPR_IFN (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3531, __FUNCTION__, (CALL_EXPR)))->base.u.ifn)) |
3532 | return false; |
3533 | } |
3534 | else |
3535 | { |
3536 | /* If the CALL_EXPRs call different functions, then they are not |
3537 | equal. */ |
3538 | if (! operand_equal_p (CALL_EXPR_FN (arg0)(*((const_cast<tree*> (tree_operand_check (((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3538, __FUNCTION__, (CALL_EXPR)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3538, __FUNCTION__))))), CALL_EXPR_FN (arg1)(*((const_cast<tree*> (tree_operand_check (((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3538, __FUNCTION__, (CALL_EXPR)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3538, __FUNCTION__))))), |
3539 | flags)) |
3540 | return false; |
3541 | } |
3542 | |
3543 | /* FIXME: We could skip this test for OEP_MATCH_SIDE_EFFECTS. */ |
3544 | { |
3545 | unsigned int cef = call_expr_flags (arg0); |
3546 | if (flags & OEP_PURE_SAME) |
3547 | cef &= ECF_CONST(1 << 0) | ECF_PURE(1 << 1); |
3548 | else |
3549 | cef &= ECF_CONST(1 << 0); |
3550 | if (!cef && !(flags & OEP_LEXICOGRAPHIC)) |
3551 | return false; |
3552 | } |
3553 | |
3554 | /* Now see if all the arguments are the same. */ |
3555 | { |
3556 | const_call_expr_arg_iterator iter0, iter1; |
3557 | const_tree a0, a1; |
3558 | for (a0 = first_const_call_expr_arg (arg0, &iter0), |
3559 | a1 = first_const_call_expr_arg (arg1, &iter1); |
3560 | a0 && a1; |
3561 | a0 = next_const_call_expr_arg (&iter0), |
3562 | a1 = next_const_call_expr_arg (&iter1)) |
3563 | if (! operand_equal_p (a0, a1, flags)) |
3564 | return false; |
3565 | |
3566 | /* If we get here and both argument lists are exhausted |
3567 | then the CALL_EXPRs are equal. */ |
3568 | return ! (a0 || a1); |
3569 | } |
3570 | default: |
3571 | return false; |
3572 | } |
3573 | |
3574 | case tcc_declaration: |
3575 | /* Consider __builtin_sqrt equal to sqrt. */ |
3576 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == FUNCTION_DECL) |
3577 | return (fndecl_built_in_p (arg0) && fndecl_built_in_p (arg1) |
3578 | && DECL_BUILT_IN_CLASS (arg0)((built_in_class) (tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3578, __FUNCTION__, (FUNCTION_DECL)))->function_decl.built_in_class ) == DECL_BUILT_IN_CLASS (arg1)((built_in_class) (tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3578, __FUNCTION__, (FUNCTION_DECL)))->function_decl.built_in_class ) |
3579 | && (DECL_UNCHECKED_FUNCTION_CODE (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3579, __FUNCTION__, (FUNCTION_DECL)))->function_decl.function_code ) |
3580 | == DECL_UNCHECKED_FUNCTION_CODE (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3580, __FUNCTION__, (FUNCTION_DECL)))->function_decl.function_code ))); |
3581 | |
3582 | if (DECL_P (arg0)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (arg0)->base.code))] == tcc_declaration) |
3583 | && (flags & OEP_DECL_NAME) |
3584 | && (flags & OEP_LEXICOGRAPHIC)) |
3585 | { |
3586 | /* Consider decls with the same name equal. The caller needs |
3587 | to make sure they refer to the same entity (such as a function |
3588 | formal parameter). */ |
3589 | tree a0name = DECL_NAME (arg0)((contains_struct_check ((arg0), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3589, __FUNCTION__))->decl_minimal.name); |
3590 | tree a1name = DECL_NAME (arg1)((contains_struct_check ((arg1), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3590, __FUNCTION__))->decl_minimal.name); |
3591 | const char *a0ns = a0name ? IDENTIFIER_POINTER (a0name)((const char *) (tree_check ((a0name), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3591, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str ) : NULL__null; |
3592 | const char *a1ns = a1name ? IDENTIFIER_POINTER (a1name)((const char *) (tree_check ((a1name), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3592, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str ) : NULL__null; |
3593 | return a0ns && a1ns && strcmp (a0ns, a1ns) == 0; |
3594 | } |
3595 | return false; |
3596 | |
3597 | case tcc_exceptional: |
3598 | if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == CONSTRUCTOR) |
3599 | { |
3600 | if (CONSTRUCTOR_NO_CLEARING (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3600, __FUNCTION__, (CONSTRUCTOR)))->base.public_flag) != CONSTRUCTOR_NO_CLEARING (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3600, __FUNCTION__, (CONSTRUCTOR)))->base.public_flag)) |
3601 | return false; |
3602 | |
3603 | /* In GIMPLE constructors are used only to build vectors from |
3604 | elements. Individual elements in the constructor must be |
3605 | indexed in increasing order and form an initial sequence. |
3606 | |
3607 | We make no effort to compare constructors in generic. |
3608 | (see sem_variable::equals in ipa-icf which can do so for |
3609 | constants). */ |
3610 | if (!VECTOR_TYPE_P (TREE_TYPE (arg0))(((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3610, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE ) |
3611 | || !VECTOR_TYPE_P (TREE_TYPE (arg1))(((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3611, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE )) |
3612 | return false; |
3613 | |
3614 | /* Be sure that vectors constructed have the same representation. |
3615 | We only tested element precision and modes to match. |
3616 | Vectors may be BLKmode and thus also check that the number of |
3617 | parts match. */ |
3618 | if (maybe_ne (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)((contains_struct_check ((arg0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3618, __FUNCTION__))->typed.type)), |
3619 | TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)((contains_struct_check ((arg1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3619, __FUNCTION__))->typed.type)))) |
3620 | return false; |
3621 | |
3622 | vec<constructor_elt, va_gc> *v0 = CONSTRUCTOR_ELTS (arg0)((tree_check ((arg0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3622, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts); |
3623 | vec<constructor_elt, va_gc> *v1 = CONSTRUCTOR_ELTS (arg1)((tree_check ((arg1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3623, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts); |
3624 | unsigned int len = vec_safe_length (v0); |
3625 | |
3626 | if (len != vec_safe_length (v1)) |
3627 | return false; |
3628 | |
3629 | for (unsigned int i = 0; i < len; i++) |
3630 | { |
3631 | constructor_elt *c0 = &(*v0)[i]; |
3632 | constructor_elt *c1 = &(*v1)[i]; |
3633 | |
3634 | if (!operand_equal_p (c0->value, c1->value, flags) |
3635 | /* In GIMPLE the indexes can be either NULL or matching i. |
3636 | Double check this so we won't get false |
3637 | positives for GENERIC. */ |
3638 | || (c0->index |
3639 | && (TREE_CODE (c0->index)((enum tree_code) (c0->index)->base.code) != INTEGER_CST |
3640 | || compare_tree_int (c0->index, i))) |
3641 | || (c1->index |
3642 | && (TREE_CODE (c1->index)((enum tree_code) (c1->index)->base.code) != INTEGER_CST |
3643 | || compare_tree_int (c1->index, i)))) |
3644 | return false; |
3645 | } |
3646 | return true; |
3647 | } |
3648 | else if (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code) == STATEMENT_LIST |
3649 | && (flags & OEP_LEXICOGRAPHIC)) |
3650 | { |
3651 | /* Compare the STATEMENT_LISTs. */ |
3652 | tree_stmt_iterator tsi1, tsi2; |
3653 | tree body1 = CONST_CAST_TREE (arg0)(const_cast<union tree_node *> (((arg0)))); |
3654 | tree body2 = CONST_CAST_TREE (arg1)(const_cast<union tree_node *> (((arg1)))); |
3655 | for (tsi1 = tsi_start (body1), tsi2 = tsi_start (body2); ; |
3656 | tsi_next (&tsi1), tsi_next (&tsi2)) |
3657 | { |
3658 | /* The lists don't have the same number of statements. */ |
3659 | if (tsi_end_p (tsi1) ^ tsi_end_p (tsi2)) |
3660 | return false; |
3661 | if (tsi_end_p (tsi1) && tsi_end_p (tsi2)) |
3662 | return true; |
3663 | if (!operand_equal_p (tsi_stmt (tsi1), tsi_stmt (tsi2), |
3664 | flags & (OEP_LEXICOGRAPHIC |
3665 | | OEP_NO_HASH_CHECK))) |
3666 | return false; |
3667 | } |
3668 | } |
3669 | return false; |
3670 | |
3671 | case tcc_statement: |
3672 | switch (TREE_CODE (arg0)((enum tree_code) (arg0)->base.code)) |
3673 | { |
3674 | case RETURN_EXPR: |
3675 | if (flags & OEP_LEXICOGRAPHIC) |
3676 | return OP_SAME_WITH_NULL (0); |
3677 | return false; |
3678 | case DEBUG_BEGIN_STMT: |
3679 | if (flags & OEP_LEXICOGRAPHIC) |
3680 | return true; |
3681 | return false; |
3682 | default: |
3683 | return false; |
3684 | } |
3685 | |
3686 | default: |
3687 | return false; |
3688 | } |
3689 | |
3690 | #undef OP_SAME |
3691 | #undef OP_SAME_WITH_NULL |
3692 | } |
3693 | |
3694 | /* Generate a hash value for an expression. This can be used iteratively |
3695 | by passing a previous result as the HSTATE argument. */ |
3696 | |
3697 | void |
3698 | operand_compare::hash_operand (const_tree t, inchash::hash &hstate, |
3699 | unsigned int flags) |
3700 | { |
3701 | int i; |
3702 | enum tree_code code; |
3703 | enum tree_code_class tclass; |
3704 | |
3705 | if (t == NULL_TREE(tree) __null || t == error_mark_nodeglobal_trees[TI_ERROR_MARK]) |
3706 | { |
3707 | hstate.merge_hash (0); |
3708 | return; |
3709 | } |
3710 | |
3711 | STRIP_ANY_LOCATION_WRAPPER (t)(t) = tree_strip_any_location_wrapper ((const_cast<union tree_node *> (((t))))); |
3712 | |
3713 | if (!(flags & OEP_ADDRESS_OF)) |
3714 | STRIP_NOPS (t)(t) = tree_strip_nop_conversions ((const_cast<union tree_node *> (((t))))); |
3715 | |
3716 | code = TREE_CODE (t)((enum tree_code) (t)->base.code); |
3717 | |
3718 | switch (code) |
3719 | { |
3720 | /* Alas, constants aren't shared, so we can't rely on pointer |
3721 | identity. */ |
3722 | case VOID_CST: |
3723 | hstate.merge_hash (0); |
3724 | return; |
3725 | case INTEGER_CST: |
3726 | gcc_checking_assert (!(flags & OEP_ADDRESS_OF))((void)(!(!(flags & OEP_ADDRESS_OF)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3726, __FUNCTION__), 0 : 0)); |
3727 | for (i = 0; i < TREE_INT_CST_EXT_NUNITS (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3727, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.extended ); i++) |
3728 | hstate.add_hwi (TREE_INT_CST_ELT (t, i)(*tree_int_cst_elt_check ((t), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3728, __FUNCTION__))); |
3729 | return; |
3730 | case REAL_CST: |
3731 | { |
3732 | unsigned int val2; |
3733 | if (!HONOR_SIGNED_ZEROS (t) && real_zerop (t)) |
3734 | val2 = rvc_zero; |
3735 | else |
3736 | val2 = real_hash (TREE_REAL_CST_PTR (t)(&(tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3736, __FUNCTION__, (REAL_CST)))->real_cst.value)); |
3737 | hstate.merge_hash (val2); |
3738 | return; |
3739 | } |
3740 | case FIXED_CST: |
3741 | { |
3742 | unsigned int val2 = fixed_hash (TREE_FIXED_CST_PTR (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3742, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr )); |
3743 | hstate.merge_hash (val2); |
3744 | return; |
3745 | } |
3746 | case STRING_CST: |
3747 | hstate.add ((const void *) TREE_STRING_POINTER (t)((const char *)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3747, __FUNCTION__, (STRING_CST)))->string.str)), |
3748 | TREE_STRING_LENGTH (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3748, __FUNCTION__, (STRING_CST)))->string.length)); |
3749 | return; |
3750 | case COMPLEX_CST: |
3751 | hash_operand (TREE_REALPART (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3751, __FUNCTION__, (COMPLEX_CST)))->complex.real), hstate, flags); |
3752 | hash_operand (TREE_IMAGPART (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3752, __FUNCTION__, (COMPLEX_CST)))->complex.imag), hstate, flags); |
3753 | return; |
3754 | case VECTOR_CST: |
3755 | { |
3756 | hstate.add_int (VECTOR_CST_NPATTERNS (t)(1U << ((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3756, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.log2_npatterns ))); |
3757 | hstate.add_int (VECTOR_CST_NELTS_PER_PATTERN (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3757, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern )); |
3758 | unsigned int count = vector_cst_encoded_nelts (t); |
3759 | for (unsigned int i = 0; i < count; ++i) |
3760 | hash_operand (VECTOR_CST_ENCODED_ELT (t, i)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3760, __FUNCTION__, (VECTOR_CST)))->vector.elts[i]), hstate, flags); |
3761 | return; |
3762 | } |
3763 | case SSA_NAME: |
3764 | /* We can just compare by pointer. */ |
3765 | hstate.add_hwi (SSA_NAME_VERSION (t)(tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3765, __FUNCTION__, (SSA_NAME)))->base.u.version); |
3766 | return; |
3767 | case PLACEHOLDER_EXPR: |
3768 | /* The node itself doesn't matter. */ |
3769 | return; |
3770 | case BLOCK: |
3771 | case OMP_CLAUSE: |
3772 | /* Ignore. */ |
3773 | return; |
3774 | case TREE_LIST: |
3775 | /* A list of expressions, for a CALL_EXPR or as the elements of a |
3776 | VECTOR_CST. */ |
3777 | for (; t; t = TREE_CHAIN (t)((contains_struct_check ((t), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3777, __FUNCTION__))->common.chain)) |
3778 | hash_operand (TREE_VALUE (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3778, __FUNCTION__, (TREE_LIST)))->list.value), hstate, flags); |
3779 | return; |
3780 | case CONSTRUCTOR: |
3781 | { |
3782 | unsigned HOST_WIDE_INTlong idx; |
3783 | tree field, value; |
3784 | flags &= ~OEP_ADDRESS_OF; |
3785 | hstate.add_int (CONSTRUCTOR_NO_CLEARING (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3785, __FUNCTION__, (CONSTRUCTOR)))->base.public_flag)); |
3786 | FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), idx, field, value)for (idx = 0; (idx >= vec_safe_length (((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3786, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts))) ? false : (((void) (value = (*((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3786, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts))[ idx].value)), (field = (*((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3786, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts))[ idx].index), true); (idx)++) |
3787 | { |
3788 | /* In GIMPLE the indexes can be either NULL or matching i. */ |
3789 | if (field == NULL_TREE(tree) __null) |
3790 | field = bitsize_int (idx)size_int_kind (idx, stk_bitsizetype); |
3791 | hash_operand (field, hstate, flags); |
3792 | hash_operand (value, hstate, flags); |
3793 | } |
3794 | return; |
3795 | } |
3796 | case STATEMENT_LIST: |
3797 | { |
3798 | tree_stmt_iterator i; |
3799 | for (i = tsi_start (CONST_CAST_TREE (t)(const_cast<union tree_node *> (((t))))); |
3800 | !tsi_end_p (i); tsi_next (&i)) |
3801 | hash_operand (tsi_stmt (i), hstate, flags); |
3802 | return; |
3803 | } |
3804 | case TREE_VEC: |
3805 | for (i = 0; i < TREE_VEC_LENGTH (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3805, __FUNCTION__, (TREE_VEC)))->base.u.length); ++i) |
3806 | hash_operand (TREE_VEC_ELT (t, i)(*((const_cast<tree *> (tree_vec_elt_check ((t), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3806, __FUNCTION__))))), hstate, flags); |
3807 | return; |
3808 | case IDENTIFIER_NODE: |
3809 | hstate.add_object (IDENTIFIER_HASH_VALUE (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3809, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.hash_value )); |
3810 | return; |
3811 | case FUNCTION_DECL: |
3812 | /* When referring to a built-in FUNCTION_DECL, use the __builtin__ form. |
3813 | Otherwise nodes that compare equal according to operand_equal_p might |
3814 | get different hash codes. However, don't do this for machine specific |
3815 | or front end builtins, since the function code is overloaded in those |
3816 | cases. */ |
3817 | if (DECL_BUILT_IN_CLASS (t)((built_in_class) (tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3817, __FUNCTION__, (FUNCTION_DECL)))->function_decl.built_in_class ) == BUILT_IN_NORMAL |
3818 | && builtin_decl_explicit_p (DECL_FUNCTION_CODE (t))) |
3819 | { |
3820 | t = builtin_decl_explicit (DECL_FUNCTION_CODE (t)); |
3821 | code = TREE_CODE (t)((enum tree_code) (t)->base.code); |
3822 | } |
3823 | /* FALL THROUGH */ |
3824 | default: |
3825 | if (POLY_INT_CST_P (t)(1 > 1 && ((enum tree_code) (t)->base.code) == POLY_INT_CST )) |
3826 | { |
3827 | for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS1; ++i) |
3828 | hstate.add_wide_int (wi::to_wide (POLY_INT_CST_COEFF (t, i)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3828, __FUNCTION__, (POLY_INT_CST)))->poly_int_cst.coeffs [i]))); |
3829 | return; |
3830 | } |
3831 | tclass = TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)]; |
3832 | |
3833 | if (tclass == tcc_declaration) |
3834 | { |
3835 | /* DECL's have a unique ID */ |
3836 | hstate.add_hwi (DECL_UID (t)((contains_struct_check ((t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3836, __FUNCTION__))->decl_minimal.uid)); |
3837 | } |
3838 | else if (tclass == tcc_comparison && !commutative_tree_code (code)) |
3839 | { |
3840 | /* For comparisons that can be swapped, use the lower |
3841 | tree code. */ |
3842 | enum tree_code ccode = swap_tree_comparison (code); |
3843 | if (code < ccode) |
3844 | ccode = code; |
3845 | hstate.add_object (ccode); |
3846 | hash_operand (TREE_OPERAND (t, ccode != code)(*((const_cast<tree*> (tree_operand_check ((t), (ccode != code), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3846, __FUNCTION__))))), hstate, flags); |
3847 | hash_operand (TREE_OPERAND (t, ccode == code)(*((const_cast<tree*> (tree_operand_check ((t), (ccode == code), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3847, __FUNCTION__))))), hstate, flags); |
3848 | } |
3849 | else if (CONVERT_EXPR_CODE_P (code)((code) == NOP_EXPR || (code) == CONVERT_EXPR)) |
3850 | { |
3851 | /* NOP_EXPR and CONVERT_EXPR are considered equal by |
3852 | operand_equal_p. */ |
3853 | enum tree_code ccode = NOP_EXPR; |
3854 | hstate.add_object (ccode); |
3855 | |
3856 | /* Don't hash the type, that can lead to having nodes which |
3857 | compare equal according to operand_equal_p, but which |
3858 | have different hash codes. Make sure to include signedness |
3859 | in the hash computation. */ |
3860 | hstate.add_int (TYPE_UNSIGNED (TREE_TYPE (t))((tree_class_check ((((contains_struct_check ((t), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3860, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3860, __FUNCTION__))->base.u.bits.unsigned_flag)); |
3861 | hash_operand (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3861, __FUNCTION__))))), hstate, flags); |
3862 | } |
3863 | /* For OEP_ADDRESS_OF, hash MEM_EXPR[&decl, 0] the same as decl. */ |
3864 | else if (code == MEM_REF |
3865 | && (flags & OEP_ADDRESS_OF) != 0 |
3866 | && TREE_CODE (TREE_OPERAND (t, 0))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3866, __FUNCTION__))))))->base.code) == ADDR_EXPR |
3867 | && DECL_P (TREE_OPERAND (TREE_OPERAND (t, 0), 0))(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) ((*((const_cast<tree*> (tree_operand_check (((*((const_cast <tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3867, __FUNCTION__)))))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3867, __FUNCTION__))))))->base.code))] == tcc_declaration ) |
3868 | && integer_zerop (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3868, __FUNCTION__))))))) |
3869 | hash_operand (TREE_OPERAND (TREE_OPERAND (t, 0), 0)(*((const_cast<tree*> (tree_operand_check (((*((const_cast <tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3869, __FUNCTION__)))))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3869, __FUNCTION__))))), |
3870 | hstate, flags); |
3871 | /* Don't ICE on FE specific trees, or their arguments etc. |
3872 | during operand_equal_p hash verification. */ |
3873 | else if (!IS_EXPR_CODE_CLASS (tclass)((tclass) >= tcc_reference && (tclass) <= tcc_expression )) |
3874 | gcc_assert (flags & OEP_HASH_CHECK)((void)(!(flags & OEP_HASH_CHECK) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3874, __FUNCTION__), 0 : 0)); |
3875 | else |
3876 | { |
3877 | unsigned int sflags = flags; |
3878 | |
3879 | hstate.add_object (code); |
3880 | |
3881 | switch (code) |
3882 | { |
3883 | case ADDR_EXPR: |
3884 | gcc_checking_assert (!(flags & OEP_ADDRESS_OF))((void)(!(!(flags & OEP_ADDRESS_OF)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3884, __FUNCTION__), 0 : 0)); |
3885 | flags |= OEP_ADDRESS_OF; |
3886 | sflags = flags; |
3887 | break; |
3888 | |
3889 | case INDIRECT_REF: |
3890 | case MEM_REF: |
3891 | case TARGET_MEM_REF: |
3892 | flags &= ~OEP_ADDRESS_OF; |
3893 | sflags = flags; |
3894 | break; |
3895 | |
3896 | case COMPONENT_REF: |
3897 | if (sflags & OEP_ADDRESS_OF) |
3898 | { |
3899 | hash_operand (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3899, __FUNCTION__))))), hstate, flags); |
3900 | hash_operand (DECL_FIELD_OFFSET (TREE_OPERAND (t, 1))((tree_check (((*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3900, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3900, __FUNCTION__, (FIELD_DECL)))->field_decl.offset), |
3901 | hstate, flags & ~OEP_ADDRESS_OF); |
3902 | hash_operand (DECL_FIELD_BIT_OFFSET (TREE_OPERAND (t, 1))((tree_check (((*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3902, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3902, __FUNCTION__, (FIELD_DECL)))->field_decl.bit_offset ), |
3903 | hstate, flags & ~OEP_ADDRESS_OF); |
3904 | return; |
3905 | } |
3906 | break; |
3907 | case ARRAY_REF: |
3908 | case ARRAY_RANGE_REF: |
3909 | case BIT_FIELD_REF: |
3910 | sflags &= ~OEP_ADDRESS_OF; |
3911 | break; |
3912 | |
3913 | case COND_EXPR: |
3914 | flags &= ~OEP_ADDRESS_OF; |
3915 | break; |
3916 | |
3917 | case WIDEN_MULT_PLUS_EXPR: |
3918 | case WIDEN_MULT_MINUS_EXPR: |
3919 | { |
3920 | /* The multiplication operands are commutative. */ |
3921 | inchash::hash one, two; |
3922 | hash_operand (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3922, __FUNCTION__))))), one, flags); |
3923 | hash_operand (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3923, __FUNCTION__))))), two, flags); |
3924 | hstate.add_commutative (one, two); |
3925 | hash_operand (TREE_OPERAND (t, 2)(*((const_cast<tree*> (tree_operand_check ((t), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3925, __FUNCTION__))))), two, flags); |
3926 | return; |
3927 | } |
3928 | |
3929 | case CALL_EXPR: |
3930 | if (CALL_EXPR_FN (t)(*((const_cast<tree*> (tree_operand_check (((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3930, __FUNCTION__, (CALL_EXPR)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3930, __FUNCTION__))))) == NULL_TREE(tree) __null) |
3931 | hstate.add_int (CALL_EXPR_IFN (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3931, __FUNCTION__, (CALL_EXPR)))->base.u.ifn)); |
3932 | break; |
3933 | |
3934 | case TARGET_EXPR: |
3935 | /* For TARGET_EXPR, just hash on the TARGET_EXPR_SLOT. |
3936 | Usually different TARGET_EXPRs just should use |
3937 | different temporaries in their slots. */ |
3938 | hash_operand (TARGET_EXPR_SLOT (t)(*(tree_operand_check_code ((t), (TARGET_EXPR), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3938, __FUNCTION__))), hstate, flags); |
3939 | return; |
3940 | |
3941 | case OBJ_TYPE_REF: |
3942 | /* Virtual table reference. */ |
3943 | inchash::add_expr (OBJ_TYPE_REF_EXPR (t)(*((const_cast<tree*> (tree_operand_check (((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3943, __FUNCTION__, (OBJ_TYPE_REF)))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3943, __FUNCTION__))))), hstate, flags); |
3944 | flags &= ~OEP_ADDRESS_OF; |
3945 | inchash::add_expr (OBJ_TYPE_REF_TOKEN (t)(*((const_cast<tree*> (tree_operand_check (((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3945, __FUNCTION__, (OBJ_TYPE_REF)))), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3945, __FUNCTION__))))), hstate, flags); |
3946 | inchash::add_expr (OBJ_TYPE_REF_OBJECT (t)(*((const_cast<tree*> (tree_operand_check (((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3946, __FUNCTION__, (OBJ_TYPE_REF)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3946, __FUNCTION__))))), hstate, flags); |
3947 | if (!virtual_method_call_p (t)) |
3948 | return; |
3949 | if (tree c = obj_type_ref_class (t)) |
3950 | { |
3951 | c = TYPE_NAME (TYPE_MAIN_VARIANT (c))((tree_class_check ((((tree_class_check ((c), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3951, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3951, __FUNCTION__))->type_common.name); |
3952 | /* We compute mangled names only when free_lang_data is run. |
3953 | In that case we can hash precisely. */ |
3954 | if (TREE_CODE (c)((enum tree_code) (c)->base.code) == TYPE_DECL |
3955 | && DECL_ASSEMBLER_NAME_SET_P (c)(((contains_struct_check ((c), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3955, __FUNCTION__))->decl_with_vis.assembler_name) != ( tree) __null)) |
3956 | hstate.add_object |
3957 | (IDENTIFIER_HASH_VALUE((tree_check ((decl_assembler_name (c)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3958, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.hash_value ) |
3958 | (DECL_ASSEMBLER_NAME (c))((tree_check ((decl_assembler_name (c)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3958, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.hash_value )); |
3959 | } |
3960 | return; |
3961 | default: |
3962 | break; |
3963 | } |
3964 | |
3965 | /* Don't hash the type, that can lead to having nodes which |
3966 | compare equal according to operand_equal_p, but which |
3967 | have different hash codes. */ |
3968 | if (code == NON_LVALUE_EXPR) |
3969 | { |
3970 | /* Make sure to include signness in the hash computation. */ |
3971 | hstate.add_int (TYPE_UNSIGNED (TREE_TYPE (t))((tree_class_check ((((contains_struct_check ((t), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3971, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3971, __FUNCTION__))->base.u.bits.unsigned_flag)); |
3972 | hash_operand (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3972, __FUNCTION__))))), hstate, flags); |
3973 | } |
3974 | |
3975 | else if (commutative_tree_code (code)) |
3976 | { |
3977 | /* It's a commutative expression. We want to hash it the same |
3978 | however it appears. We do this by first hashing both operands |
3979 | and then rehashing based on the order of their independent |
3980 | hashes. */ |
3981 | inchash::hash one, two; |
3982 | hash_operand (TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3982, __FUNCTION__))))), one, flags); |
3983 | hash_operand (TREE_OPERAND (t, 1)(*((const_cast<tree*> (tree_operand_check ((t), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3983, __FUNCTION__))))), two, flags); |
3984 | hstate.add_commutative (one, two); |
3985 | } |
3986 | else |
3987 | for (i = TREE_OPERAND_LENGTH (t)tree_operand_length (t) - 1; i >= 0; --i) |
3988 | hash_operand (TREE_OPERAND (t, i)(*((const_cast<tree*> (tree_operand_check ((t), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 3988, __FUNCTION__))))), hstate, |
3989 | i == 0 ? flags : sflags); |
3990 | } |
3991 | return; |
3992 | } |
3993 | } |
3994 | |
3995 | bool |
3996 | operand_compare::verify_hash_value (const_tree arg0, const_tree arg1, |
3997 | unsigned int flags, bool *ret) |
3998 | { |
3999 | /* When checking and unless comparing DECL names, verify that if |
4000 | the outermost operand_equal_p call returns non-zero then ARG0 |
4001 | and ARG1 have the same hash value. */ |
4002 | if (flag_checkingglobal_options.x_flag_checking && !(flags & OEP_NO_HASH_CHECK)) |
4003 | { |
4004 | if (operand_equal_p (arg0, arg1, flags | OEP_NO_HASH_CHECK)) |
4005 | { |
4006 | if (arg0 != arg1 && !(flags & OEP_DECL_NAME)) |
4007 | { |
4008 | inchash::hash hstate0 (0), hstate1 (0); |
4009 | hash_operand (arg0, hstate0, flags | OEP_HASH_CHECK); |
4010 | hash_operand (arg1, hstate1, flags | OEP_HASH_CHECK); |
4011 | hashval_t h0 = hstate0.end (); |
4012 | hashval_t h1 = hstate1.end (); |
4013 | gcc_assert (h0 == h1)((void)(!(h0 == h1) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4013, __FUNCTION__), 0 : 0)); |
4014 | } |
4015 | *ret = true; |
4016 | } |
4017 | else |
4018 | *ret = false; |
4019 | |
4020 | return true; |
4021 | } |
4022 | |
4023 | return false; |
4024 | } |
4025 | |
4026 | |
4027 | static operand_compare default_compare_instance; |
4028 | |
4029 | /* Conveinece wrapper around operand_compare class because usually we do |
4030 | not need to play with the valueizer. */ |
4031 | |
4032 | bool |
4033 | operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) |
4034 | { |
4035 | return default_compare_instance.operand_equal_p (arg0, arg1, flags); |
4036 | } |
4037 | |
4038 | namespace inchash |
4039 | { |
4040 | |
4041 | /* Generate a hash value for an expression. This can be used iteratively |
4042 | by passing a previous result as the HSTATE argument. |
4043 | |
4044 | This function is intended to produce the same hash for expressions which |
4045 | would compare equal using operand_equal_p. */ |
4046 | void |
4047 | add_expr (const_tree t, inchash::hash &hstate, unsigned int flags) |
4048 | { |
4049 | default_compare_instance.hash_operand (t, hstate, flags); |
4050 | } |
4051 | |
4052 | } |
4053 | |
4054 | /* Similar to operand_equal_p, but see if ARG0 might be a variant of ARG1 |
4055 | with a different signedness or a narrower precision. */ |
4056 | |
4057 | static bool |
4058 | operand_equal_for_comparison_p (tree arg0, tree arg1) |
4059 | { |
4060 | if (operand_equal_p (arg0, arg1, 0)) |
4061 | return true; |
4062 | |
4063 | if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))(((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4063, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4063, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4063, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE ) |
4064 | || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1))(((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4064, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4064, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4064, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE )) |
4065 | return false; |
4066 | |
4067 | /* Discard any conversions that don't change the modes of ARG0 and ARG1 |
4068 | and see if the inner values are the same. This removes any |
4069 | signedness comparison, which doesn't matter here. */ |
4070 | tree op0 = arg0; |
4071 | tree op1 = arg1; |
4072 | STRIP_NOPS (op0)(op0) = tree_strip_nop_conversions ((const_cast<union tree_node *> (((op0))))); |
4073 | STRIP_NOPS (op1)(op1) = tree_strip_nop_conversions ((const_cast<union tree_node *> (((op1))))); |
4074 | if (operand_equal_p (op0, op1, 0)) |
4075 | return true; |
4076 | |
4077 | /* Discard a single widening conversion from ARG1 and see if the inner |
4078 | value is the same as ARG0. */ |
4079 | if (CONVERT_EXPR_P (arg1)((((enum tree_code) (arg1)->base.code)) == NOP_EXPR || ((( enum tree_code) (arg1)->base.code)) == CONVERT_EXPR) |
4080 | && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (arg1, 0)))(((enum tree_code) (((contains_struct_check (((*((const_cast< tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4080, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4080, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check (((*((const_cast <tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4080, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4080, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check (((*((const_cast <tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4080, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4080, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE ) |
4081 | && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0)))((tree_class_check ((((contains_struct_check (((*((const_cast <tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4081, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4081, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4081, __FUNCTION__))->type_common.precision) |
4082 | < TYPE_PRECISION (TREE_TYPE (arg1))((tree_class_check ((((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4082, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4082, __FUNCTION__))->type_common.precision) |
4083 | && operand_equal_p (arg0, TREE_OPERAND (arg1, 0)(*((const_cast<tree*> (tree_operand_check ((arg1), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4083, __FUNCTION__))))), 0)) |
4084 | return true; |
4085 | |
4086 | return false; |
4087 | } |
4088 | |
4089 | /* See if ARG is an expression that is either a comparison or is performing |
4090 | arithmetic on comparisons. The comparisons must only be comparing |
4091 | two different values, which will be stored in *CVAL1 and *CVAL2; if |
4092 | they are nonzero it means that some operands have already been found. |
4093 | No variables may be used anywhere else in the expression except in the |
4094 | comparisons. |
4095 | |
4096 | If this is true, return 1. Otherwise, return zero. */ |
4097 | |
4098 | static bool |
4099 | twoval_comparison_p (tree arg, tree *cval1, tree *cval2) |
4100 | { |
4101 | enum tree_code code = TREE_CODE (arg)((enum tree_code) (arg)->base.code); |
4102 | enum tree_code_class tclass = TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)]; |
4103 | |
4104 | /* We can handle some of the tcc_expression cases here. */ |
4105 | if (tclass == tcc_expression && code == TRUTH_NOT_EXPR) |
4106 | tclass = tcc_unary; |
4107 | else if (tclass == tcc_expression |
4108 | && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR |
4109 | || code == COMPOUND_EXPR)) |
4110 | tclass = tcc_binary; |
4111 | |
4112 | switch (tclass) |
4113 | { |
4114 | case tcc_unary: |
4115 | return twoval_comparison_p (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4115, __FUNCTION__))))), cval1, cval2); |
4116 | |
4117 | case tcc_binary: |
4118 | return (twoval_comparison_p (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4118, __FUNCTION__))))), cval1, cval2) |
4119 | && twoval_comparison_p (TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4119, __FUNCTION__))))), cval1, cval2)); |
4120 | |
4121 | case tcc_constant: |
4122 | return true; |
4123 | |
4124 | case tcc_expression: |
4125 | if (code == COND_EXPR) |
4126 | return (twoval_comparison_p (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4126, __FUNCTION__))))), cval1, cval2) |
4127 | && twoval_comparison_p (TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4127, __FUNCTION__))))), cval1, cval2) |
4128 | && twoval_comparison_p (TREE_OPERAND (arg, 2)(*((const_cast<tree*> (tree_operand_check ((arg), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4128, __FUNCTION__))))), cval1, cval2)); |
4129 | return false; |
4130 | |
4131 | case tcc_comparison: |
4132 | /* First see if we can handle the first operand, then the second. For |
4133 | the second operand, we know *CVAL1 can't be zero. It must be that |
4134 | one side of the comparison is each of the values; test for the |
4135 | case where this isn't true by failing if the two operands |
4136 | are the same. */ |
4137 | |
4138 | if (operand_equal_p (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4138, __FUNCTION__))))), |
4139 | TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4139, __FUNCTION__))))), 0)) |
4140 | return false; |
4141 | |
4142 | if (*cval1 == 0) |
4143 | *cval1 = TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4143, __FUNCTION__))))); |
4144 | else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4144, __FUNCTION__))))), 0)) |
4145 | ; |
4146 | else if (*cval2 == 0) |
4147 | *cval2 = TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4147, __FUNCTION__))))); |
4148 | else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4148, __FUNCTION__))))), 0)) |
4149 | ; |
4150 | else |
4151 | return false; |
4152 | |
4153 | if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4153, __FUNCTION__))))), 0)) |
4154 | ; |
4155 | else if (*cval2 == 0) |
4156 | *cval2 = TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4156, __FUNCTION__))))); |
4157 | else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4157, __FUNCTION__))))), 0)) |
4158 | ; |
4159 | else |
4160 | return false; |
4161 | |
4162 | return true; |
4163 | |
4164 | default: |
4165 | return false; |
4166 | } |
4167 | } |
4168 | |
4169 | /* ARG is a tree that is known to contain just arithmetic operations and |
4170 | comparisons. Evaluate the operations in the tree substituting NEW0 for |
4171 | any occurrence of OLD0 as an operand of a comparison and likewise for |
4172 | NEW1 and OLD1. */ |
4173 | |
4174 | static tree |
4175 | eval_subst (location_t loc, tree arg, tree old0, tree new0, |
4176 | tree old1, tree new1) |
4177 | { |
4178 | tree type = TREE_TYPE (arg)((contains_struct_check ((arg), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4178, __FUNCTION__))->typed.type); |
4179 | enum tree_code code = TREE_CODE (arg)((enum tree_code) (arg)->base.code); |
4180 | enum tree_code_class tclass = TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)]; |
4181 | |
4182 | /* We can handle some of the tcc_expression cases here. */ |
4183 | if (tclass == tcc_expression && code == TRUTH_NOT_EXPR) |
4184 | tclass = tcc_unary; |
4185 | else if (tclass == tcc_expression |
4186 | && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)) |
4187 | tclass = tcc_binary; |
4188 | |
4189 | switch (tclass) |
4190 | { |
4191 | case tcc_unary: |
4192 | return fold_build1_loc (loc, code, type, |
4193 | eval_subst (loc, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4193, __FUNCTION__))))), |
4194 | old0, new0, old1, new1)); |
4195 | |
4196 | case tcc_binary: |
4197 | return fold_build2_loc (loc, code, type, |
4198 | eval_subst (loc, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4198, __FUNCTION__))))), |
4199 | old0, new0, old1, new1), |
4200 | eval_subst (loc, TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4200, __FUNCTION__))))), |
4201 | old0, new0, old1, new1)); |
4202 | |
4203 | case tcc_expression: |
4204 | switch (code) |
4205 | { |
4206 | case SAVE_EXPR: |
4207 | return eval_subst (loc, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4207, __FUNCTION__))))), old0, new0, |
4208 | old1, new1); |
4209 | |
4210 | case COMPOUND_EXPR: |
4211 | return eval_subst (loc, TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4211, __FUNCTION__))))), old0, new0, |
4212 | old1, new1); |
4213 | |
4214 | case COND_EXPR: |
4215 | return fold_build3_loc (loc, code, type, |
4216 | eval_subst (loc, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4216, __FUNCTION__))))), |
4217 | old0, new0, old1, new1), |
4218 | eval_subst (loc, TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4218, __FUNCTION__))))), |
4219 | old0, new0, old1, new1), |
4220 | eval_subst (loc, TREE_OPERAND (arg, 2)(*((const_cast<tree*> (tree_operand_check ((arg), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4220, __FUNCTION__))))), |
4221 | old0, new0, old1, new1)); |
4222 | default: |
4223 | break; |
4224 | } |
4225 | /* Fall through - ??? */ |
4226 | |
4227 | case tcc_comparison: |
4228 | { |
4229 | tree arg0 = TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4229, __FUNCTION__))))); |
4230 | tree arg1 = TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4230, __FUNCTION__))))); |
4231 | |
4232 | /* We need to check both for exact equality and tree equality. The |
4233 | former will be true if the operand has a side-effect. In that |
4234 | case, we know the operand occurred exactly once. */ |
4235 | |
4236 | if (arg0 == old0 || operand_equal_p (arg0, old0, 0)) |
4237 | arg0 = new0; |
4238 | else if (arg0 == old1 || operand_equal_p (arg0, old1, 0)) |
4239 | arg0 = new1; |
4240 | |
4241 | if (arg1 == old0 || operand_equal_p (arg1, old0, 0)) |
4242 | arg1 = new0; |
4243 | else if (arg1 == old1 || operand_equal_p (arg1, old1, 0)) |
4244 | arg1 = new1; |
4245 | |
4246 | return fold_build2_loc (loc, code, type, arg0, arg1); |
4247 | } |
4248 | |
4249 | default: |
4250 | return arg; |
4251 | } |
4252 | } |
4253 | |
4254 | /* Return a tree for the case when the result of an expression is RESULT |
4255 | converted to TYPE and OMITTED was previously an operand of the expression |
4256 | but is now not needed (e.g., we folded OMITTED * 0). |
4257 | |
4258 | If OMITTED has side effects, we must evaluate it. Otherwise, just do |
4259 | the conversion of RESULT to TYPE. */ |
4260 | |
4261 | tree |
4262 | omit_one_operand_loc (location_t loc, tree type, tree result, tree omitted) |
4263 | { |
4264 | tree t = fold_convert_loc (loc, type, result); |
4265 | |
4266 | /* If the resulting operand is an empty statement, just return the omitted |
4267 | statement casted to void. */ |
4268 | if (IS_EMPTY_STMT (t)(((enum tree_code) (t)->base.code) == NOP_EXPR && ( ((enum tree_code) (((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4268, __FUNCTION__))->typed.type))->base.code) == VOID_TYPE ) && integer_zerop ((*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4268, __FUNCTION__))))))) && TREE_SIDE_EFFECTS (omitted)((non_type_check ((omitted), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4268, __FUNCTION__))->base.side_effects_flag)) |
4269 | return build1_loc (loc, NOP_EXPR, void_type_nodeglobal_trees[TI_VOID_TYPE], |
4270 | fold_ignored_result (omitted)); |
4271 | |
4272 | if (TREE_SIDE_EFFECTS (omitted)((non_type_check ((omitted), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4272, __FUNCTION__))->base.side_effects_flag)) |
4273 | return build2_loc (loc, COMPOUND_EXPR, type, |
4274 | fold_ignored_result (omitted), t); |
4275 | |
4276 | return non_lvalue_loc (loc, t); |
4277 | } |
4278 | |
4279 | /* Return a tree for the case when the result of an expression is RESULT |
4280 | converted to TYPE and OMITTED1 and OMITTED2 were previously operands |
4281 | of the expression but are now not needed. |
4282 | |
4283 | If OMITTED1 or OMITTED2 has side effects, they must be evaluated. |
4284 | If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is |
4285 | evaluated before OMITTED2. Otherwise, if neither has side effects, |
4286 | just do the conversion of RESULT to TYPE. */ |
4287 | |
4288 | tree |
4289 | omit_two_operands_loc (location_t loc, tree type, tree result, |
4290 | tree omitted1, tree omitted2) |
4291 | { |
4292 | tree t = fold_convert_loc (loc, type, result); |
4293 | |
4294 | if (TREE_SIDE_EFFECTS (omitted2)((non_type_check ((omitted2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4294, __FUNCTION__))->base.side_effects_flag)) |
4295 | t = build2_loc (loc, COMPOUND_EXPR, type, omitted2, t); |
4296 | if (TREE_SIDE_EFFECTS (omitted1)((non_type_check ((omitted1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4296, __FUNCTION__))->base.side_effects_flag)) |
4297 | t = build2_loc (loc, COMPOUND_EXPR, type, omitted1, t); |
4298 | |
4299 | return TREE_CODE (t)((enum tree_code) (t)->base.code) != COMPOUND_EXPR ? non_lvalue_loc (loc, t) : t; |
4300 | } |
4301 | |
4302 | |
4303 | /* Return a simplified tree node for the truth-negation of ARG. This |
4304 | never alters ARG itself. We assume that ARG is an operation that |
4305 | returns a truth value (0 or 1). |
4306 | |
4307 | FIXME: one would think we would fold the result, but it causes |
4308 | problems with the dominator optimizer. */ |
4309 | |
4310 | static tree |
4311 | fold_truth_not_expr (location_t loc, tree arg) |
4312 | { |
4313 | tree type = TREE_TYPE (arg)((contains_struct_check ((arg), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4313, __FUNCTION__))->typed.type); |
4314 | enum tree_code code = TREE_CODE (arg)((enum tree_code) (arg)->base.code); |
4315 | location_t loc1, loc2; |
4316 | |
4317 | /* If this is a comparison, we can simply invert it, except for |
4318 | floating-point non-equality comparisons, in which case we just |
4319 | enclose a TRUTH_NOT_EXPR around what we have. */ |
4320 | |
4321 | if (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_comparison) |
4322 | { |
4323 | tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0))((contains_struct_check (((*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4323, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4323, __FUNCTION__))->typed.type); |
4324 | if (FLOAT_TYPE_P (op_type)((((enum tree_code) (op_type)->base.code) == REAL_TYPE) || ((((enum tree_code) (op_type)->base.code) == COMPLEX_TYPE || (((enum tree_code) (op_type)->base.code) == VECTOR_TYPE )) && (((enum tree_code) (((contains_struct_check ((op_type ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4324, __FUNCTION__))->typed.type))->base.code) == REAL_TYPE ))) |
4325 | && flag_trapping_mathglobal_options.x_flag_trapping_math |
4326 | && code != ORDERED_EXPR && code != UNORDERED_EXPR |
4327 | && code != NE_EXPR && code != EQ_EXPR) |
4328 | return NULL_TREE(tree) __null; |
4329 | |
4330 | code = invert_tree_comparison (code, HONOR_NANS (op_type)); |
4331 | if (code == ERROR_MARK) |
4332 | return NULL_TREE(tree) __null; |
4333 | |
4334 | tree ret = build2_loc (loc, code, type, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4334, __FUNCTION__))))), |
4335 | TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4335, __FUNCTION__)))))); |
4336 | copy_warning (ret, arg); |
4337 | return ret; |
4338 | } |
4339 | |
4340 | switch (code) |
4341 | { |
4342 | case INTEGER_CST: |
4343 | return constant_boolean_node (integer_zerop (arg), type); |
4344 | |
4345 | case TRUTH_AND_EXPR: |
4346 | loc1 = expr_location_or (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4346, __FUNCTION__))))), loc); |
4347 | loc2 = expr_location_or (TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4347, __FUNCTION__))))), loc); |
4348 | return build2_loc (loc, TRUTH_OR_EXPR, type, |
4349 | invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4349, __FUNCTION__)))))), |
4350 | invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4350, __FUNCTION__))))))); |
4351 | |
4352 | case TRUTH_OR_EXPR: |
4353 | loc1 = expr_location_or (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4353, __FUNCTION__))))), loc); |
4354 | loc2 = expr_location_or (TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4354, __FUNCTION__))))), loc); |
4355 | return build2_loc (loc, TRUTH_AND_EXPR, type, |
4356 | invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4356, __FUNCTION__)))))), |
4357 | invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4357, __FUNCTION__))))))); |
4358 | |
4359 | case TRUTH_XOR_EXPR: |
4360 | /* Here we can invert either operand. We invert the first operand |
4361 | unless the second operand is a TRUTH_NOT_EXPR in which case our |
4362 | result is the XOR of the first operand with the inside of the |
4363 | negation of the second operand. */ |
4364 | |
4365 | if (TREE_CODE (TREE_OPERAND (arg, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4365, __FUNCTION__))))))->base.code) == TRUTH_NOT_EXPR) |
4366 | return build2_loc (loc, TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4366, __FUNCTION__))))), |
4367 | TREE_OPERAND (TREE_OPERAND (arg, 1), 0)(*((const_cast<tree*> (tree_operand_check (((*((const_cast <tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4367, __FUNCTION__)))))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4367, __FUNCTION__)))))); |
4368 | else |
4369 | return build2_loc (loc, TRUTH_XOR_EXPR, type, |
4370 | invert_truthvalue_loc (loc, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4370, __FUNCTION__)))))), |
4371 | TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4371, __FUNCTION__)))))); |
4372 | |
4373 | case TRUTH_ANDIF_EXPR: |
4374 | loc1 = expr_location_or (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4374, __FUNCTION__))))), loc); |
4375 | loc2 = expr_location_or (TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4375, __FUNCTION__))))), loc); |
4376 | return build2_loc (loc, TRUTH_ORIF_EXPR, type, |
4377 | invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4377, __FUNCTION__)))))), |
4378 | invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4378, __FUNCTION__))))))); |
4379 | |
4380 | case TRUTH_ORIF_EXPR: |
4381 | loc1 = expr_location_or (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4381, __FUNCTION__))))), loc); |
4382 | loc2 = expr_location_or (TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4382, __FUNCTION__))))), loc); |
4383 | return build2_loc (loc, TRUTH_ANDIF_EXPR, type, |
4384 | invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4384, __FUNCTION__)))))), |
4385 | invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4385, __FUNCTION__))))))); |
4386 | |
4387 | case TRUTH_NOT_EXPR: |
4388 | return TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4388, __FUNCTION__))))); |
4389 | |
4390 | case COND_EXPR: |
4391 | { |
4392 | tree arg1 = TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4392, __FUNCTION__))))); |
4393 | tree arg2 = TREE_OPERAND (arg, 2)(*((const_cast<tree*> (tree_operand_check ((arg), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4393, __FUNCTION__))))); |
4394 | |
4395 | loc1 = expr_location_or (TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4395, __FUNCTION__))))), loc); |
4396 | loc2 = expr_location_or (TREE_OPERAND (arg, 2)(*((const_cast<tree*> (tree_operand_check ((arg), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4396, __FUNCTION__))))), loc); |
4397 | |
4398 | /* A COND_EXPR may have a throw as one operand, which |
4399 | then has void type. Just leave void operands |
4400 | as they are. */ |
4401 | return build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4401, __FUNCTION__))))), |
4402 | VOID_TYPE_P (TREE_TYPE (arg1))(((enum tree_code) (((contains_struct_check ((arg1), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4402, __FUNCTION__))->typed.type))->base.code) == VOID_TYPE ) |
4403 | ? arg1 : invert_truthvalue_loc (loc1, arg1), |
4404 | VOID_TYPE_P (TREE_TYPE (arg2))(((enum tree_code) (((contains_struct_check ((arg2), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4404, __FUNCTION__))->typed.type))->base.code) == VOID_TYPE ) |
4405 | ? arg2 : invert_truthvalue_loc (loc2, arg2)); |
4406 | } |
4407 | |
4408 | case COMPOUND_EXPR: |
4409 | loc1 = expr_location_or (TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4409, __FUNCTION__))))), loc); |
4410 | return build2_loc (loc, COMPOUND_EXPR, type, |
4411 | TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4411, __FUNCTION__))))), |
4412 | invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4412, __FUNCTION__))))))); |
4413 | |
4414 | case NON_LVALUE_EXPR: |
4415 | loc1 = expr_location_or (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4415, __FUNCTION__))))), loc); |
4416 | return invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4416, __FUNCTION__)))))); |
4417 | |
4418 | CASE_CONVERTcase NOP_EXPR: case CONVERT_EXPR: |
4419 | if (TREE_CODE (TREE_TYPE (arg))((enum tree_code) (((contains_struct_check ((arg), (TS_TYPED) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4419, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE) |
4420 | return build1_loc (loc, TRUTH_NOT_EXPR, type, arg); |
4421 | |
4422 | /* fall through */ |
4423 | |
4424 | case FLOAT_EXPR: |
4425 | loc1 = expr_location_or (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4425, __FUNCTION__))))), loc); |
4426 | return build1_loc (loc, TREE_CODE (arg)((enum tree_code) (arg)->base.code), type, |
4427 | invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4427, __FUNCTION__))))))); |
4428 | |
4429 | case BIT_AND_EXPR: |
4430 | if (!integer_onep (TREE_OPERAND (arg, 1)(*((const_cast<tree*> (tree_operand_check ((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4430, __FUNCTION__))))))) |
4431 | return NULL_TREE(tree) __null; |
4432 | return build2_loc (loc, EQ_EXPR, type, arg, build_int_cst (type, 0)); |
4433 | |
4434 | case SAVE_EXPR: |
4435 | return build1_loc (loc, TRUTH_NOT_EXPR, type, arg); |
4436 | |
4437 | case CLEANUP_POINT_EXPR: |
4438 | loc1 = expr_location_or (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4438, __FUNCTION__))))), loc); |
4439 | return build1_loc (loc, CLEANUP_POINT_EXPR, type, |
4440 | invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4440, __FUNCTION__))))))); |
4441 | |
4442 | default: |
4443 | return NULL_TREE(tree) __null; |
4444 | } |
4445 | } |
4446 | |
4447 | /* Fold the truth-negation of ARG. This never alters ARG itself. We |
4448 | assume that ARG is an operation that returns a truth value (0 or 1 |
4449 | for scalars, 0 or -1 for vectors). Return the folded expression if |
4450 | folding is successful. Otherwise, return NULL_TREE. */ |
4451 | |
4452 | static tree |
4453 | fold_invert_truthvalue (location_t loc, tree arg) |
4454 | { |
4455 | tree type = TREE_TYPE (arg)((contains_struct_check ((arg), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4455, __FUNCTION__))->typed.type); |
4456 | return fold_unary_loc (loc, VECTOR_TYPE_P (type)(((enum tree_code) (type)->base.code) == VECTOR_TYPE) |
4457 | ? BIT_NOT_EXPR |
4458 | : TRUTH_NOT_EXPR, |
4459 | type, arg); |
4460 | } |
4461 | |
4462 | /* Return a simplified tree node for the truth-negation of ARG. This |
4463 | never alters ARG itself. We assume that ARG is an operation that |
4464 | returns a truth value (0 or 1 for scalars, 0 or -1 for vectors). */ |
4465 | |
4466 | tree |
4467 | invert_truthvalue_loc (location_t loc, tree arg) |
4468 | { |
4469 | if (TREE_CODE (arg)((enum tree_code) (arg)->base.code) == ERROR_MARK) |
4470 | return arg; |
4471 | |
4472 | tree type = TREE_TYPE (arg)((contains_struct_check ((arg), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4472, __FUNCTION__))->typed.type); |
4473 | return fold_build1_loc (loc, VECTOR_TYPE_P (type)(((enum tree_code) (type)->base.code) == VECTOR_TYPE) |
4474 | ? BIT_NOT_EXPR |
4475 | : TRUTH_NOT_EXPR, |
4476 | type, arg); |
4477 | } |
4478 | |
4479 | /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER |
4480 | starting at BITPOS. The field is unsigned if UNSIGNEDP is nonzero |
4481 | and uses reverse storage order if REVERSEP is nonzero. ORIG_INNER |
4482 | is the original memory reference used to preserve the alias set of |
4483 | the access. */ |
4484 | |
4485 | static tree |
4486 | make_bit_field_ref (location_t loc, tree inner, tree orig_inner, tree type, |
4487 | HOST_WIDE_INTlong bitsize, poly_int64 bitpos, |
4488 | int unsignedp, int reversep) |
4489 | { |
4490 | tree result, bftype; |
4491 | |
4492 | /* Attempt not to lose the access path if possible. */ |
4493 | if (TREE_CODE (orig_inner)((enum tree_code) (orig_inner)->base.code) == COMPONENT_REF) |
4494 | { |
4495 | tree ninner = TREE_OPERAND (orig_inner, 0)(*((const_cast<tree*> (tree_operand_check ((orig_inner) , (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4495, __FUNCTION__))))); |
4496 | machine_mode nmode; |
4497 | poly_int64 nbitsize, nbitpos; |
4498 | tree noffset; |
4499 | int nunsignedp, nreversep, nvolatilep = 0; |
4500 | tree base = get_inner_reference (ninner, &nbitsize, &nbitpos, |
4501 | &noffset, &nmode, &nunsignedp, |
4502 | &nreversep, &nvolatilep); |
4503 | if (base == inner |
4504 | && noffset == NULL_TREE(tree) __null |
4505 | && known_subrange_p (bitpos, bitsize, nbitpos, nbitsize) |
4506 | && !reversep |
4507 | && !nreversep |
4508 | && !nvolatilep) |
4509 | { |
4510 | inner = ninner; |
4511 | bitpos -= nbitpos; |
4512 | } |
4513 | } |
4514 | |
4515 | alias_set_type iset = get_alias_set (orig_inner); |
4516 | if (iset == 0 && get_alias_set (inner) != iset) |
4517 | inner = fold_build2 (MEM_REF, TREE_TYPE (inner),fold_build2_loc (((location_t) 0), MEM_REF, ((contains_struct_check ((inner), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4517, __FUNCTION__))->typed.type), build_fold_addr_expr_loc (((location_t) 0), (inner)), build_int_cst (global_trees[TI_PTR_TYPE ], 0) ) |
4518 | build_fold_addr_expr (inner),fold_build2_loc (((location_t) 0), MEM_REF, ((contains_struct_check ((inner), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4517, __FUNCTION__))->typed.type), build_fold_addr_expr_loc (((location_t) 0), (inner)), build_int_cst (global_trees[TI_PTR_TYPE ], 0) ) |
4519 | build_int_cst (ptr_type_node, 0))fold_build2_loc (((location_t) 0), MEM_REF, ((contains_struct_check ((inner), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4517, __FUNCTION__))->typed.type), build_fold_addr_expr_loc (((location_t) 0), (inner)), build_int_cst (global_trees[TI_PTR_TYPE ], 0) ); |
4520 | |
4521 | if (known_eq (bitpos, 0)(!maybe_ne (bitpos, 0)) && !reversep) |
4522 | { |
4523 | tree size = TYPE_SIZE (TREE_TYPE (inner))((tree_class_check ((((contains_struct_check ((inner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4523, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4523, __FUNCTION__))->type_common.size); |
4524 | if ((INTEGRAL_TYPE_P (TREE_TYPE (inner))(((enum tree_code) (((contains_struct_check ((inner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4524, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((inner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4524, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((inner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4524, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE ) |
4525 | || POINTER_TYPE_P (TREE_TYPE (inner))(((enum tree_code) (((contains_struct_check ((inner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4525, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE || ((enum tree_code) (((contains_struct_check ((inner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4525, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
4526 | && tree_fits_shwi_p (size) |
4527 | && tree_to_shwi (size) == bitsize) |
4528 | return fold_convert_loc (loc, type, inner); |
4529 | } |
4530 | |
4531 | bftype = type; |
4532 | if (TYPE_PRECISION (bftype)((tree_class_check ((bftype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4532, __FUNCTION__))->type_common.precision) != bitsize |
4533 | || TYPE_UNSIGNED (bftype)((tree_class_check ((bftype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4533, __FUNCTION__))->base.u.bits.unsigned_flag) == !unsignedp) |
4534 | bftype = build_nonstandard_integer_type (bitsize, 0); |
4535 | |
4536 | result = build3_loc (loc, BIT_FIELD_REF, bftype, inner, |
4537 | bitsize_int (bitsize)size_int_kind (bitsize, stk_bitsizetype), bitsize_int (bitpos)size_int_kind (bitpos, stk_bitsizetype)); |
4538 | REF_REVERSE_STORAGE_ORDER (result)((tree_check2 ((result), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4538, __FUNCTION__, (BIT_FIELD_REF), (MEM_REF)))->base.default_def_flag ) = reversep; |
4539 | |
4540 | if (bftype != type) |
4541 | result = fold_convert_loc (loc, type, result); |
4542 | |
4543 | return result; |
4544 | } |
4545 | |
4546 | /* Optimize a bit-field compare. |
4547 | |
4548 | There are two cases: First is a compare against a constant and the |
4549 | second is a comparison of two items where the fields are at the same |
4550 | bit position relative to the start of a chunk (byte, halfword, word) |
4551 | large enough to contain it. In these cases we can avoid the shift |
4552 | implicit in bitfield extractions. |
4553 | |
4554 | For constants, we emit a compare of the shifted constant with the |
4555 | BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being |
4556 | compared. For two fields at the same position, we do the ANDs with the |
4557 | similar mask and compare the result of the ANDs. |
4558 | |
4559 | CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR. |
4560 | COMPARE_TYPE is the type of the comparison, and LHS and RHS |
4561 | are the left and right operands of the comparison, respectively. |
4562 | |
4563 | If the optimization described above can be done, we return the resulting |
4564 | tree. Otherwise we return zero. */ |
4565 | |
4566 | static tree |
4567 | optimize_bit_field_compare (location_t loc, enum tree_code code, |
4568 | tree compare_type, tree lhs, tree rhs) |
4569 | { |
4570 | poly_int64 plbitpos, plbitsize, rbitpos, rbitsize; |
4571 | HOST_WIDE_INTlong lbitpos, lbitsize, nbitpos, nbitsize; |
4572 | tree type = TREE_TYPE (lhs)((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4572, __FUNCTION__))->typed.type); |
4573 | tree unsigned_type; |
4574 | int const_p = TREE_CODE (rhs)((enum tree_code) (rhs)->base.code) == INTEGER_CST; |
4575 | machine_mode lmode, rmode; |
4576 | scalar_int_mode nmode; |
4577 | int lunsignedp, runsignedp; |
4578 | int lreversep, rreversep; |
4579 | int lvolatilep = 0, rvolatilep = 0; |
4580 | tree linner, rinner = NULL_TREE(tree) __null; |
4581 | tree mask; |
4582 | tree offset; |
4583 | |
4584 | /* Get all the information about the extractions being done. If the bit size |
4585 | is the same as the size of the underlying object, we aren't doing an |
4586 | extraction at all and so can do nothing. We also don't want to |
4587 | do anything if the inner expression is a PLACEHOLDER_EXPR since we |
4588 | then will no longer be able to replace it. */ |
4589 | linner = get_inner_reference (lhs, &plbitsize, &plbitpos, &offset, &lmode, |
4590 | &lunsignedp, &lreversep, &lvolatilep); |
4591 | if (linner == lhs |
4592 | || !known_size_p (plbitsize) |
4593 | || !plbitsize.is_constant (&lbitsize) |
4594 | || !plbitpos.is_constant (&lbitpos) |
4595 | || known_eq (lbitsize, GET_MODE_BITSIZE (lmode))(!maybe_ne (lbitsize, GET_MODE_BITSIZE (lmode))) |
4596 | || offset != 0 |
4597 | || TREE_CODE (linner)((enum tree_code) (linner)->base.code) == PLACEHOLDER_EXPR |
4598 | || lvolatilep) |
4599 | return 0; |
4600 | |
4601 | if (const_p) |
4602 | rreversep = lreversep; |
4603 | else |
4604 | { |
4605 | /* If this is not a constant, we can only do something if bit positions, |
4606 | sizes, signedness and storage order are the same. */ |
4607 | rinner |
4608 | = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode, |
4609 | &runsignedp, &rreversep, &rvolatilep); |
4610 | |
4611 | if (rinner == rhs |
4612 | || maybe_ne (lbitpos, rbitpos) |
4613 | || maybe_ne (lbitsize, rbitsize) |
4614 | || lunsignedp != runsignedp |
4615 | || lreversep != rreversep |
4616 | || offset != 0 |
4617 | || TREE_CODE (rinner)((enum tree_code) (rinner)->base.code) == PLACEHOLDER_EXPR |
4618 | || rvolatilep) |
4619 | return 0; |
4620 | } |
4621 | |
4622 | /* Honor the C++ memory model and mimic what RTL expansion does. */ |
4623 | poly_uint64 bitstart = 0; |
4624 | poly_uint64 bitend = 0; |
4625 | if (TREE_CODE (lhs)((enum tree_code) (lhs)->base.code) == COMPONENT_REF) |
4626 | { |
4627 | get_bit_range (&bitstart, &bitend, lhs, &plbitpos, &offset); |
4628 | if (!plbitpos.is_constant (&lbitpos) || offset != NULL_TREE(tree) __null) |
4629 | return 0; |
4630 | } |
4631 | |
4632 | /* See if we can find a mode to refer to this field. We should be able to, |
4633 | but fail if we can't. */ |
4634 | if (!get_best_mode (lbitsize, lbitpos, bitstart, bitend, |
4635 | const_p ? TYPE_ALIGN (TREE_TYPE (linner))(((tree_class_check ((((contains_struct_check ((linner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4635, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4635, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((linner ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4635, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4635, __FUNCTION__))->type_common.align) - 1) : 0) |
4636 | : MIN (TYPE_ALIGN (TREE_TYPE (linner)),(((((tree_class_check ((((contains_struct_check ((linner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((linner ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->type_common.align) - 1) : 0)) < ((((tree_class_check ((((contains_struct_check ((rinner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((rinner ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->type_common.align) - 1) : 0)) ? (( ((tree_class_check ((((contains_struct_check ((linner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((linner ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->type_common.align) - 1) : 0)) : (( ((tree_class_check ((((contains_struct_check ((rinner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((rinner ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->type_common.align) - 1) : 0))) |
4637 | TYPE_ALIGN (TREE_TYPE (rinner)))(((((tree_class_check ((((contains_struct_check ((linner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((linner ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->type_common.align) - 1) : 0)) < ((((tree_class_check ((((contains_struct_check ((rinner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((rinner ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->type_common.align) - 1) : 0)) ? (( ((tree_class_check ((((contains_struct_check ((linner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((linner ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4636, __FUNCTION__))->type_common.align) - 1) : 0)) : (( ((tree_class_check ((((contains_struct_check ((rinner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->type_common.align) ? ((unsigned)1) << (((tree_class_check ((((contains_struct_check ((rinner ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4637, __FUNCTION__))->type_common.align) - 1) : 0))), |
4638 | BITS_PER_WORD((8) * (((global_options.x_ix86_isa_flags & (1UL << 1)) != 0) ? 8 : 4)), false, &nmode)) |
4639 | return 0; |
4640 | |
4641 | /* Set signed and unsigned types of the precision of this mode for the |
4642 | shifts below. */ |
4643 | unsigned_type = lang_hooks.types.type_for_mode (nmode, 1); |
4644 | |
4645 | /* Compute the bit position and size for the new reference and our offset |
4646 | within it. If the new reference is the same size as the original, we |
4647 | won't optimize anything, so return zero. */ |
4648 | nbitsize = GET_MODE_BITSIZE (nmode); |
4649 | nbitpos = lbitpos & ~ (nbitsize - 1); |
4650 | lbitpos -= nbitpos; |
4651 | if (nbitsize == lbitsize) |
4652 | return 0; |
4653 | |
4654 | if (lreversep ? !BYTES_BIG_ENDIAN0 : BYTES_BIG_ENDIAN0) |
4655 | lbitpos = nbitsize - lbitsize - lbitpos; |
4656 | |
4657 | /* Make the mask to be used against the extracted field. */ |
4658 | mask = build_int_cst_type (unsigned_type, -1); |
4659 | mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize)size_int_kind (nbitsize - lbitsize, stk_sizetype)); |
4660 | mask = const_binop (RSHIFT_EXPR, mask, |
4661 | size_int (nbitsize - lbitsize - lbitpos)size_int_kind (nbitsize - lbitsize - lbitpos, stk_sizetype)); |
4662 | |
4663 | if (! const_p) |
4664 | { |
4665 | if (nbitpos < 0) |
4666 | return 0; |
4667 | |
4668 | /* If not comparing with constant, just rework the comparison |
4669 | and return. */ |
4670 | tree t1 = make_bit_field_ref (loc, linner, lhs, unsigned_type, |
4671 | nbitsize, nbitpos, 1, lreversep); |
4672 | t1 = fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type, t1, mask); |
4673 | tree t2 = make_bit_field_ref (loc, rinner, rhs, unsigned_type, |
4674 | nbitsize, nbitpos, 1, rreversep); |
4675 | t2 = fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type, t2, mask); |
4676 | return fold_build2_loc (loc, code, compare_type, t1, t2); |
4677 | } |
4678 | |
4679 | /* Otherwise, we are handling the constant case. See if the constant is too |
4680 | big for the field. Warn and return a tree for 0 (false) if so. We do |
4681 | this not only for its own sake, but to avoid having to test for this |
4682 | error case below. If we didn't, we might generate wrong code. |
4683 | |
4684 | For unsigned fields, the constant shifted right by the field length should |
4685 | be all zero. For signed fields, the high-order bits should agree with |
4686 | the sign bit. */ |
4687 | |
4688 | if (lunsignedp) |
4689 | { |
4690 | if (wi::lrshift (wi::to_wide (rhs), lbitsize) != 0) |
4691 | { |
4692 | warning (0, "comparison is always %d due to width of bit-field", |
4693 | code == NE_EXPR); |
4694 | return constant_boolean_node (code == NE_EXPR, compare_type); |
4695 | } |
4696 | } |
4697 | else |
4698 | { |
4699 | wide_int tem = wi::arshift (wi::to_wide (rhs), lbitsize - 1); |
4700 | if (tem != 0 && tem != -1) |
4701 | { |
4702 | warning (0, "comparison is always %d due to width of bit-field", |
4703 | code == NE_EXPR); |
4704 | return constant_boolean_node (code == NE_EXPR, compare_type); |
4705 | } |
4706 | } |
4707 | |
4708 | if (nbitpos < 0) |
4709 | return 0; |
4710 | |
4711 | /* Single-bit compares should always be against zero. */ |
4712 | if (lbitsize == 1 && ! integer_zerop (rhs)) |
4713 | { |
4714 | code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR; |
4715 | rhs = build_int_cst (type, 0); |
4716 | } |
4717 | |
4718 | /* Make a new bitfield reference, shift the constant over the |
4719 | appropriate number of bits and mask it with the computed mask |
4720 | (in case this was a signed field). If we changed it, make a new one. */ |
4721 | lhs = make_bit_field_ref (loc, linner, lhs, unsigned_type, |
4722 | nbitsize, nbitpos, 1, lreversep); |
4723 | |
4724 | rhs = const_binop (BIT_AND_EXPR, |
4725 | const_binop (LSHIFT_EXPR, |
4726 | fold_convert_loc (loc, unsigned_type, rhs), |
4727 | size_int (lbitpos)size_int_kind (lbitpos, stk_sizetype)), |
4728 | mask); |
4729 | |
4730 | lhs = build2_loc (loc, code, compare_type, |
4731 | build2 (BIT_AND_EXPR, unsigned_type, lhs, mask), rhs); |
4732 | return lhs; |
4733 | } |
4734 | |
4735 | /* Subroutine for fold_truth_andor_1: decode a field reference. |
4736 | |
4737 | If EXP is a comparison reference, we return the innermost reference. |
4738 | |
4739 | *PBITSIZE is set to the number of bits in the reference, *PBITPOS is |
4740 | set to the starting bit number. |
4741 | |
4742 | If the innermost field can be completely contained in a mode-sized |
4743 | unit, *PMODE is set to that mode. Otherwise, it is set to VOIDmode. |
4744 | |
4745 | *PVOLATILEP is set to 1 if the any expression encountered is volatile; |
4746 | otherwise it is not changed. |
4747 | |
4748 | *PUNSIGNEDP is set to the signedness of the field. |
4749 | |
4750 | *PREVERSEP is set to the storage order of the field. |
4751 | |
4752 | *PMASK is set to the mask used. This is either contained in a |
4753 | BIT_AND_EXPR or derived from the width of the field. |
4754 | |
4755 | *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any. |
4756 | |
4757 | Return 0 if this is not a component reference or is one that we can't |
4758 | do anything with. */ |
4759 | |
4760 | static tree |
4761 | decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INTlong *pbitsize, |
4762 | HOST_WIDE_INTlong *pbitpos, machine_mode *pmode, |
4763 | int *punsignedp, int *preversep, int *pvolatilep, |
4764 | tree *pmask, tree *pand_mask) |
4765 | { |
4766 | tree exp = *exp_; |
4767 | tree outer_type = 0; |
4768 | tree and_mask = 0; |
4769 | tree mask, inner, offset; |
4770 | tree unsigned_type; |
4771 | unsigned int precision; |
4772 | |
4773 | /* All the optimizations using this function assume integer fields. |
4774 | There are problems with FP fields since the type_for_size call |
4775 | below can fail for, e.g., XFmode. */ |
4776 | if (! INTEGRAL_TYPE_P (TREE_TYPE (exp))(((enum tree_code) (((contains_struct_check ((exp), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4776, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE || ((enum tree_code) (((contains_struct_check ((exp), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4776, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE || ((enum tree_code) (((contains_struct_check ((exp), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4776, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE )) |
4777 | return NULL_TREE(tree) __null; |
4778 | |
4779 | /* We are interested in the bare arrangement of bits, so strip everything |
4780 | that doesn't affect the machine mode. However, record the type of the |
4781 | outermost expression if it may matter below. */ |
4782 | if (CONVERT_EXPR_P (exp)((((enum tree_code) (exp)->base.code)) == NOP_EXPR || (((enum tree_code) (exp)->base.code)) == CONVERT_EXPR) |
4783 | || TREE_CODE (exp)((enum tree_code) (exp)->base.code) == NON_LVALUE_EXPR) |
4784 | outer_type = TREE_TYPE (exp)((contains_struct_check ((exp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4784, __FUNCTION__))->typed.type); |
4785 | STRIP_NOPS (exp)(exp) = tree_strip_nop_conversions ((const_cast<union tree_node *> (((exp))))); |
4786 | |
4787 | if (TREE_CODE (exp)((enum tree_code) (exp)->base.code) == BIT_AND_EXPR) |
4788 | { |
4789 | and_mask = TREE_OPERAND (exp, 1)(*((const_cast<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4789, __FUNCTION__))))); |
4790 | exp = TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4790, __FUNCTION__))))); |
4791 | STRIP_NOPS (exp)(exp) = tree_strip_nop_conversions ((const_cast<union tree_node *> (((exp))))); STRIP_NOPS (and_mask)(and_mask) = tree_strip_nop_conversions ((const_cast<union tree_node *> (((and_mask))))); |
4792 | if (TREE_CODE (and_mask)((enum tree_code) (and_mask)->base.code) != INTEGER_CST) |
4793 | return NULL_TREE(tree) __null; |
4794 | } |
4795 | |
4796 | poly_int64 poly_bitsize, poly_bitpos; |
4797 | inner = get_inner_reference (exp, &poly_bitsize, &poly_bitpos, &offset, |
4798 | pmode, punsignedp, preversep, pvolatilep); |
4799 | if ((inner == exp && and_mask == 0) |
4800 | || !poly_bitsize.is_constant (pbitsize) |
4801 | || !poly_bitpos.is_constant (pbitpos) |
4802 | || *pbitsize < 0 |
4803 | || offset != 0 |
4804 | || TREE_CODE (inner)((enum tree_code) (inner)->base.code) == PLACEHOLDER_EXPR |
4805 | /* Reject out-of-bound accesses (PR79731). */ |
4806 | || (! AGGREGATE_TYPE_P (TREE_TYPE (inner))(((enum tree_code) (((contains_struct_check ((inner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4806, __FUNCTION__))->typed.type))->base.code) == ARRAY_TYPE || (((enum tree_code) (((contains_struct_check ((inner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4806, __FUNCTION__))->typed.type))->base.code) == RECORD_TYPE || ((enum tree_code) (((contains_struct_check ((inner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4806, __FUNCTION__))->typed.type))->base.code) == UNION_TYPE || ((enum tree_code) (((contains_struct_check ((inner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4806, __FUNCTION__))->typed.type))->base.code) == QUAL_UNION_TYPE )) |
4807 | && compare_tree_int (TYPE_SIZE (TREE_TYPE (inner))((tree_class_check ((((contains_struct_check ((inner), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4807, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4807, __FUNCTION__))->type_common.size), |
4808 | *pbitpos + *pbitsize) < 0)) |
4809 | return NULL_TREE(tree) __null; |
4810 | |
4811 | unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1); |
4812 | if (unsigned_type == NULL_TREE(tree) __null) |
4813 | return NULL_TREE(tree) __null; |
4814 | |
4815 | *exp_ = exp; |
4816 | |
4817 | /* If the number of bits in the reference is the same as the bitsize of |
4818 | the outer type, then the outer type gives the signedness. Otherwise |
4819 | (in case of a small bitfield) the signedness is unchanged. */ |
4820 | if (outer_type && *pbitsize == TYPE_PRECISION (outer_type)((tree_class_check ((outer_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4820, __FUNCTION__))->type_common.precision)) |
4821 | *punsignedp = TYPE_UNSIGNED (outer_type)((tree_class_check ((outer_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4821, __FUNCTION__))->base.u.bits.unsigned_flag); |
4822 | |
4823 | /* Compute the mask to access the bitfield. */ |
4824 | precision = TYPE_PRECISION (unsigned_type)((tree_class_check ((unsigned_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4824, __FUNCTION__))->type_common.precision); |
4825 | |
4826 | mask = build_int_cst_type (unsigned_type, -1); |
4827 | |
4828 | mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize)size_int_kind (precision - *pbitsize, stk_sizetype)); |
4829 | mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize)size_int_kind (precision - *pbitsize, stk_sizetype)); |
4830 | |
4831 | /* Merge it with the mask we found in the BIT_AND_EXPR, if any. */ |
4832 | if (and_mask != 0) |
4833 | mask = fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type, |
4834 | fold_convert_loc (loc, unsigned_type, and_mask), mask); |
4835 | |
4836 | *pmask = mask; |
4837 | *pand_mask = and_mask; |
4838 | return inner; |
4839 | } |
4840 | |
4841 | /* Return nonzero if MASK represents a mask of SIZE ones in the low-order |
4842 | bit positions and MASK is SIGNED. */ |
4843 | |
4844 | static bool |
4845 | all_ones_mask_p (const_tree mask, unsigned int size) |
4846 | { |
4847 | tree type = TREE_TYPE (mask)((contains_struct_check ((mask), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4847, __FUNCTION__))->typed.type); |
4848 | unsigned int precision = TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4848, __FUNCTION__))->type_common.precision); |
4849 | |
4850 | /* If this function returns true when the type of the mask is |
4851 | UNSIGNED, then there will be errors. In particular see |
4852 | gcc.c-torture/execute/990326-1.c. There does not appear to be |
4853 | any documentation paper trail as to why this is so. But the pre |
4854 | wide-int worked with that restriction and it has been preserved |
4855 | here. */ |
4856 | if (size > precision || TYPE_SIGN (type)((signop) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4856, __FUNCTION__))->base.u.bits.unsigned_flag)) == UNSIGNED) |
4857 | return false; |
4858 | |
4859 | return wi::mask (size, false, precision) == wi::to_wide (mask); |
4860 | } |
4861 | |
4862 | /* Subroutine for fold: determine if VAL is the INTEGER_CONST that |
4863 | represents the sign bit of EXP's type. If EXP represents a sign |
4864 | or zero extension, also test VAL against the unextended type. |
4865 | The return value is the (sub)expression whose sign bit is VAL, |
4866 | or NULL_TREE otherwise. */ |
4867 | |
4868 | tree |
4869 | sign_bit_p (tree exp, const_tree val) |
4870 | { |
4871 | int width; |
4872 | tree t; |
4873 | |
4874 | /* Tree EXP must have an integral type. */ |
4875 | t = TREE_TYPE (exp)((contains_struct_check ((exp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4875, __FUNCTION__))->typed.type); |
4876 | if (! INTEGRAL_TYPE_P (t)(((enum tree_code) (t)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (t)->base.code) == BOOLEAN_TYPE || ((enum tree_code ) (t)->base.code) == INTEGER_TYPE)) |
4877 | return NULL_TREE(tree) __null; |
4878 | |
4879 | /* Tree VAL must be an integer constant. */ |
4880 | if (TREE_CODE (val)((enum tree_code) (val)->base.code) != INTEGER_CST |
4881 | || TREE_OVERFLOW (val)((tree_class_check ((val), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4881, __FUNCTION__))->base.public_flag)) |
4882 | return NULL_TREE(tree) __null; |
4883 | |
4884 | width = TYPE_PRECISION (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4884, __FUNCTION__))->type_common.precision); |
4885 | if (wi::only_sign_bit_p (wi::to_wide (val), width)) |
4886 | return exp; |
4887 | |
4888 | /* Handle extension from a narrower type. */ |
4889 | if (TREE_CODE (exp)((enum tree_code) (exp)->base.code) == NOP_EXPR |
4890 | && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0)))((tree_class_check ((((contains_struct_check (((*((const_cast <tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4890, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4890, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4890, __FUNCTION__))->type_common.precision) < width) |
4891 | return sign_bit_p (TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4891, __FUNCTION__))))), val); |
4892 | |
4893 | return NULL_TREE(tree) __null; |
4894 | } |
4895 | |
4896 | /* Subroutine for fold_truth_andor_1 and simple_condition_p: determine if an |
4897 | operand is simple enough to be evaluated unconditionally. */ |
4898 | |
4899 | static bool |
4900 | simple_operand_p (const_tree exp) |
4901 | { |
4902 | /* Strip any conversions that don't change the machine mode. */ |
4903 | STRIP_NOPS (exp)(exp) = tree_strip_nop_conversions ((const_cast<union tree_node *> (((exp))))); |
4904 | |
4905 | return (CONSTANT_CLASS_P (exp)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (exp)->base.code))] == tcc_constant) |
4906 | || TREE_CODE (exp)((enum tree_code) (exp)->base.code) == SSA_NAME |
4907 | || (DECL_P (exp)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (exp)->base.code))] == tcc_declaration) |
4908 | && ! TREE_ADDRESSABLE (exp)((exp)->base.addressable_flag) |
4909 | && ! TREE_THIS_VOLATILE (exp)((exp)->base.volatile_flag) |
4910 | && ! DECL_NONLOCAL (exp)((contains_struct_check ((exp), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4910, __FUNCTION__))->decl_common.nonlocal_flag) |
4911 | /* Don't regard global variables as simple. They may be |
4912 | allocated in ways unknown to the compiler (shared memory, |
4913 | #pragma weak, etc). */ |
4914 | && ! TREE_PUBLIC (exp)((exp)->base.public_flag) |
4915 | && ! DECL_EXTERNAL (exp)((contains_struct_check ((exp), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4915, __FUNCTION__))->decl_common.decl_flag_1) |
4916 | /* Weakrefs are not safe to be read, since they can be NULL. |
4917 | They are !TREE_PUBLIC && !DECL_EXTERNAL but still |
4918 | have DECL_WEAK flag set. */ |
4919 | && (! VAR_OR_FUNCTION_DECL_P (exp)(((enum tree_code) (exp)->base.code) == VAR_DECL || ((enum tree_code) (exp)->base.code) == FUNCTION_DECL) || ! DECL_WEAK (exp)((contains_struct_check ((exp), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc" , 4919, __FUNCTION__))->decl_with_vis.weak_flag)) |
4920 | /* Loading a static variable is unduly expensive, but global |
4921 | registers aren't expensive. */ |