Bug Summary

File:build/gcc/fold-const.cc
Warning:line 8489, column 9
Value stored to 'diff' during its initialization is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-suse-linux -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name fold-const.cc -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model static -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/gcc -resource-dir /usr/lib64/clang/15.0.7 -D IN_GCC -D HAVE_CONFIG_H -I . -I . -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/. -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../include -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcpp/include -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcody -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber/bid -I ../libdecnumber -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libbacktrace -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13 -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13/x86_64-suse-linux -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13/backward -internal-isystem /usr/lib64/clang/15.0.7/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-narrowing -Wwrite-strings -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fdeprecated-macro -fdebug-compilation-dir=/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/gcc -ferror-limit 19 -fno-rtti -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=plist-html -analyzer-config silence-checkers=core.NullDereference -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /buildworker/marxinbox-gcc-clang-static-analyzer/objdir/clang-static-analyzer/2023-03-27-141847-20772-1/report-F5jGcD.plist -x c++ /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fold-const.cc
</
1/* Fold a constant sub-tree into a single node for C-compiler
2 Copyright (C) 1987-2023 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along 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. */
93int 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. */
99bool 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. */
104enum 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
123static bool negate_expr_p (tree);
124static tree negate_expr (tree);
125static tree associate_trees (location_t, tree, tree, enum tree_code, tree);
126static enum comparison_code comparison_to_compcode (enum tree_code);
127static enum tree_code compcode_to_comparison (enum comparison_code);
128static bool twoval_comparison_p (tree, tree *, tree *);
129static tree eval_subst (location_t, tree, tree, tree, tree, tree);
130static tree optimize_bit_field_compare (location_t, enum tree_code,
131 tree, tree, tree);
132static bool simple_operand_p (const_tree);
133static tree range_binop (enum tree_code, tree, tree, int, tree, int);
134static tree range_predecessor (tree);
135static tree range_successor (tree);
136static tree fold_range_test (location_t, enum tree_code, tree, tree, tree);
137static tree fold_cond_expr_with_comparison (location_t, tree, enum tree_code,
138 tree, tree, tree, tree);
139static tree unextend (tree, int, int, tree);
140static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
141static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
142static tree fold_binary_op_with_conditional_arg (location_t,
143 enum tree_code, tree,
144 tree, tree,
145 tree, tree, int);
146static tree fold_negate_const (tree, tree);
147static tree fold_not_const (const_tree, tree);
148static tree fold_relational_const (enum tree_code, tree, tree, tree);
149static tree fold_convert_const (enum tree_code, tree, tree);
150static tree fold_view_convert_expr (tree, tree);
151static 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
157static location_t
158expr_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
167tree
168protected_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
186tree
187div_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
207static 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
214static 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
219static 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
224void
225fold_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
239void
240fold_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
283void
284fold_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
291bool
292fold_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
300void
301fold_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
319bool
320negate_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
392bool
393may_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
409static bool
410negate_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
567static tree
568fold_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
765static tree
766fold_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
780static tree
781negate_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
822static tree
823split_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
932static tree
933associate_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
982static bool
983int_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
1011bool
1012wide_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
1149static bool
1150poly_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
1203tree
1204int_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
1233static bool
1234distributes_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
1256static tree
1257const_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
1636tree
1637const_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
1767tree
1768const_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
1928tree
1929size_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
1939tree
1940size_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
1991tree
1992size_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
2039static tree
2040fold_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
2053static tree
2054fold_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
2127static tree
2128fold_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
2175static tree
2176fold_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
2229static tree
2230fold_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
2246static tree
2247fold_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
2266static tree
2267fold_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
2296static tree
2297fold_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
2317static tree
2318fold_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
2408static tree
2409build_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
2419bool
2420fold_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
2464tree
2465fold_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
2637static bool
2638maybe_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
2686tree
2687non_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
2704enum tree_code
2705invert_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
2749enum tree_code
2750swap_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
2787static enum comparison_code
2788comparison_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
2829static enum tree_code
2830compcode_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
2869bool
2870inverse_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
2889tree
2890combine_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
3015bool
3016operand_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
3697void
3698operand_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
3995bool
3996operand_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
4027static 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
4032bool
4033operand_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
4038namespace 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. */
4046void
4047add_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
4057static bool
4058operand_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
4098static bool
4099twoval_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
4174static tree
4175eval_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
4261tree
4262omit_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
4288tree
4289omit_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
4310static tree
4311fold_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
4452static tree
4453fold_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
4466tree
4467invert_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
4485static tree
4486make_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
4566static tree
4567optimize_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
4760static tree
4761decode_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
4844static bool
4845all_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
4868tree
4869sign_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
4899static bool
4900simple_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. */