]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa-ccp.c
builtins.def (va_start, [...]): Fix my previous commit.
[thirdparty/gcc.git] / gcc / tree-ssa-ccp.c
CommitLineData
6de9cd9a 1/* Conditional constant propagation pass for the GNU compiler.
66647d44 2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
1e052c19 3 Free Software Foundation, Inc.
6de9cd9a
DN
4 Adapted from original RTL SSA-CCP by Daniel Berlin <dberlin@dberlin.org>
5 Adapted to GIMPLE trees by Diego Novillo <dnovillo@redhat.com>
6
7This file is part of GCC.
8
9GCC is free software; you can redistribute it and/or modify it
10under the terms of the GNU General Public License as published by the
9dcd6f09 11Free Software Foundation; either version 3, or (at your option) any
6de9cd9a
DN
12later version.
13
14GCC is distributed in the hope that it will be useful, but WITHOUT
15ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17for more details.
18
19You should have received a copy of the GNU General Public License
9dcd6f09
NC
20along with GCC; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
6de9cd9a 22
0bca51f0
DN
23/* Conditional constant propagation (CCP) is based on the SSA
24 propagation engine (tree-ssa-propagate.c). Constant assignments of
25 the form VAR = CST are propagated from the assignments into uses of
26 VAR, which in turn may generate new constants. The simulation uses
27 a four level lattice to keep track of constant values associated
28 with SSA names. Given an SSA name V_i, it may take one of the
29 following values:
30
106dec71
ZD
31 UNINITIALIZED -> the initial state of the value. This value
32 is replaced with a correct initial value
33 the first time the value is used, so the
34 rest of the pass does not need to care about
35 it. Using this value simplifies initialization
36 of the pass, and prevents us from needlessly
37 scanning statements that are never reached.
0bca51f0
DN
38
39 UNDEFINED -> V_i is a local variable whose definition
40 has not been processed yet. Therefore we
41 don't yet know if its value is a constant
42 or not.
43
44 CONSTANT -> V_i has been found to hold a constant
45 value C.
46
47 VARYING -> V_i cannot take a constant value, or if it
48 does, it is not possible to determine it
49 at compile time.
50
51 The core of SSA-CCP is in ccp_visit_stmt and ccp_visit_phi_node:
52
53 1- In ccp_visit_stmt, we are interested in assignments whose RHS
54 evaluates into a constant and conditional jumps whose predicate
55 evaluates into a boolean true or false. When an assignment of
56 the form V_i = CONST is found, V_i's lattice value is set to
57 CONSTANT and CONST is associated with it. This causes the
58 propagation engine to add all the SSA edges coming out the
59 assignment into the worklists, so that statements that use V_i
60 can be visited.
61
62 If the statement is a conditional with a constant predicate, we
63 mark the outgoing edges as executable or not executable
64 depending on the predicate's value. This is then used when
65 visiting PHI nodes to know when a PHI argument can be ignored.
66
67
68 2- In ccp_visit_phi_node, if all the PHI arguments evaluate to the
69 same constant C, then the LHS of the PHI is set to C. This
70 evaluation is known as the "meet operation". Since one of the
71 goals of this evaluation is to optimistically return constant
72 values as often as possible, it uses two main short cuts:
73
74 - If an argument is flowing in through a non-executable edge, it
75 is ignored. This is useful in cases like this:
76
77 if (PRED)
78 a_9 = 3;
79 else
80 a_10 = 100;
81 a_11 = PHI (a_9, a_10)
82
83 If PRED is known to always evaluate to false, then we can
84 assume that a_11 will always take its value from a_10, meaning
85 that instead of consider it VARYING (a_9 and a_10 have
86 different values), we can consider it CONSTANT 100.
87
88 - If an argument has an UNDEFINED value, then it does not affect
89 the outcome of the meet operation. If a variable V_i has an
90 UNDEFINED value, it means that either its defining statement
91 hasn't been visited yet or V_i has no defining statement, in
92 which case the original symbol 'V' is being used
93 uninitialized. Since 'V' is a local variable, the compiler
94 may assume any initial value for it.
95
96
97 After propagation, every variable V_i that ends up with a lattice
98 value of CONSTANT will have the associated constant value in the
99 array CONST_VAL[i].VALUE. That is fed into substitute_and_fold for
100 final substitution and folding.
101
102
103 Constant propagation in stores and loads (STORE-CCP)
104 ----------------------------------------------------
105
106 While CCP has all the logic to propagate constants in GIMPLE
107 registers, it is missing the ability to associate constants with
108 stores and loads (i.e., pointer dereferences, structures and
109 global/aliased variables). We don't keep loads and stores in
110 SSA, but we do build a factored use-def web for them (in the
111 virtual operands).
112
113 For instance, consider the following code fragment:
114
115 struct A a;
116 const int B = 42;
117
118 void foo (int i)
119 {
120 if (i > 10)
121 a.a = 42;
122 else
123 {
124 a.b = 21;
125 a.a = a.b + 21;
126 }
127
128 if (a.a != B)
129 never_executed ();
130 }
131
132 We should be able to deduce that the predicate 'a.a != B' is always
133 false. To achieve this, we associate constant values to the SSA
38635499
DN
134 names in the VDEF operands for each store. Additionally,
135 since we also glob partial loads/stores with the base symbol, we
136 also keep track of the memory reference where the constant value
137 was stored (in the MEM_REF field of PROP_VALUE_T). For instance,
0bca51f0 138
38635499 139 # a_5 = VDEF <a_4>
0bca51f0
DN
140 a.a = 2;
141
142 # VUSE <a_5>
143 x_3 = a.b;
144
145 In the example above, CCP will associate value '2' with 'a_5', but
146 it would be wrong to replace the load from 'a.b' with '2', because
147 '2' had been stored into a.a.
148
106dec71
ZD
149 Note that the initial value of virtual operands is VARYING, not
150 UNDEFINED. Consider, for instance global variables:
0bca51f0
DN
151
152 int A;
153
154 foo (int i)
155 {
156 if (i_3 > 10)
157 A_4 = 3;
158 # A_5 = PHI (A_4, A_2);
159
160 # VUSE <A_5>
161 A.0_6 = A;
162
163 return A.0_6;
164 }
165
166 The value of A_2 cannot be assumed to be UNDEFINED, as it may have
167 been defined outside of foo. If we were to assume it UNDEFINED, we
106dec71 168 would erroneously optimize the above into 'return 3;'.
0bca51f0
DN
169
170 Though STORE-CCP is not too expensive, it does have to do more work
171 than regular CCP, so it is only enabled at -O2. Both regular CCP
172 and STORE-CCP use the exact same algorithm. The only distinction
173 is that when doing STORE-CCP, the boolean variable DO_STORE_CCP is
174 set to true. This affects the evaluation of statements and PHI
175 nodes.
6de9cd9a
DN
176
177 References:
178
179 Constant propagation with conditional branches,
180 Wegman and Zadeck, ACM TOPLAS 13(2):181-210.
181
182 Building an Optimizing Compiler,
183 Robert Morgan, Butterworth-Heinemann, 1998, Section 8.9.
184
185 Advanced Compiler Design and Implementation,
186 Steven Muchnick, Morgan Kaufmann, 1997, Section 12.6 */
187
188#include "config.h"
189#include "system.h"
190#include "coretypes.h"
191#include "tm.h"
6de9cd9a 192#include "tree.h"
750628d8 193#include "flags.h"
6de9cd9a
DN
194#include "rtl.h"
195#include "tm_p.h"
750628d8 196#include "ggc.h"
6de9cd9a 197#include "basic-block.h"
750628d8 198#include "output.h"
750628d8
DN
199#include "expr.h"
200#include "function.h"
6de9cd9a 201#include "diagnostic.h"
750628d8 202#include "timevar.h"
6de9cd9a 203#include "tree-dump.h"
750628d8 204#include "tree-flow.h"
6de9cd9a 205#include "tree-pass.h"
750628d8 206#include "tree-ssa-propagate.h"
53a8f709 207#include "value-prof.h"
750628d8 208#include "langhooks.h"
ae3df618 209#include "target.h"
6ac01510 210#include "toplev.h"
74fe548b 211#include "dbgcnt.h"
6de9cd9a
DN
212
213
214/* Possible lattice values. */
215typedef enum
216{
106dec71 217 UNINITIALIZED,
6de9cd9a
DN
218 UNDEFINED,
219 CONSTANT,
220 VARYING
0bca51f0 221} ccp_lattice_t;
6de9cd9a 222
0bca51f0
DN
223/* Array of propagated constant values. After propagation,
224 CONST_VAL[I].VALUE holds the constant value for SSA_NAME(I). If
225 the constant is held in an SSA name representing a memory store
38635499
DN
226 (i.e., a VDEF), CONST_VAL[I].MEM_REF will contain the actual
227 memory reference used to store (i.e., the LHS of the assignment
228 doing the store). */
404f4351 229static prop_value_t *const_val;
6de9cd9a 230
0bca51f0 231/* Dump constant propagation value VAL to file OUTF prefixed by PREFIX. */
95eec0d6
DB
232
233static void
0bca51f0 234dump_lattice_value (FILE *outf, const char *prefix, prop_value_t val)
95eec0d6 235{
750628d8 236 switch (val.lattice_val)
95eec0d6 237 {
0bca51f0
DN
238 case UNINITIALIZED:
239 fprintf (outf, "%sUNINITIALIZED", prefix);
240 break;
750628d8
DN
241 case UNDEFINED:
242 fprintf (outf, "%sUNDEFINED", prefix);
243 break;
244 case VARYING:
245 fprintf (outf, "%sVARYING", prefix);
246 break;
750628d8
DN
247 case CONSTANT:
248 fprintf (outf, "%sCONSTANT ", prefix);
0bca51f0 249 print_generic_expr (outf, val.value, dump_flags);
750628d8
DN
250 break;
251 default:
1e128c5f 252 gcc_unreachable ();
750628d8 253 }
95eec0d6 254}
6de9cd9a 255
6de9cd9a 256
0bca51f0
DN
257/* Print lattice value VAL to stderr. */
258
259void debug_lattice_value (prop_value_t val);
260
261void
262debug_lattice_value (prop_value_t val)
263{
264 dump_lattice_value (stderr, "", val);
265 fprintf (stderr, "\n");
266}
6de9cd9a 267
6de9cd9a 268
726a989a 269
fc9962ee
ZD
270/* If SYM is a constant variable with known value, return the value.
271 NULL_TREE is returned otherwise. */
272
ed97ddc6 273tree
fc9962ee
ZD
274get_symbol_constant_value (tree sym)
275{
276 if (TREE_STATIC (sym)
5006671f 277 && TREE_READONLY (sym))
fc9962ee
ZD
278 {
279 tree val = DECL_INITIAL (sym);
62bc00e2
RG
280 if (val)
281 {
282 STRIP_USELESS_TYPE_CONVERSION (val);
283 if (is_gimple_min_invariant (val))
75ccc1e7
RG
284 {
285 if (TREE_CODE (val) == ADDR_EXPR)
286 {
287 tree base = get_base_address (TREE_OPERAND (val, 0));
288 if (base && TREE_CODE (base) == VAR_DECL)
289 add_referenced_var (base);
290 }
291 return val;
292 }
62bc00e2 293 }
b0940154 294 /* Variables declared 'const' without an initializer
fa10beec 295 have zero as the initializer if they may not be
ed97ddc6 296 overridden at link or run time. */
b0940154 297 if (!val
98b80692 298 && !DECL_EXTERNAL (sym)
ed97ddc6 299 && targetm.binds_local_p (sym)
b0940154
AP
300 && (INTEGRAL_TYPE_P (TREE_TYPE (sym))
301 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym))))
98b80692 302 return fold_convert (TREE_TYPE (sym), integer_zero_node);
fc9962ee
ZD
303 }
304
305 return NULL_TREE;
306}
688e936d 307
0bca51f0
DN
308/* Compute a default value for variable VAR and store it in the
309 CONST_VAL array. The following rules are used to get default
310 values:
95eec0d6 311
0bca51f0
DN
312 1- Global and static variables that are declared constant are
313 considered CONSTANT.
314
315 2- Any other value is considered UNDEFINED. This is useful when
750628d8
DN
316 considering PHI nodes. PHI arguments that are undefined do not
317 change the constant value of the PHI node, which allows for more
0bca51f0 318 constants to be propagated.
6de9cd9a 319
caf55296 320 3- Variables defined by statements other than assignments and PHI
0bca51f0 321 nodes are considered VARYING.
6de9cd9a 322
caf55296 323 4- Initial values of variables that are not GIMPLE registers are
106dec71 324 considered VARYING. */
6de9cd9a 325
0bca51f0
DN
326static prop_value_t
327get_default_value (tree var)
328{
329 tree sym = SSA_NAME_VAR (var);
dce2b2f6 330 prop_value_t val = { UNINITIALIZED, NULL_TREE };
e8114fba
RG
331 gimple stmt;
332
333 stmt = SSA_NAME_DEF_STMT (var);
334
335 if (gimple_nop_p (stmt))
6de9cd9a 336 {
e8114fba
RG
337 /* Variables defined by an empty statement are those used
338 before being initialized. If VAR is a local variable, we
339 can assume initially that it is UNDEFINED, otherwise we must
340 consider it VARYING. */
341 if (is_gimple_reg (sym) && TREE_CODE (sym) != PARM_DECL)
342 val.lattice_val = UNDEFINED;
343 else
344 val.lattice_val = VARYING;
6de9cd9a 345 }
e8114fba
RG
346 else if (is_gimple_assign (stmt)
347 /* Value-returning GIMPLE_CALL statements assign to
348 a variable, and are treated similarly to GIMPLE_ASSIGN. */
349 || (is_gimple_call (stmt)
350 && gimple_call_lhs (stmt) != NULL_TREE)
351 || gimple_code (stmt) == GIMPLE_PHI)
750628d8 352 {
e8114fba
RG
353 tree cst;
354 if (gimple_assign_single_p (stmt)
355 && DECL_P (gimple_assign_rhs1 (stmt))
356 && (cst = get_symbol_constant_value (gimple_assign_rhs1 (stmt))))
0bca51f0 357 {
e8114fba
RG
358 val.lattice_val = CONSTANT;
359 val.value = cst;
0bca51f0
DN
360 }
361 else
e8114fba
RG
362 /* Any other variable defined by an assignment or a PHI node
363 is considered UNDEFINED. */
364 val.lattice_val = UNDEFINED;
365 }
366 else
367 {
368 /* Otherwise, VAR will never take on a constant value. */
369 val.lattice_val = VARYING;
750628d8 370 }
6de9cd9a 371
750628d8
DN
372 return val;
373}
6de9cd9a 374
6de9cd9a 375
106dec71 376/* Get the constant value associated with variable VAR. */
6de9cd9a 377
106dec71
ZD
378static inline prop_value_t *
379get_value (tree var)
0bca51f0 380{
ed97ddc6 381 prop_value_t *val;
106dec71 382
ed97ddc6
RG
383 if (const_val == NULL)
384 return NULL;
385
386 val = &const_val[SSA_NAME_VERSION (var)];
106dec71 387 if (val->lattice_val == UNINITIALIZED)
6de9cd9a
DN
388 *val = get_default_value (var);
389
390 return val;
391}
392
106dec71
ZD
393/* Sets the value associated with VAR to VARYING. */
394
395static inline void
396set_value_varying (tree var)
397{
398 prop_value_t *val = &const_val[SSA_NAME_VERSION (var)];
399
400 val->lattice_val = VARYING;
401 val->value = NULL_TREE;
106dec71 402}
6de9cd9a 403
fbb5445b
L
404/* For float types, modify the value of VAL to make ccp work correctly
405 for non-standard values (-0, NaN):
406
407 If HONOR_SIGNED_ZEROS is false, and VAL = -0, we canonicalize it to 0.
408 If HONOR_NANS is false, and VAL is NaN, we canonicalize it to UNDEFINED.
409 This is to fix the following problem (see PR 29921): Suppose we have
410
411 x = 0.0 * y
412
413 and we set value of y to NaN. This causes value of x to be set to NaN.
414 When we later determine that y is in fact VARYING, fold uses the fact
415 that HONOR_NANS is false, and we try to change the value of x to 0,
416 causing an ICE. With HONOR_NANS being false, the real appearance of
417 NaN would cause undefined behavior, though, so claiming that y (and x)
418 are UNDEFINED initially is correct. */
419
420static void
421canonicalize_float_value (prop_value_t *val)
422{
423 enum machine_mode mode;
424 tree type;
425 REAL_VALUE_TYPE d;
426
427 if (val->lattice_val != CONSTANT
428 || TREE_CODE (val->value) != REAL_CST)
429 return;
430
431 d = TREE_REAL_CST (val->value);
432 type = TREE_TYPE (val->value);
433 mode = TYPE_MODE (type);
434
435 if (!HONOR_SIGNED_ZEROS (mode)
436 && REAL_VALUE_MINUS_ZERO (d))
437 {
438 val->value = build_real (type, dconst0);
439 return;
440 }
441
442 if (!HONOR_NANS (mode)
443 && REAL_VALUE_ISNAN (d))
444 {
445 val->lattice_val = UNDEFINED;
446 val->value = NULL;
fbb5445b
L
447 return;
448 }
449}
450
0bca51f0
DN
451/* Set the value for variable VAR to NEW_VAL. Return true if the new
452 value is different from VAR's previous value. */
6de9cd9a 453
750628d8 454static bool
0bca51f0 455set_lattice_value (tree var, prop_value_t new_val)
6de9cd9a 456{
106dec71 457 prop_value_t *old_val = get_value (var);
0bca51f0 458
fbb5445b
L
459 canonicalize_float_value (&new_val);
460
0bca51f0 461 /* Lattice transitions must always be monotonically increasing in
106dec71
ZD
462 value. If *OLD_VAL and NEW_VAL are the same, return false to
463 inform the caller that this was a non-transition. */
464
fc9962ee 465 gcc_assert (old_val->lattice_val < new_val.lattice_val
0bca51f0 466 || (old_val->lattice_val == new_val.lattice_val
fc9962ee 467 && ((!old_val->value && !new_val.value)
dce2b2f6 468 || operand_equal_p (old_val->value, new_val.value, 0))));
0bca51f0
DN
469
470 if (old_val->lattice_val != new_val.lattice_val)
6de9cd9a 471 {
750628d8
DN
472 if (dump_file && (dump_flags & TDF_DETAILS))
473 {
0bca51f0 474 dump_lattice_value (dump_file, "Lattice value changed to ", new_val);
106dec71 475 fprintf (dump_file, ". Adding SSA edges to worklist.\n");
750628d8
DN
476 }
477
0bca51f0
DN
478 *old_val = new_val;
479
106dec71
ZD
480 gcc_assert (new_val.lattice_val != UNDEFINED);
481 return true;
6de9cd9a 482 }
750628d8
DN
483
484 return false;
6de9cd9a
DN
485}
486
487
0bca51f0 488/* Return the likely CCP lattice value for STMT.
6de9cd9a 489
750628d8 490 If STMT has no operands, then return CONSTANT.
6de9cd9a 491
7f879c96
RG
492 Else if undefinedness of operands of STMT cause its value to be
493 undefined, then return UNDEFINED.
6de9cd9a 494
750628d8 495 Else if any operands of STMT are constants, then return CONSTANT.
6de9cd9a 496
750628d8 497 Else return VARYING. */
6de9cd9a 498
0bca51f0 499static ccp_lattice_t
726a989a 500likely_value (gimple stmt)
750628d8 501{
7f879c96 502 bool has_constant_operand, has_undefined_operand, all_undefined_operands;
750628d8
DN
503 tree use;
504 ssa_op_iter iter;
e8114fba 505 unsigned i;
6de9cd9a 506
e0c68ce9 507 enum gimple_code code = gimple_code (stmt);
726a989a
RB
508
509 /* This function appears to be called only for assignments, calls,
510 conditionals, and switches, due to the logic in visit_stmt. */
511 gcc_assert (code == GIMPLE_ASSIGN
512 || code == GIMPLE_CALL
513 || code == GIMPLE_COND
514 || code == GIMPLE_SWITCH);
0bca51f0
DN
515
516 /* If the statement has volatile operands, it won't fold to a
517 constant value. */
726a989a 518 if (gimple_has_volatile_ops (stmt))
0bca51f0
DN
519 return VARYING;
520
726a989a 521 /* Arrive here for more complex cases. */
106dec71 522 has_constant_operand = false;
7f879c96
RG
523 has_undefined_operand = false;
524 all_undefined_operands = true;
e8114fba 525 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
750628d8 526 {
106dec71 527 prop_value_t *val = get_value (use);
750628d8 528
106dec71 529 if (val->lattice_val == UNDEFINED)
7f879c96
RG
530 has_undefined_operand = true;
531 else
532 all_undefined_operands = false;
0bca51f0 533
750628d8 534 if (val->lattice_val == CONSTANT)
106dec71 535 has_constant_operand = true;
6de9cd9a 536 }
750628d8 537
5006671f
RG
538 /* There may be constants in regular rhs operands. For calls we
539 have to ignore lhs, fndecl and static chain, otherwise only
540 the lhs. */
541 for (i = (is_gimple_call (stmt) ? 2 : 0) + gimple_has_lhs (stmt);
e8114fba
RG
542 i < gimple_num_ops (stmt); ++i)
543 {
544 tree op = gimple_op (stmt, i);
545 if (!op || TREE_CODE (op) == SSA_NAME)
546 continue;
547 if (is_gimple_min_invariant (op))
548 has_constant_operand = true;
549 }
550
7f879c96
RG
551 /* If the operation combines operands like COMPLEX_EXPR make sure to
552 not mark the result UNDEFINED if only one part of the result is
553 undefined. */
726a989a 554 if (has_undefined_operand && all_undefined_operands)
7f879c96 555 return UNDEFINED;
726a989a 556 else if (code == GIMPLE_ASSIGN && has_undefined_operand)
7f879c96 557 {
726a989a 558 switch (gimple_assign_rhs_code (stmt))
7f879c96
RG
559 {
560 /* Unary operators are handled with all_undefined_operands. */
561 case PLUS_EXPR:
562 case MINUS_EXPR:
7f879c96 563 case POINTER_PLUS_EXPR:
7f879c96
RG
564 /* Not MIN_EXPR, MAX_EXPR. One VARYING operand may be selected.
565 Not bitwise operators, one VARYING operand may specify the
566 result completely. Not logical operators for the same reason.
0cedb9e9
RG
567 Not COMPLEX_EXPR as one VARYING operand makes the result partly
568 not UNDEFINED. Not *DIV_EXPR, comparisons and shifts because
569 the undefined operand may be promoted. */
7f879c96
RG
570 return UNDEFINED;
571
572 default:
573 ;
574 }
575 }
576 /* If there was an UNDEFINED operand but the result may be not UNDEFINED
577 fall back to VARYING even if there were CONSTANT operands. */
578 if (has_undefined_operand)
579 return VARYING;
580
e8114fba
RG
581 /* We do not consider virtual operands here -- load from read-only
582 memory may have only VARYING virtual operands, but still be
583 constant. */
106dec71 584 if (has_constant_operand
e8114fba 585 || gimple_references_memory_p (stmt))
0bca51f0
DN
586 return CONSTANT;
587
106dec71 588 return VARYING;
6de9cd9a
DN
589}
590
106dec71
ZD
591/* Returns true if STMT cannot be constant. */
592
593static bool
726a989a 594surely_varying_stmt_p (gimple stmt)
106dec71
ZD
595{
596 /* If the statement has operands that we cannot handle, it cannot be
597 constant. */
726a989a 598 if (gimple_has_volatile_ops (stmt))
106dec71
ZD
599 return true;
600
174ef36d
RG
601 /* If it is a call and does not return a value or is not a
602 builtin and not an indirect call, it is varying. */
726a989a 603 if (is_gimple_call (stmt))
174ef36d
RG
604 {
605 tree fndecl;
606 if (!gimple_call_lhs (stmt)
607 || ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
99f536cc 608 && !DECL_BUILT_IN (fndecl)))
174ef36d
RG
609 return true;
610 }
106dec71 611
e8114fba 612 /* Any other store operation is not interesting. */
5006671f 613 else if (gimple_vdef (stmt))
e8114fba
RG
614 return true;
615
106dec71
ZD
616 /* Anything other than assignments and conditional jumps are not
617 interesting for CCP. */
726a989a 618 if (gimple_code (stmt) != GIMPLE_ASSIGN
174ef36d
RG
619 && gimple_code (stmt) != GIMPLE_COND
620 && gimple_code (stmt) != GIMPLE_SWITCH
621 && gimple_code (stmt) != GIMPLE_CALL)
106dec71
ZD
622 return true;
623
624 return false;
625}
6de9cd9a 626
750628d8 627/* Initialize local data structures for CCP. */
6de9cd9a
DN
628
629static void
750628d8 630ccp_initialize (void)
6de9cd9a 631{
750628d8 632 basic_block bb;
6de9cd9a 633
b9eae1a9 634 const_val = XCNEWVEC (prop_value_t, num_ssa_names);
6de9cd9a 635
750628d8
DN
636 /* Initialize simulation flags for PHI nodes and statements. */
637 FOR_EACH_BB (bb)
6de9cd9a 638 {
726a989a 639 gimple_stmt_iterator i;
6de9cd9a 640
726a989a 641 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
750628d8 642 {
726a989a 643 gimple stmt = gsi_stmt (i);
106dec71 644 bool is_varying = surely_varying_stmt_p (stmt);
6de9cd9a 645
106dec71 646 if (is_varying)
750628d8 647 {
0bca51f0
DN
648 tree def;
649 ssa_op_iter iter;
650
651 /* If the statement will not produce a constant, mark
652 all its outputs VARYING. */
653 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
e8114fba 654 set_value_varying (def);
750628d8 655 }
726a989a 656 prop_set_simulate_again (stmt, !is_varying);
750628d8 657 }
6de9cd9a
DN
658 }
659
726a989a
RB
660 /* Now process PHI nodes. We never clear the simulate_again flag on
661 phi nodes, since we do not know which edges are executable yet,
662 except for phi nodes for virtual operands when we do not do store ccp. */
750628d8 663 FOR_EACH_BB (bb)
6de9cd9a 664 {
726a989a 665 gimple_stmt_iterator i;
750628d8 666
726a989a
RB
667 for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
668 {
669 gimple phi = gsi_stmt (i);
670
dce2b2f6 671 if (!is_gimple_reg (gimple_phi_result (phi)))
726a989a 672 prop_set_simulate_again (phi, false);
106dec71 673 else
726a989a 674 prop_set_simulate_again (phi, true);
750628d8 675 }
6de9cd9a 676 }
750628d8 677}
6de9cd9a 678
74fe548b
XDL
679/* Debug count support. Reset the values of ssa names
680 VARYING when the total number ssa names analyzed is
681 beyond the debug count specified. */
682
683static void
684do_dbg_cnt (void)
685{
686 unsigned i;
687 for (i = 0; i < num_ssa_names; i++)
688 {
689 if (!dbg_cnt (ccp))
690 {
691 const_val[i].lattice_val = VARYING;
692 const_val[i].value = NULL_TREE;
693 }
694 }
695}
696
6de9cd9a 697
0bca51f0 698/* Do final substitution of propagated values, cleanup the flowgraph and
3253eafb 699 free allocated storage.
6de9cd9a 700
3253eafb
JH
701 Return TRUE when something was optimized. */
702
703static bool
0bca51f0 704ccp_finalize (void)
6de9cd9a 705{
74fe548b
XDL
706 bool something_changed;
707
708 do_dbg_cnt ();
0bca51f0 709 /* Perform substitutions based on the known constant values. */
74fe548b 710 something_changed = substitute_and_fold (const_val, false);
6de9cd9a 711
0bca51f0 712 free (const_val);
ed97ddc6 713 const_val = NULL;
3253eafb 714 return something_changed;;
6de9cd9a
DN
715}
716
717
0bca51f0
DN
718/* Compute the meet operator between *VAL1 and *VAL2. Store the result
719 in VAL1.
720
721 any M UNDEFINED = any
0bca51f0
DN
722 any M VARYING = VARYING
723 Ci M Cj = Ci if (i == j)
724 Ci M Cj = VARYING if (i != j)
106dec71 725 */
6de9cd9a
DN
726
727static void
0bca51f0 728ccp_lattice_meet (prop_value_t *val1, prop_value_t *val2)
6de9cd9a 729{
0bca51f0 730 if (val1->lattice_val == UNDEFINED)
6de9cd9a 731 {
0bca51f0
DN
732 /* UNDEFINED M any = any */
733 *val1 = *val2;
750628d8 734 }
0bca51f0 735 else if (val2->lattice_val == UNDEFINED)
195da47b 736 {
0bca51f0
DN
737 /* any M UNDEFINED = any
738 Nothing to do. VAL1 already contains the value we want. */
739 ;
195da47b 740 }
0bca51f0
DN
741 else if (val1->lattice_val == VARYING
742 || val2->lattice_val == VARYING)
750628d8 743 {
0bca51f0
DN
744 /* any M VARYING = VARYING. */
745 val1->lattice_val = VARYING;
746 val1->value = NULL_TREE;
750628d8 747 }
0bca51f0
DN
748 else if (val1->lattice_val == CONSTANT
749 && val2->lattice_val == CONSTANT
dce2b2f6 750 && simple_cst_equal (val1->value, val2->value) == 1)
750628d8 751 {
0bca51f0
DN
752 /* Ci M Cj = Ci if (i == j)
753 Ci M Cj = VARYING if (i != j)
754
755 If these two values come from memory stores, make sure that
756 they come from the same memory reference. */
757 val1->lattice_val = CONSTANT;
758 val1->value = val1->value;
750628d8
DN
759 }
760 else
761 {
0bca51f0
DN
762 /* Any other combination is VARYING. */
763 val1->lattice_val = VARYING;
764 val1->value = NULL_TREE;
750628d8 765 }
6de9cd9a
DN
766}
767
768
750628d8
DN
769/* Loop through the PHI_NODE's parameters for BLOCK and compare their
770 lattice values to determine PHI_NODE's lattice value. The value of a
0bca51f0 771 PHI node is determined calling ccp_lattice_meet with all the arguments
750628d8 772 of the PHI node that are incoming via executable edges. */
6de9cd9a 773
750628d8 774static enum ssa_prop_result
726a989a 775ccp_visit_phi_node (gimple phi)
6de9cd9a 776{
726a989a 777 unsigned i;
0bca51f0 778 prop_value_t *old_val, new_val;
6de9cd9a 779
750628d8 780 if (dump_file && (dump_flags & TDF_DETAILS))
6de9cd9a 781 {
750628d8 782 fprintf (dump_file, "\nVisiting PHI node: ");
726a989a 783 print_gimple_stmt (dump_file, phi, 0, dump_flags);
6de9cd9a 784 }
6de9cd9a 785
726a989a 786 old_val = get_value (gimple_phi_result (phi));
750628d8
DN
787 switch (old_val->lattice_val)
788 {
789 case VARYING:
0bca51f0 790 return SSA_PROP_VARYING;
6de9cd9a 791
750628d8
DN
792 case CONSTANT:
793 new_val = *old_val;
794 break;
6de9cd9a 795
750628d8 796 case UNDEFINED:
750628d8 797 new_val.lattice_val = UNDEFINED;
0bca51f0 798 new_val.value = NULL_TREE;
750628d8 799 break;
6de9cd9a 800
750628d8 801 default:
1e128c5f 802 gcc_unreachable ();
750628d8 803 }
6de9cd9a 804
726a989a 805 for (i = 0; i < gimple_phi_num_args (phi); i++)
750628d8 806 {
0bca51f0
DN
807 /* Compute the meet operator over all the PHI arguments flowing
808 through executable edges. */
726a989a 809 edge e = gimple_phi_arg_edge (phi, i);
6de9cd9a 810
750628d8
DN
811 if (dump_file && (dump_flags & TDF_DETAILS))
812 {
813 fprintf (dump_file,
814 "\n Argument #%d (%d -> %d %sexecutable)\n",
815 i, e->src->index, e->dest->index,
816 (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
817 }
818
819 /* If the incoming edge is executable, Compute the meet operator for
820 the existing value of the PHI node and the current PHI argument. */
821 if (e->flags & EDGE_EXECUTABLE)
822 {
726a989a 823 tree arg = gimple_phi_arg (phi, i)->def;
0bca51f0 824 prop_value_t arg_val;
6de9cd9a 825
0bca51f0 826 if (is_gimple_min_invariant (arg))
750628d8 827 {
0bca51f0
DN
828 arg_val.lattice_val = CONSTANT;
829 arg_val.value = arg;
750628d8
DN
830 }
831 else
106dec71 832 arg_val = *(get_value (arg));
6de9cd9a 833
0bca51f0 834 ccp_lattice_meet (&new_val, &arg_val);
6de9cd9a 835
750628d8
DN
836 if (dump_file && (dump_flags & TDF_DETAILS))
837 {
838 fprintf (dump_file, "\t");
0bca51f0
DN
839 print_generic_expr (dump_file, arg, dump_flags);
840 dump_lattice_value (dump_file, "\tValue: ", arg_val);
750628d8
DN
841 fprintf (dump_file, "\n");
842 }
6de9cd9a 843
750628d8
DN
844 if (new_val.lattice_val == VARYING)
845 break;
846 }
847 }
6de9cd9a
DN
848
849 if (dump_file && (dump_flags & TDF_DETAILS))
750628d8
DN
850 {
851 dump_lattice_value (dump_file, "\n PHI node value: ", new_val);
852 fprintf (dump_file, "\n\n");
853 }
854
106dec71 855 /* Make the transition to the new value. */
726a989a 856 if (set_lattice_value (gimple_phi_result (phi), new_val))
750628d8
DN
857 {
858 if (new_val.lattice_val == VARYING)
859 return SSA_PROP_VARYING;
860 else
861 return SSA_PROP_INTERESTING;
862 }
863 else
864 return SSA_PROP_NOT_INTERESTING;
6de9cd9a
DN
865}
866
f7c0ffb4
RG
867/* Return true if we may propagate the address expression ADDR into the
868 dereference DEREF and cancel them. */
869
870bool
871may_propagate_address_into_dereference (tree addr, tree deref)
872{
873 gcc_assert (INDIRECT_REF_P (deref)
874 && TREE_CODE (addr) == ADDR_EXPR);
875
03375368
JJ
876 /* Don't propagate if ADDR's operand has incomplete type. */
877 if (!COMPLETE_TYPE_P (TREE_TYPE (TREE_OPERAND (addr, 0))))
878 return false;
879
f7c0ffb4
RG
880 /* If the address is invariant then we do not need to preserve restrict
881 qualifications. But we do need to preserve volatile qualifiers until
882 we can annotate the folded dereference itself properly. */
883 if (is_gimple_min_invariant (addr)
884 && (!TREE_THIS_VOLATILE (deref)
885 || TYPE_VOLATILE (TREE_TYPE (addr))))
886 return useless_type_conversion_p (TREE_TYPE (deref),
887 TREE_TYPE (TREE_OPERAND (addr, 0)));
888
889 /* Else both the address substitution and the folding must result in
890 a valid useless type conversion sequence. */
891 return (useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (deref, 0)),
892 TREE_TYPE (addr))
893 && useless_type_conversion_p (TREE_TYPE (deref),
894 TREE_TYPE (TREE_OPERAND (addr, 0))));
895}
6de9cd9a 896
750628d8
DN
897/* CCP specific front-end to the non-destructive constant folding
898 routines.
6de9cd9a
DN
899
900 Attempt to simplify the RHS of STMT knowing that one or more
901 operands are constants.
902
903 If simplification is possible, return the simplified RHS,
726a989a 904 otherwise return the original RHS or NULL_TREE. */
6de9cd9a
DN
905
906static tree
726a989a 907ccp_fold (gimple stmt)
6de9cd9a 908{
726a989a 909 switch (gimple_code (stmt))
0bca51f0 910 {
726a989a
RB
911 case GIMPLE_ASSIGN:
912 {
913 enum tree_code subcode = gimple_assign_rhs_code (stmt);
914
915 switch (get_gimple_rhs_class (subcode))
916 {
917 case GIMPLE_SINGLE_RHS:
918 {
919 tree rhs = gimple_assign_rhs1 (stmt);
920 enum tree_code_class kind = TREE_CODE_CLASS (subcode);
921
922 if (TREE_CODE (rhs) == SSA_NAME)
923 {
924 /* If the RHS is an SSA_NAME, return its known constant value,
925 if any. */
926 return get_value (rhs)->value;
927 }
928 /* Handle propagating invariant addresses into address operations.
929 The folding we do here matches that in tree-ssa-forwprop.c. */
930 else if (TREE_CODE (rhs) == ADDR_EXPR)
931 {
932 tree *base;
933 base = &TREE_OPERAND (rhs, 0);
934 while (handled_component_p (*base))
935 base = &TREE_OPERAND (*base, 0);
936 if (TREE_CODE (*base) == INDIRECT_REF
937 && TREE_CODE (TREE_OPERAND (*base, 0)) == SSA_NAME)
938 {
939 prop_value_t *val = get_value (TREE_OPERAND (*base, 0));
940 if (val->lattice_val == CONSTANT
941 && TREE_CODE (val->value) == ADDR_EXPR
f7c0ffb4
RG
942 && may_propagate_address_into_dereference
943 (val->value, *base))
726a989a
RB
944 {
945 /* We need to return a new tree, not modify the IL
946 or share parts of it. So play some tricks to
947 avoid manually building it. */
948 tree ret, save = *base;
949 *base = TREE_OPERAND (val->value, 0);
950 ret = unshare_expr (rhs);
951 recompute_tree_invariant_for_addr_expr (ret);
952 *base = save;
953 return ret;
954 }
955 }
956 }
6de9cd9a 957
726a989a 958 if (kind == tcc_reference)
c76a1f18 959 {
4bad83f5
RG
960 if ((TREE_CODE (rhs) == VIEW_CONVERT_EXPR
961 || TREE_CODE (rhs) == REALPART_EXPR
962 || TREE_CODE (rhs) == IMAGPART_EXPR)
c76a1f18
RG
963 && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
964 {
965 prop_value_t *val = get_value (TREE_OPERAND (rhs, 0));
966 if (val->lattice_val == CONSTANT)
4bad83f5 967 return fold_unary (TREE_CODE (rhs),
c76a1f18
RG
968 TREE_TYPE (rhs), val->value);
969 }
e8114fba
RG
970 else if (TREE_CODE (rhs) == INDIRECT_REF
971 && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
972 {
973 prop_value_t *val = get_value (TREE_OPERAND (rhs, 0));
974 if (val->lattice_val == CONSTANT
975 && TREE_CODE (val->value) == ADDR_EXPR
976 && useless_type_conversion_p (TREE_TYPE (rhs),
977 TREE_TYPE (TREE_TYPE (val->value))))
978 rhs = TREE_OPERAND (val->value, 0);
979 }
c76a1f18
RG
980 return fold_const_aggregate_ref (rhs);
981 }
726a989a
RB
982 else if (kind == tcc_declaration)
983 return get_symbol_constant_value (rhs);
984 return rhs;
985 }
986
987 case GIMPLE_UNARY_RHS:
988 {
989 /* Handle unary operators that can appear in GIMPLE form.
990 Note that we know the single operand must be a constant,
991 so this should almost always return a simplified RHS. */
992 tree lhs = gimple_assign_lhs (stmt);
993 tree op0 = gimple_assign_rhs1 (stmt);
994
995 /* Simplify the operand down to a constant. */
996 if (TREE_CODE (op0) == SSA_NAME)
997 {
998 prop_value_t *val = get_value (op0);
999 if (val->lattice_val == CONSTANT)
1000 op0 = get_value (op0)->value;
1001 }
1002
1003 /* Conversions are useless for CCP purposes if they are
1004 value-preserving. Thus the restrictions that
1005 useless_type_conversion_p places for pointer type conversions
1006 do not apply here. Substitution later will only substitute to
1007 allowed places. */
1a87cf0c 1008 if (CONVERT_EXPR_CODE_P (subcode)
99f536cc
RG
1009 && POINTER_TYPE_P (TREE_TYPE (lhs))
1010 && POINTER_TYPE_P (TREE_TYPE (op0))
1011 /* Do not allow differences in volatile qualification
1012 as this might get us confused as to whether a
1013 propagation destination statement is volatile
1014 or not. See PR36988. */
1015 && (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (lhs)))
1016 == TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (op0)))))
1017 {
1018 tree tem;
1019 /* Still try to generate a constant of correct type. */
1020 if (!useless_type_conversion_p (TREE_TYPE (lhs),
1021 TREE_TYPE (op0))
1022 && ((tem = maybe_fold_offset_to_address
1023 (op0, integer_zero_node, TREE_TYPE (lhs)))
1024 != NULL_TREE))
1025 return tem;
1026 return op0;
1027 }
726a989a 1028
9bacafeb
PB
1029 return fold_unary_ignore_overflow (subcode,
1030 gimple_expr_type (stmt), op0);
ff8b183b 1031 }
726a989a
RB
1032
1033 case GIMPLE_BINARY_RHS:
1034 {
1035 /* Handle binary operators that can appear in GIMPLE form. */
1036 tree op0 = gimple_assign_rhs1 (stmt);
1037 tree op1 = gimple_assign_rhs2 (stmt);
1038
1039 /* Simplify the operands down to constants when appropriate. */
1040 if (TREE_CODE (op0) == SSA_NAME)
1041 {
1042 prop_value_t *val = get_value (op0);
1043 if (val->lattice_val == CONSTANT)
1044 op0 = val->value;
1045 }
1046
1047 if (TREE_CODE (op1) == SSA_NAME)
1048 {
1049 prop_value_t *val = get_value (op1);
1050 if (val->lattice_val == CONSTANT)
1051 op1 = val->value;
1052 }
1053
99f536cc
RG
1054 /* Fold &foo + CST into an invariant reference if possible. */
1055 if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
1056 && TREE_CODE (op0) == ADDR_EXPR
1057 && TREE_CODE (op1) == INTEGER_CST)
1058 {
1059 tree lhs = gimple_assign_lhs (stmt);
1060 tree tem = maybe_fold_offset_to_address (op0, op1,
1061 TREE_TYPE (lhs));
1062 if (tem != NULL_TREE)
1063 return tem;
1064 }
1065
726a989a
RB
1066 return fold_binary (subcode, gimple_expr_type (stmt), op0, op1);
1067 }
1068
1069 default:
1070 gcc_unreachable ();
1071 }
1072 }
1073 break;
6de9cd9a 1074
726a989a 1075 case GIMPLE_CALL:
174ef36d
RG
1076 {
1077 tree fn = gimple_call_fn (stmt);
1078 prop_value_t *val;
1079
1080 if (TREE_CODE (fn) == SSA_NAME)
1081 {
1082 val = get_value (fn);
1083 if (val->lattice_val == CONSTANT)
1084 fn = val->value;
1085 }
1086 if (TREE_CODE (fn) == ADDR_EXPR
a135b1c4 1087 && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL
174ef36d
RG
1088 && DECL_BUILT_IN (TREE_OPERAND (fn, 0)))
1089 {
1090 tree *args = XALLOCAVEC (tree, gimple_call_num_args (stmt));
1091 tree call, retval;
1092 unsigned i;
1093 for (i = 0; i < gimple_call_num_args (stmt); ++i)
1094 {
1095 args[i] = gimple_call_arg (stmt, i);
1096 if (TREE_CODE (args[i]) == SSA_NAME)
1097 {
1098 val = get_value (args[i]);
1099 if (val->lattice_val == CONSTANT)
1100 args[i] = val->value;
1101 }
1102 }
1103 call = build_call_array (gimple_call_return_type (stmt),
1104 fn, gimple_call_num_args (stmt), args);
1105 retval = fold_call_expr (call, false);
1106 if (retval)
1107 /* fold_call_expr wraps the result inside a NOP_EXPR. */
1108 STRIP_NOPS (retval);
1109 return retval;
1110 }
1111 return NULL_TREE;
1112 }
6de9cd9a 1113
726a989a
RB
1114 case GIMPLE_COND:
1115 {
1116 /* Handle comparison operators that can appear in GIMPLE form. */
1117 tree op0 = gimple_cond_lhs (stmt);
1118 tree op1 = gimple_cond_rhs (stmt);
1119 enum tree_code code = gimple_cond_code (stmt);
1120
1121 /* Simplify the operands down to constants when appropriate. */
1122 if (TREE_CODE (op0) == SSA_NAME)
1123 {
1124 prop_value_t *val = get_value (op0);
1125 if (val->lattice_val == CONSTANT)
1126 op0 = val->value;
1127 }
1128
1129 if (TREE_CODE (op1) == SSA_NAME)
1130 {
1131 prop_value_t *val = get_value (op1);
1132 if (val->lattice_val == CONSTANT)
1133 op1 = val->value;
1134 }
1135
1136 return fold_binary (code, boolean_type_node, op0, op1);
1137 }
6de9cd9a 1138
726a989a
RB
1139 case GIMPLE_SWITCH:
1140 {
1141 tree rhs = gimple_switch_index (stmt);
87e1e42b 1142
726a989a
RB
1143 if (TREE_CODE (rhs) == SSA_NAME)
1144 {
1145 /* If the RHS is an SSA_NAME, return its known constant value,
1146 if any. */
1147 return get_value (rhs)->value;
1148 }
87e1e42b 1149
726a989a
RB
1150 return rhs;
1151 }
00d382a8 1152
726a989a
RB
1153 default:
1154 gcc_unreachable ();
6de9cd9a 1155 }
6de9cd9a
DN
1156}
1157
1158
ae3df618
SB
1159/* Return the tree representing the element referenced by T if T is an
1160 ARRAY_REF or COMPONENT_REF into constant aggregates. Return
1161 NULL_TREE otherwise. */
1162
ed97ddc6 1163tree
ae3df618
SB
1164fold_const_aggregate_ref (tree t)
1165{
1166 prop_value_t *value;
4038c495
GB
1167 tree base, ctor, idx, field;
1168 unsigned HOST_WIDE_INT cnt;
1169 tree cfield, cval;
ae3df618 1170
e8114fba
RG
1171 if (TREE_CODE_CLASS (TREE_CODE (t)) == tcc_declaration)
1172 return get_symbol_constant_value (t);
1173
ae3df618
SB
1174 switch (TREE_CODE (t))
1175 {
1176 case ARRAY_REF:
1177 /* Get a CONSTRUCTOR. If BASE is a VAR_DECL, get its
1178 DECL_INITIAL. If BASE is a nested reference into another
1179 ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1180 the inner reference. */
1181 base = TREE_OPERAND (t, 0);
1182 switch (TREE_CODE (base))
1183 {
1184 case VAR_DECL:
1185 if (!TREE_READONLY (base)
1186 || TREE_CODE (TREE_TYPE (base)) != ARRAY_TYPE
1187 || !targetm.binds_local_p (base))
1188 return NULL_TREE;
1189
1190 ctor = DECL_INITIAL (base);
1191 break;
1192
1193 case ARRAY_REF:
1194 case COMPONENT_REF:
1195 ctor = fold_const_aggregate_ref (base);
1196 break;
1197
87e1e42b
RG
1198 case STRING_CST:
1199 case CONSTRUCTOR:
1200 ctor = base;
1201 break;
1202
ae3df618
SB
1203 default:
1204 return NULL_TREE;
1205 }
1206
1207 if (ctor == NULL_TREE
faaf1436
RG
1208 || (TREE_CODE (ctor) != CONSTRUCTOR
1209 && TREE_CODE (ctor) != STRING_CST)
ae3df618
SB
1210 || !TREE_STATIC (ctor))
1211 return NULL_TREE;
1212
1213 /* Get the index. If we have an SSA_NAME, try to resolve it
1214 with the current lattice value for the SSA_NAME. */
1215 idx = TREE_OPERAND (t, 1);
1216 switch (TREE_CODE (idx))
1217 {
1218 case SSA_NAME:
106dec71 1219 if ((value = get_value (idx))
ae3df618
SB
1220 && value->lattice_val == CONSTANT
1221 && TREE_CODE (value->value) == INTEGER_CST)
1222 idx = value->value;
1223 else
1224 return NULL_TREE;
1225 break;
1226
1227 case INTEGER_CST:
1228 break;
1229
1230 default:
1231 return NULL_TREE;
1232 }
1233
faaf1436
RG
1234 /* Fold read from constant string. */
1235 if (TREE_CODE (ctor) == STRING_CST)
1236 {
1237 if ((TYPE_MODE (TREE_TYPE (t))
1238 == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1239 && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1240 == MODE_INT)
1241 && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1
1242 && compare_tree_int (idx, TREE_STRING_LENGTH (ctor)) < 0)
0c4d4efb
DJ
1243 return build_int_cst_type (TREE_TYPE (t),
1244 (TREE_STRING_POINTER (ctor)
1245 [TREE_INT_CST_LOW (idx)]));
faaf1436
RG
1246 return NULL_TREE;
1247 }
1248
ae3df618 1249 /* Whoo-hoo! I'll fold ya baby. Yeah! */
4038c495
GB
1250 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1251 if (tree_int_cst_equal (cfield, idx))
62bc00e2
RG
1252 {
1253 STRIP_USELESS_TYPE_CONVERSION (cval);
75ccc1e7
RG
1254 if (TREE_CODE (cval) == ADDR_EXPR)
1255 {
1256 tree base = get_base_address (TREE_OPERAND (cval, 0));
1257 if (base && TREE_CODE (base) == VAR_DECL)
1258 add_referenced_var (base);
1259 }
62bc00e2
RG
1260 return cval;
1261 }
ae3df618
SB
1262 break;
1263
1264 case COMPONENT_REF:
1265 /* Get a CONSTRUCTOR. If BASE is a VAR_DECL, get its
1266 DECL_INITIAL. If BASE is a nested reference into another
1267 ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1268 the inner reference. */
1269 base = TREE_OPERAND (t, 0);
1270 switch (TREE_CODE (base))
1271 {
1272 case VAR_DECL:
1273 if (!TREE_READONLY (base)
1274 || TREE_CODE (TREE_TYPE (base)) != RECORD_TYPE
1275 || !targetm.binds_local_p (base))
1276 return NULL_TREE;
1277
1278 ctor = DECL_INITIAL (base);
1279 break;
1280
1281 case ARRAY_REF:
1282 case COMPONENT_REF:
1283 ctor = fold_const_aggregate_ref (base);
1284 break;
1285
1286 default:
1287 return NULL_TREE;
1288 }
1289
1290 if (ctor == NULL_TREE
1291 || TREE_CODE (ctor) != CONSTRUCTOR
1292 || !TREE_STATIC (ctor))
1293 return NULL_TREE;
1294
1295 field = TREE_OPERAND (t, 1);
1296
4038c495
GB
1297 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1298 if (cfield == field
ae3df618 1299 /* FIXME: Handle bit-fields. */
4038c495 1300 && ! DECL_BIT_FIELD (cfield))
62bc00e2
RG
1301 {
1302 STRIP_USELESS_TYPE_CONVERSION (cval);
75ccc1e7
RG
1303 if (TREE_CODE (cval) == ADDR_EXPR)
1304 {
1305 tree base = get_base_address (TREE_OPERAND (cval, 0));
1306 if (base && TREE_CODE (base) == VAR_DECL)
1307 add_referenced_var (base);
1308 }
62bc00e2
RG
1309 return cval;
1310 }
ae3df618
SB
1311 break;
1312
1ebd8d9a
SB
1313 case REALPART_EXPR:
1314 case IMAGPART_EXPR:
1315 {
1316 tree c = fold_const_aggregate_ref (TREE_OPERAND (t, 0));
1317 if (c && TREE_CODE (c) == COMPLEX_CST)
1318 return fold_build1 (TREE_CODE (t), TREE_TYPE (t), c);
1319 break;
1320 }
87e1e42b
RG
1321
1322 case INDIRECT_REF:
1323 {
1324 tree base = TREE_OPERAND (t, 0);
1325 if (TREE_CODE (base) == SSA_NAME
1326 && (value = get_value (base))
1327 && value->lattice_val == CONSTANT
1328 && TREE_CODE (value->value) == ADDR_EXPR)
1329 return fold_const_aggregate_ref (TREE_OPERAND (value->value, 0));
1330 break;
1331 }
1332
ae3df618
SB
1333 default:
1334 break;
1335 }
1336
1337 return NULL_TREE;
1338}
726a989a
RB
1339
1340/* Evaluate statement STMT.
1341 Valid only for assignments, calls, conditionals, and switches. */
6de9cd9a 1342
0bca51f0 1343static prop_value_t
726a989a 1344evaluate_stmt (gimple stmt)
6de9cd9a 1345{
0bca51f0 1346 prop_value_t val;
faaf1436 1347 tree simplified = NULL_TREE;
0bca51f0 1348 ccp_lattice_t likelyvalue = likely_value (stmt);
6ac01510 1349 bool is_constant;
0bca51f0 1350
6ac01510
ILT
1351 fold_defer_overflow_warnings ();
1352
6de9cd9a
DN
1353 /* If the statement is likely to have a CONSTANT result, then try
1354 to fold the statement to determine the constant value. */
726a989a
RB
1355 /* FIXME. This is the only place that we call ccp_fold.
1356 Since likely_value never returns CONSTANT for calls, we will
1357 not attempt to fold them, including builtins that may profit. */
6de9cd9a
DN
1358 if (likelyvalue == CONSTANT)
1359 simplified = ccp_fold (stmt);
1360 /* If the statement is likely to have a VARYING result, then do not
1361 bother folding the statement. */
87e1e42b 1362 else if (likelyvalue == VARYING)
726a989a 1363 {
e0c68ce9 1364 enum gimple_code code = gimple_code (stmt);
726a989a
RB
1365 if (code == GIMPLE_ASSIGN)
1366 {
1367 enum tree_code subcode = gimple_assign_rhs_code (stmt);
1368
1369 /* Other cases cannot satisfy is_gimple_min_invariant
1370 without folding. */
1371 if (get_gimple_rhs_class (subcode) == GIMPLE_SINGLE_RHS)
1372 simplified = gimple_assign_rhs1 (stmt);
1373 }
1374 else if (code == GIMPLE_SWITCH)
1375 simplified = gimple_switch_index (stmt);
1376 else
1377 /* These cannot satisfy is_gimple_min_invariant without folding. */
1378 gcc_assert (code == GIMPLE_CALL || code == GIMPLE_COND);
1379 }
6de9cd9a 1380
6ac01510
ILT
1381 is_constant = simplified && is_gimple_min_invariant (simplified);
1382
1383 fold_undefer_overflow_warnings (is_constant, stmt, 0);
1384
00d382a8
RG
1385 if (dump_file && (dump_flags & TDF_DETAILS))
1386 {
1387 fprintf (dump_file, "which is likely ");
1388 switch (likelyvalue)
1389 {
1390 case CONSTANT:
1391 fprintf (dump_file, "CONSTANT");
1392 break;
1393 case UNDEFINED:
1394 fprintf (dump_file, "UNDEFINED");
1395 break;
1396 case VARYING:
1397 fprintf (dump_file, "VARYING");
1398 break;
1399 default:;
1400 }
1401 fprintf (dump_file, "\n");
1402 }
1403
6ac01510 1404 if (is_constant)
6de9cd9a
DN
1405 {
1406 /* The statement produced a constant value. */
1407 val.lattice_val = CONSTANT;
0bca51f0 1408 val.value = simplified;
6de9cd9a
DN
1409 }
1410 else
1411 {
1412 /* The statement produced a nonconstant value. If the statement
0bca51f0
DN
1413 had UNDEFINED operands, then the result of the statement
1414 should be UNDEFINED. Otherwise, the statement is VARYING. */
106dec71 1415 if (likelyvalue == UNDEFINED)
a318e3ac
SB
1416 val.lattice_val = likelyvalue;
1417 else
1418 val.lattice_val = VARYING;
1419
0bca51f0 1420 val.value = NULL_TREE;
6de9cd9a 1421 }
750628d8
DN
1422
1423 return val;
6de9cd9a
DN
1424}
1425
750628d8 1426/* Visit the assignment statement STMT. Set the value of its LHS to the
0bca51f0
DN
1427 value computed by the RHS and store LHS in *OUTPUT_P. If STMT
1428 creates virtual definitions, set the value of each new name to that
726a989a
RB
1429 of the RHS (if we can derive a constant out of the RHS).
1430 Value-returning call statements also perform an assignment, and
1431 are handled here. */
6de9cd9a 1432
750628d8 1433static enum ssa_prop_result
726a989a 1434visit_assignment (gimple stmt, tree *output_p)
6de9cd9a 1435{
0bca51f0 1436 prop_value_t val;
0bca51f0 1437 enum ssa_prop_result retval;
6de9cd9a 1438
726a989a 1439 tree lhs = gimple_get_lhs (stmt);
6de9cd9a 1440
726a989a
RB
1441 gcc_assert (gimple_code (stmt) != GIMPLE_CALL
1442 || gimple_call_lhs (stmt) != NULL_TREE);
1443
1444 if (gimple_assign_copy_p (stmt))
750628d8 1445 {
726a989a 1446 tree rhs = gimple_assign_rhs1 (stmt);
0bca51f0 1447
726a989a
RB
1448 if (TREE_CODE (rhs) == SSA_NAME)
1449 {
1450 /* For a simple copy operation, we copy the lattice values. */
1451 prop_value_t *nval = get_value (rhs);
1452 val = *nval;
1453 }
0bca51f0 1454 else
726a989a 1455 val = evaluate_stmt (stmt);
750628d8
DN
1456 }
1457 else
726a989a
RB
1458 /* Evaluate the statement, which could be
1459 either a GIMPLE_ASSIGN or a GIMPLE_CALL. */
87e1e42b 1460 val = evaluate_stmt (stmt);
6de9cd9a 1461
0bca51f0 1462 retval = SSA_PROP_NOT_INTERESTING;
6de9cd9a 1463
750628d8 1464 /* Set the lattice value of the statement's output. */
0bca51f0 1465 if (TREE_CODE (lhs) == SSA_NAME)
6de9cd9a 1466 {
0bca51f0
DN
1467 /* If STMT is an assignment to an SSA_NAME, we only have one
1468 value to set. */
1469 if (set_lattice_value (lhs, val))
1470 {
1471 *output_p = lhs;
1472 if (val.lattice_val == VARYING)
1473 retval = SSA_PROP_VARYING;
1474 else
1475 retval = SSA_PROP_INTERESTING;
1476 }
6de9cd9a 1477 }
0bca51f0
DN
1478
1479 return retval;
6de9cd9a
DN
1480}
1481
6de9cd9a 1482
750628d8
DN
1483/* Visit the conditional statement STMT. Return SSA_PROP_INTERESTING
1484 if it can determine which edge will be taken. Otherwise, return
1485 SSA_PROP_VARYING. */
1486
1487static enum ssa_prop_result
726a989a 1488visit_cond_stmt (gimple stmt, edge *taken_edge_p)
6de9cd9a 1489{
0bca51f0 1490 prop_value_t val;
750628d8
DN
1491 basic_block block;
1492
726a989a 1493 block = gimple_bb (stmt);
750628d8
DN
1494 val = evaluate_stmt (stmt);
1495
1496 /* Find which edge out of the conditional block will be taken and add it
1497 to the worklist. If no single edge can be determined statically,
1498 return SSA_PROP_VARYING to feed all the outgoing edges to the
1499 propagation engine. */
0bca51f0 1500 *taken_edge_p = val.value ? find_taken_edge (block, val.value) : 0;
750628d8
DN
1501 if (*taken_edge_p)
1502 return SSA_PROP_INTERESTING;
1503 else
1504 return SSA_PROP_VARYING;
6de9cd9a
DN
1505}
1506
6de9cd9a 1507
750628d8
DN
1508/* Evaluate statement STMT. If the statement produces an output value and
1509 its evaluation changes the lattice value of its output, return
1510 SSA_PROP_INTERESTING and set *OUTPUT_P to the SSA_NAME holding the
1511 output value.
1512
1513 If STMT is a conditional branch and we can determine its truth
1514 value, set *TAKEN_EDGE_P accordingly. If STMT produces a varying
1515 value, return SSA_PROP_VARYING. */
6de9cd9a 1516
750628d8 1517static enum ssa_prop_result
726a989a 1518ccp_visit_stmt (gimple stmt, edge *taken_edge_p, tree *output_p)
750628d8 1519{
750628d8
DN
1520 tree def;
1521 ssa_op_iter iter;
6de9cd9a 1522
750628d8 1523 if (dump_file && (dump_flags & TDF_DETAILS))
6de9cd9a 1524 {
0bca51f0 1525 fprintf (dump_file, "\nVisiting statement:\n");
726a989a 1526 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
6de9cd9a 1527 }
6de9cd9a 1528
726a989a 1529 switch (gimple_code (stmt))
6de9cd9a 1530 {
726a989a
RB
1531 case GIMPLE_ASSIGN:
1532 /* If the statement is an assignment that produces a single
1533 output value, evaluate its RHS to see if the lattice value of
1534 its output has changed. */
1535 return visit_assignment (stmt, output_p);
1536
1537 case GIMPLE_CALL:
1538 /* A value-returning call also performs an assignment. */
1539 if (gimple_call_lhs (stmt) != NULL_TREE)
1540 return visit_assignment (stmt, output_p);
1541 break;
1542
1543 case GIMPLE_COND:
1544 case GIMPLE_SWITCH:
1545 /* If STMT is a conditional branch, see if we can determine
1546 which branch will be taken. */
1547 /* FIXME. It appears that we should be able to optimize
1548 computed GOTOs here as well. */
1549 return visit_cond_stmt (stmt, taken_edge_p);
1550
1551 default:
1552 break;
6de9cd9a 1553 }
6de9cd9a 1554
750628d8
DN
1555 /* Any other kind of statement is not interesting for constant
1556 propagation and, therefore, not worth simulating. */
750628d8
DN
1557 if (dump_file && (dump_flags & TDF_DETAILS))
1558 fprintf (dump_file, "No interesting values produced. Marked VARYING.\n");
6de9cd9a 1559
750628d8
DN
1560 /* Definitions made by statements other than assignments to
1561 SSA_NAMEs represent unknown modifications to their outputs.
1562 Mark them VARYING. */
0bca51f0
DN
1563 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
1564 {
dce2b2f6 1565 prop_value_t v = { VARYING, NULL_TREE };
0bca51f0
DN
1566 set_lattice_value (def, v);
1567 }
6de9cd9a 1568
750628d8
DN
1569 return SSA_PROP_VARYING;
1570}
6de9cd9a 1571
6de9cd9a 1572
0bca51f0 1573/* Main entry point for SSA Conditional Constant Propagation. */
750628d8 1574
3253eafb 1575static unsigned int
dce2b2f6 1576do_ssa_ccp (void)
750628d8
DN
1577{
1578 ccp_initialize ();
1579 ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node);
3253eafb 1580 if (ccp_finalize ())
706ca88e 1581 return (TODO_cleanup_cfg | TODO_update_ssa | TODO_remove_unused_locals);
3253eafb
JH
1582 else
1583 return 0;
6de9cd9a
DN
1584}
1585
173b818d
BB
1586
1587static bool
750628d8 1588gate_ccp (void)
173b818d 1589{
750628d8 1590 return flag_tree_ccp != 0;
173b818d
BB
1591}
1592
6de9cd9a 1593
8ddbbcae 1594struct gimple_opt_pass pass_ccp =
750628d8 1595{
8ddbbcae
JH
1596 {
1597 GIMPLE_PASS,
750628d8
DN
1598 "ccp", /* name */
1599 gate_ccp, /* gate */
0bca51f0 1600 do_ssa_ccp, /* execute */
750628d8
DN
1601 NULL, /* sub */
1602 NULL, /* next */
1603 0, /* static_pass_number */
1604 TV_TREE_CCP, /* tv_id */
7faade0f 1605 PROP_cfg | PROP_ssa, /* properties_required */
750628d8 1606 0, /* properties_provided */
ae07b463 1607 0, /* properties_destroyed */
750628d8 1608 0, /* todo_flags_start */
3253eafb 1609 TODO_dump_func | TODO_verify_ssa
8ddbbcae
JH
1610 | TODO_verify_stmts | TODO_ggc_collect/* todo_flags_finish */
1611 }
750628d8 1612};
6de9cd9a 1613
6de9cd9a 1614
6de9cd9a
DN
1615/* A subroutine of fold_stmt_r. Attempts to fold *(A+O) to A[X].
1616 BASE is an array type. OFFSET is a byte displacement. ORIG_TYPE
9cf737f8 1617 is the desired result type. */
6de9cd9a
DN
1618
1619static tree
1fd89060
RG
1620maybe_fold_offset_to_array_ref (tree base, tree offset, tree orig_type,
1621 bool allow_negative_idx)
6de9cd9a 1622{
891fc5e9 1623 tree min_idx, idx, idx_type, elt_offset = integer_zero_node;
44de5aeb 1624 tree array_type, elt_type, elt_size;
3097760b 1625 tree domain_type;
44de5aeb
RK
1626
1627 /* If BASE is an ARRAY_REF, we can pick up another offset (this time
1628 measured in units of the size of elements type) from that ARRAY_REF).
1629 We can't do anything if either is variable.
1630
1631 The case we handle here is *(&A[N]+O). */
1632 if (TREE_CODE (base) == ARRAY_REF)
1633 {
1634 tree low_bound = array_ref_low_bound (base);
1635
1636 elt_offset = TREE_OPERAND (base, 1);
1637 if (TREE_CODE (low_bound) != INTEGER_CST
1638 || TREE_CODE (elt_offset) != INTEGER_CST)
1639 return NULL_TREE;
1640
1641 elt_offset = int_const_binop (MINUS_EXPR, elt_offset, low_bound, 0);
1642 base = TREE_OPERAND (base, 0);
1643 }
6de9cd9a
DN
1644
1645 /* Ignore stupid user tricks of indexing non-array variables. */
1646 array_type = TREE_TYPE (base);
1647 if (TREE_CODE (array_type) != ARRAY_TYPE)
1648 return NULL_TREE;
1649 elt_type = TREE_TYPE (array_type);
f4088621 1650 if (!useless_type_conversion_p (orig_type, elt_type))
6de9cd9a 1651 return NULL_TREE;
891fc5e9
RG
1652
1653 /* Use signed size type for intermediate computation on the index. */
1654 idx_type = signed_type_for (size_type_node);
1655
44de5aeb
RK
1656 /* If OFFSET and ELT_OFFSET are zero, we don't care about the size of the
1657 element type (so we can use the alignment if it's not constant).
1658 Otherwise, compute the offset as an index by using a division. If the
1659 division isn't exact, then don't do anything. */
6de9cd9a 1660 elt_size = TYPE_SIZE_UNIT (elt_type);
fe9821b8
JH
1661 if (!elt_size)
1662 return NULL;
44de5aeb
RK
1663 if (integer_zerop (offset))
1664 {
1665 if (TREE_CODE (elt_size) != INTEGER_CST)
1666 elt_size = size_int (TYPE_ALIGN (elt_type));
6de9cd9a 1667
891fc5e9 1668 idx = build_int_cst (idx_type, 0);
44de5aeb
RK
1669 }
1670 else
1671 {
1672 unsigned HOST_WIDE_INT lquo, lrem;
1673 HOST_WIDE_INT hquo, hrem;
891fc5e9 1674 double_int soffset;
44de5aeb 1675
891fc5e9
RG
1676 /* The final array offset should be signed, so we need
1677 to sign-extend the (possibly pointer) offset here
1678 and use signed division. */
1679 soffset = double_int_sext (tree_to_double_int (offset),
1680 TYPE_PRECISION (TREE_TYPE (offset)));
44de5aeb 1681 if (TREE_CODE (elt_size) != INTEGER_CST
891fc5e9
RG
1682 || div_and_round_double (TRUNC_DIV_EXPR, 0,
1683 soffset.low, soffset.high,
44de5aeb
RK
1684 TREE_INT_CST_LOW (elt_size),
1685 TREE_INT_CST_HIGH (elt_size),
1686 &lquo, &hquo, &lrem, &hrem)
1687 || lrem || hrem)
1688 return NULL_TREE;
6de9cd9a 1689
891fc5e9 1690 idx = build_int_cst_wide (idx_type, lquo, hquo);
44de5aeb
RK
1691 }
1692
1693 /* Assume the low bound is zero. If there is a domain type, get the
1694 low bound, if any, convert the index into that type, and add the
1695 low bound. */
891fc5e9 1696 min_idx = build_int_cst (idx_type, 0);
3097760b
JH
1697 domain_type = TYPE_DOMAIN (array_type);
1698 if (domain_type)
6de9cd9a 1699 {
3097760b 1700 idx_type = domain_type;
891fc5e9
RG
1701 if (TYPE_MIN_VALUE (idx_type))
1702 min_idx = TYPE_MIN_VALUE (idx_type);
44de5aeb 1703 else
891fc5e9 1704 min_idx = fold_convert (idx_type, min_idx);
44de5aeb
RK
1705
1706 if (TREE_CODE (min_idx) != INTEGER_CST)
1707 return NULL_TREE;
1708
891fc5e9 1709 elt_offset = fold_convert (idx_type, elt_offset);
6de9cd9a
DN
1710 }
1711
44de5aeb
RK
1712 if (!integer_zerop (min_idx))
1713 idx = int_const_binop (PLUS_EXPR, idx, min_idx, 0);
1714 if (!integer_zerop (elt_offset))
1715 idx = int_const_binop (PLUS_EXPR, idx, elt_offset, 0);
1716
891fc5e9
RG
1717 /* Make sure to possibly truncate late after offsetting. */
1718 idx = fold_convert (idx_type, idx);
1719
3097760b 1720 /* We don't want to construct access past array bounds. For example
1fd89060
RG
1721 char *(c[4]);
1722 c[3][2];
1723 should not be simplified into (*c)[14] or tree-vrp will
1724 give false warnings. The same is true for
1725 struct A { long x; char d[0]; } *a;
1726 (char *)a - 4;
1727 which should be not folded to &a->d[-8]. */
1728 if (domain_type
1729 && TYPE_MAX_VALUE (domain_type)
3097760b
JH
1730 && TREE_CODE (TYPE_MAX_VALUE (domain_type)) == INTEGER_CST)
1731 {
1732 tree up_bound = TYPE_MAX_VALUE (domain_type);
1733
1734 if (tree_int_cst_lt (up_bound, idx)
1735 /* Accesses after the end of arrays of size 0 (gcc
1736 extension) and 1 are likely intentional ("struct
1737 hack"). */
1738 && compare_tree_int (up_bound, 1) > 0)
1739 return NULL_TREE;
1740 }
1fd89060
RG
1741 if (domain_type
1742 && TYPE_MIN_VALUE (domain_type))
1743 {
1744 if (!allow_negative_idx
1745 && TREE_CODE (TYPE_MIN_VALUE (domain_type)) == INTEGER_CST
1746 && tree_int_cst_lt (idx, TYPE_MIN_VALUE (domain_type)))
1747 return NULL_TREE;
1748 }
1749 else if (!allow_negative_idx
1750 && compare_tree_int (idx, 0) < 0)
1751 return NULL_TREE;
3097760b 1752
04d86531 1753 return build4 (ARRAY_REF, elt_type, base, idx, NULL_TREE, NULL_TREE);
6de9cd9a
DN
1754}
1755
750628d8 1756
fe9821b8 1757/* Attempt to fold *(S+O) to S.X.
6de9cd9a
DN
1758 BASE is a record type. OFFSET is a byte displacement. ORIG_TYPE
1759 is the desired result type. */
6de9cd9a 1760
fe9821b8 1761static tree
6de9cd9a
DN
1762maybe_fold_offset_to_component_ref (tree record_type, tree base, tree offset,
1763 tree orig_type, bool base_is_ptr)
1764{
f34fa464 1765 tree f, t, field_type, tail_array_field, field_offset;
6e6e19cb
JH
1766 tree ret;
1767 tree new_base;
6de9cd9a
DN
1768
1769 if (TREE_CODE (record_type) != RECORD_TYPE
1770 && TREE_CODE (record_type) != UNION_TYPE
1771 && TREE_CODE (record_type) != QUAL_UNION_TYPE)
1772 return NULL_TREE;
1773
1774 /* Short-circuit silly cases. */
f4088621 1775 if (useless_type_conversion_p (record_type, orig_type))
6de9cd9a
DN
1776 return NULL_TREE;
1777
1778 tail_array_field = NULL_TREE;
1779 for (f = TYPE_FIELDS (record_type); f ; f = TREE_CHAIN (f))
1780 {
1781 int cmp;
1782
1783 if (TREE_CODE (f) != FIELD_DECL)
1784 continue;
1785 if (DECL_BIT_FIELD (f))
1786 continue;
f34fa464 1787
fe9821b8
JH
1788 if (!DECL_FIELD_OFFSET (f))
1789 continue;
f34fa464
ZD
1790 field_offset = byte_position (f);
1791 if (TREE_CODE (field_offset) != INTEGER_CST)
6de9cd9a
DN
1792 continue;
1793
1794 /* ??? Java creates "interesting" fields for representing base classes.
1795 They have no name, and have no context. With no context, we get into
1796 trouble with nonoverlapping_component_refs_p. Skip them. */
1797 if (!DECL_FIELD_CONTEXT (f))
1798 continue;
1799
1800 /* The previous array field isn't at the end. */
1801 tail_array_field = NULL_TREE;
1802
1803 /* Check to see if this offset overlaps with the field. */
f34fa464 1804 cmp = tree_int_cst_compare (field_offset, offset);
6de9cd9a
DN
1805 if (cmp > 0)
1806 continue;
1807
1808 field_type = TREE_TYPE (f);
6de9cd9a
DN
1809
1810 /* Here we exactly match the offset being checked. If the types match,
1811 then we can return that field. */
53dba802 1812 if (cmp == 0
f4088621 1813 && useless_type_conversion_p (orig_type, field_type))
6de9cd9a
DN
1814 {
1815 if (base_is_ptr)
1816 base = build1 (INDIRECT_REF, record_type, base);
b4257cfc 1817 t = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE);
6de9cd9a
DN
1818 return t;
1819 }
53dba802
ZD
1820
1821 /* Don't care about offsets into the middle of scalars. */
1822 if (!AGGREGATE_TYPE_P (field_type))
1823 continue;
6de9cd9a 1824
53dba802
ZD
1825 /* Check for array at the end of the struct. This is often
1826 used as for flexible array members. We should be able to
1827 turn this into an array access anyway. */
1828 if (TREE_CODE (field_type) == ARRAY_TYPE)
1829 tail_array_field = f;
1830
1831 /* Check the end of the field against the offset. */
1832 if (!DECL_SIZE_UNIT (f)
1833 || TREE_CODE (DECL_SIZE_UNIT (f)) != INTEGER_CST)
1834 continue;
1835 t = int_const_binop (MINUS_EXPR, offset, field_offset, 1);
1836 if (!tree_int_cst_lt (t, DECL_SIZE_UNIT (f)))
1837 continue;
6de9cd9a 1838
53dba802
ZD
1839 /* If we matched, then set offset to the displacement into
1840 this field. */
6e6e19cb
JH
1841 if (base_is_ptr)
1842 new_base = build1 (INDIRECT_REF, record_type, base);
1843 else
1844 new_base = base;
1845 new_base = build3 (COMPONENT_REF, field_type, new_base, f, NULL_TREE);
1846
1847 /* Recurse to possibly find the match. */
1fd89060
RG
1848 ret = maybe_fold_offset_to_array_ref (new_base, t, orig_type,
1849 f == TYPE_FIELDS (record_type));
6e6e19cb
JH
1850 if (ret)
1851 return ret;
1852 ret = maybe_fold_offset_to_component_ref (field_type, new_base, t,
1853 orig_type, false);
1854 if (ret)
1855 return ret;
6de9cd9a
DN
1856 }
1857
1858 if (!tail_array_field)
1859 return NULL_TREE;
1860
1861 f = tail_array_field;
1862 field_type = TREE_TYPE (f);
53dba802 1863 offset = int_const_binop (MINUS_EXPR, offset, byte_position (f), 1);
6de9cd9a 1864
6de9cd9a 1865 /* If we get here, we've got an aggregate field, and a possibly
1ea7e6ad 1866 nonzero offset into them. Recurse and hope for a valid match. */
6de9cd9a
DN
1867 if (base_is_ptr)
1868 base = build1 (INDIRECT_REF, record_type, base);
b4257cfc 1869 base = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE);
6de9cd9a 1870
1fd89060
RG
1871 t = maybe_fold_offset_to_array_ref (base, offset, orig_type,
1872 f == TYPE_FIELDS (record_type));
6de9cd9a
DN
1873 if (t)
1874 return t;
1875 return maybe_fold_offset_to_component_ref (field_type, base, offset,
1876 orig_type, false);
1877}
1878
fe9821b8
JH
1879/* Attempt to express (ORIG_TYPE)BASE+OFFSET as BASE->field_of_orig_type
1880 or BASE[index] or by combination of those.
1881
1882 Before attempting the conversion strip off existing ADDR_EXPRs and
1883 handled component refs. */
1884
1885tree
1886maybe_fold_offset_to_reference (tree base, tree offset, tree orig_type)
1887{
1888 tree ret;
1889 tree type;
1890 bool base_is_ptr = true;
1891
1892 STRIP_NOPS (base);
1893 if (TREE_CODE (base) == ADDR_EXPR)
1894 {
1895 base_is_ptr = false;
1896
1897 base = TREE_OPERAND (base, 0);
1898
1899 /* Handle case where existing COMPONENT_REF pick e.g. wrong field of union,
1900 so it needs to be removed and new COMPONENT_REF constructed.
1901 The wrong COMPONENT_REF are often constructed by folding the
1902 (type *)&object within the expression (type *)&object+offset */
99f536cc 1903 if (handled_component_p (base))
fe9821b8
JH
1904 {
1905 HOST_WIDE_INT sub_offset, size, maxsize;
1906 tree newbase;
1907 newbase = get_ref_base_and_extent (base, &sub_offset,
1908 &size, &maxsize);
1909 gcc_assert (newbase);
99f536cc 1910 if (size == maxsize
a214f4d6 1911 && size != -1
99f536cc 1912 && !(sub_offset & (BITS_PER_UNIT - 1)))
fe9821b8
JH
1913 {
1914 base = newbase;
1915 if (sub_offset)
1916 offset = int_const_binop (PLUS_EXPR, offset,
1917 build_int_cst (TREE_TYPE (offset),
1918 sub_offset / BITS_PER_UNIT), 1);
1919 }
1920 }
f4088621 1921 if (useless_type_conversion_p (orig_type, TREE_TYPE (base))
fe9821b8
JH
1922 && integer_zerop (offset))
1923 return base;
1924 type = TREE_TYPE (base);
1925 }
1926 else
1927 {
1928 base_is_ptr = true;
1929 if (!POINTER_TYPE_P (TREE_TYPE (base)))
1930 return NULL_TREE;
1931 type = TREE_TYPE (TREE_TYPE (base));
1932 }
1933 ret = maybe_fold_offset_to_component_ref (type, base, offset,
1934 orig_type, base_is_ptr);
1935 if (!ret)
1936 {
1937 if (base_is_ptr)
1938 base = build1 (INDIRECT_REF, type, base);
1fd89060 1939 ret = maybe_fold_offset_to_array_ref (base, offset, orig_type, true);
fe9821b8
JH
1940 }
1941 return ret;
1942}
750628d8 1943
99f536cc
RG
1944/* Attempt to express (ORIG_TYPE)&BASE+OFFSET as &BASE->field_of_orig_type
1945 or &BASE[index] or by combination of those.
1946
1947 Before attempting the conversion strip off existing component refs. */
1948
1949tree
1950maybe_fold_offset_to_address (tree addr, tree offset, tree orig_type)
1951{
1952 tree t;
1953
1954 gcc_assert (POINTER_TYPE_P (TREE_TYPE (addr))
1955 && POINTER_TYPE_P (orig_type));
1956
1957 t = maybe_fold_offset_to_reference (addr, offset, TREE_TYPE (orig_type));
1958 if (t != NULL_TREE)
1959 {
1960 tree orig = addr;
1961 tree ptr_type;
1962
1963 /* For __builtin_object_size to function correctly we need to
1964 make sure not to fold address arithmetic so that we change
1965 reference from one array to another. This would happen for
1966 example for
1967
1968 struct X { char s1[10]; char s2[10] } s;
1969 char *foo (void) { return &s.s2[-4]; }
1970
1971 where we need to avoid generating &s.s1[6]. As the C and
1972 C++ frontends create different initial trees
1973 (char *) &s.s1 + -4 vs. &s.s1[-4] we have to do some
1974 sophisticated comparisons here. Note that checking for the
1975 condition after the fact is easier than trying to avoid doing
1976 the folding. */
1977 STRIP_NOPS (orig);
1978 if (TREE_CODE (orig) == ADDR_EXPR)
1979 orig = TREE_OPERAND (orig, 0);
1980 if ((TREE_CODE (orig) == ARRAY_REF
1981 || (TREE_CODE (orig) == COMPONENT_REF
1982 && TREE_CODE (TREE_TYPE (TREE_OPERAND (orig, 1))) == ARRAY_TYPE))
1983 && (TREE_CODE (t) == ARRAY_REF
f07049c8 1984 || TREE_CODE (t) == COMPONENT_REF)
99f536cc
RG
1985 && !operand_equal_p (TREE_CODE (orig) == ARRAY_REF
1986 ? TREE_OPERAND (orig, 0) : orig,
1987 TREE_CODE (t) == ARRAY_REF
1988 ? TREE_OPERAND (t, 0) : t, 0))
1989 return NULL_TREE;
1990
1991 ptr_type = build_pointer_type (TREE_TYPE (t));
1992 if (!useless_type_conversion_p (orig_type, ptr_type))
1993 return NULL_TREE;
1994 return build_fold_addr_expr_with_type (t, ptr_type);
1995 }
1996
1997 return NULL_TREE;
1998}
1999
6de9cd9a
DN
2000/* A subroutine of fold_stmt_r. Attempt to simplify *(BASE+OFFSET).
2001 Return the simplified expression, or NULL if nothing could be done. */
2002
2003static tree
2004maybe_fold_stmt_indirect (tree expr, tree base, tree offset)
2005{
2006 tree t;
cbf8d355 2007 bool volatile_p = TREE_THIS_VOLATILE (expr);
6de9cd9a
DN
2008
2009 /* We may well have constructed a double-nested PLUS_EXPR via multiple
2010 substitutions. Fold that down to one. Remove NON_LVALUE_EXPRs that
2011 are sometimes added. */
2012 base = fold (base);
ff7c8597 2013 STRIP_TYPE_NOPS (base);
6de9cd9a
DN
2014 TREE_OPERAND (expr, 0) = base;
2015
2016 /* One possibility is that the address reduces to a string constant. */
2017 t = fold_read_from_constant_string (expr);
2018 if (t)
2019 return t;
2020
5be014d5
AP
2021 /* Add in any offset from a POINTER_PLUS_EXPR. */
2022 if (TREE_CODE (base) == POINTER_PLUS_EXPR)
6de9cd9a
DN
2023 {
2024 tree offset2;
2025
2026 offset2 = TREE_OPERAND (base, 1);
2027 if (TREE_CODE (offset2) != INTEGER_CST)
2028 return NULL_TREE;
2029 base = TREE_OPERAND (base, 0);
2030
5be014d5
AP
2031 offset = fold_convert (sizetype,
2032 int_const_binop (PLUS_EXPR, offset, offset2, 1));
6de9cd9a
DN
2033 }
2034
2035 if (TREE_CODE (base) == ADDR_EXPR)
2036 {
fe9821b8
JH
2037 tree base_addr = base;
2038
6de9cd9a
DN
2039 /* Strip the ADDR_EXPR. */
2040 base = TREE_OPERAND (base, 0);
2041
0534fa56
RH
2042 /* Fold away CONST_DECL to its value, if the type is scalar. */
2043 if (TREE_CODE (base) == CONST_DECL
1b738915 2044 && is_gimple_min_invariant (DECL_INITIAL (base)))
0534fa56
RH
2045 return DECL_INITIAL (base);
2046
6de9cd9a 2047 /* Try folding *(&B+O) to B.X. */
fe9821b8
JH
2048 t = maybe_fold_offset_to_reference (base_addr, offset,
2049 TREE_TYPE (expr));
6de9cd9a 2050 if (t)
cbf8d355 2051 {
e2104f59
RG
2052 /* Preserve volatileness of the original expression.
2053 We can end up with a plain decl here which is shared
2054 and we shouldn't mess with its flags. */
2055 if (!SSA_VAR_P (t))
2056 TREE_THIS_VOLATILE (t) = volatile_p;
cbf8d355
RG
2057 return t;
2058 }
6de9cd9a
DN
2059 }
2060 else
2061 {
2062 /* We can get here for out-of-range string constant accesses,
2063 such as "_"[3]. Bail out of the entire substitution search
2064 and arrange for the entire statement to be replaced by a
aabcd309 2065 call to __builtin_trap. In all likelihood this will all be
6de9cd9a
DN
2066 constant-folded away, but in the meantime we can't leave with
2067 something that get_expr_operands can't understand. */
2068
2069 t = base;
2070 STRIP_NOPS (t);
2071 if (TREE_CODE (t) == ADDR_EXPR
2072 && TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST)
2073 {
2074 /* FIXME: Except that this causes problems elsewhere with dead
0e61db61 2075 code not being deleted, and we die in the rtl expanders
6de9cd9a
DN
2076 because we failed to remove some ssa_name. In the meantime,
2077 just return zero. */
2078 /* FIXME2: This condition should be signaled by
2079 fold_read_from_constant_string directly, rather than
2080 re-checking for it here. */
2081 return integer_zero_node;
2082 }
2083
2084 /* Try folding *(B+O) to B->X. Still an improvement. */
2085 if (POINTER_TYPE_P (TREE_TYPE (base)))
2086 {
fe9821b8
JH
2087 t = maybe_fold_offset_to_reference (base, offset,
2088 TREE_TYPE (expr));
6de9cd9a
DN
2089 if (t)
2090 return t;
2091 }
2092 }
2093
2094 /* Otherwise we had an offset that we could not simplify. */
2095 return NULL_TREE;
2096}
2097
750628d8 2098
726a989a 2099/* A quaint feature extant in our address arithmetic is that there
6de9cd9a
DN
2100 can be hidden type changes here. The type of the result need
2101 not be the same as the type of the input pointer.
2102
2103 What we're after here is an expression of the form
2104 (T *)(&array + const)
726a989a
RB
2105 where array is OP0, const is OP1, RES_TYPE is T and
2106 the cast doesn't actually exist, but is implicit in the
5be014d5 2107 type of the POINTER_PLUS_EXPR. We'd like to turn this into
6de9cd9a
DN
2108 &array[x]
2109 which may be able to propagate further. */
2110
726a989a
RB
2111tree
2112maybe_fold_stmt_addition (tree res_type, tree op0, tree op1)
6de9cd9a 2113{
6de9cd9a
DN
2114 tree ptd_type;
2115 tree t;
6de9cd9a 2116
6de9cd9a
DN
2117 /* The first operand should be an ADDR_EXPR. */
2118 if (TREE_CODE (op0) != ADDR_EXPR)
2119 return NULL_TREE;
2120 op0 = TREE_OPERAND (op0, 0);
2121
f76968e6
RG
2122 /* It had better be a constant. */
2123 if (TREE_CODE (op1) != INTEGER_CST)
2124 {
2125 /* Or op0 should now be A[0] and the non-constant offset defined
2126 via a multiplication by the array element size. */
2127 if (TREE_CODE (op0) == ARRAY_REF
2128 && integer_zerop (TREE_OPERAND (op0, 1))
2129 && TREE_CODE (op1) == SSA_NAME
2130 && host_integerp (TYPE_SIZE_UNIT (TREE_TYPE (op0)), 1))
2131 {
2132 gimple offset_def = SSA_NAME_DEF_STMT (op1);
2133 if (!is_gimple_assign (offset_def))
2134 return NULL_TREE;
2135
2136 if (gimple_assign_rhs_code (offset_def) == MULT_EXPR
2137 && TREE_CODE (gimple_assign_rhs2 (offset_def)) == INTEGER_CST
2138 && tree_int_cst_equal (gimple_assign_rhs2 (offset_def),
2139 TYPE_SIZE_UNIT (TREE_TYPE (op0))))
2140 return build1 (ADDR_EXPR, res_type,
2141 build4 (ARRAY_REF, TREE_TYPE (op0),
2142 TREE_OPERAND (op0, 0),
2143 gimple_assign_rhs1 (offset_def),
2144 TREE_OPERAND (op0, 2),
2145 TREE_OPERAND (op0, 3)));
2146 else if (integer_onep (TYPE_SIZE_UNIT (TREE_TYPE (op0)))
2147 && gimple_assign_rhs_code (offset_def) != MULT_EXPR)
2148 return build1 (ADDR_EXPR, res_type,
2149 build4 (ARRAY_REF, TREE_TYPE (op0),
2150 TREE_OPERAND (op0, 0),
2151 op1,
2152 TREE_OPERAND (op0, 2),
2153 TREE_OPERAND (op0, 3)));
2154 }
2155 return NULL_TREE;
2156 }
2157
6de9cd9a
DN
2158 /* If the first operand is an ARRAY_REF, expand it so that we can fold
2159 the offset into it. */
2160 while (TREE_CODE (op0) == ARRAY_REF)
2161 {
2162 tree array_obj = TREE_OPERAND (op0, 0);
2163 tree array_idx = TREE_OPERAND (op0, 1);
2164 tree elt_type = TREE_TYPE (op0);
2165 tree elt_size = TYPE_SIZE_UNIT (elt_type);
2166 tree min_idx;
2167
2168 if (TREE_CODE (array_idx) != INTEGER_CST)
2169 break;
2170 if (TREE_CODE (elt_size) != INTEGER_CST)
2171 break;
2172
2173 /* Un-bias the index by the min index of the array type. */
2174 min_idx = TYPE_DOMAIN (TREE_TYPE (array_obj));
2175 if (min_idx)
2176 {
2177 min_idx = TYPE_MIN_VALUE (min_idx);
2178 if (min_idx)
2179 {
44de5aeb
RK
2180 if (TREE_CODE (min_idx) != INTEGER_CST)
2181 break;
2182
b6f65e3c 2183 array_idx = fold_convert (TREE_TYPE (min_idx), array_idx);
6de9cd9a
DN
2184 if (!integer_zerop (min_idx))
2185 array_idx = int_const_binop (MINUS_EXPR, array_idx,
2186 min_idx, 0);
2187 }
2188 }
2189
2190 /* Convert the index to a byte offset. */
b6f65e3c 2191 array_idx = fold_convert (sizetype, array_idx);
6de9cd9a
DN
2192 array_idx = int_const_binop (MULT_EXPR, array_idx, elt_size, 0);
2193
2194 /* Update the operands for the next round, or for folding. */
5be014d5 2195 op1 = int_const_binop (PLUS_EXPR,
6de9cd9a 2196 array_idx, op1, 0);
6de9cd9a
DN
2197 op0 = array_obj;
2198 }
2199
726a989a 2200 ptd_type = TREE_TYPE (res_type);
c4e5b5a8
RG
2201 /* If we want a pointer to void, reconstruct the reference from the
2202 array element type. A pointer to that can be trivially converted
2203 to void *. This happens as we fold (void *)(ptr p+ off). */
2204 if (VOID_TYPE_P (ptd_type)
2205 && TREE_CODE (TREE_TYPE (op0)) == ARRAY_TYPE)
2206 ptd_type = TREE_TYPE (TREE_TYPE (op0));
6de9cd9a
DN
2207
2208 /* At which point we can try some of the same things as for indirects. */
1fd89060 2209 t = maybe_fold_offset_to_array_ref (op0, op1, ptd_type, true);
6de9cd9a
DN
2210 if (!t)
2211 t = maybe_fold_offset_to_component_ref (TREE_TYPE (op0), op0, op1,
2212 ptd_type, false);
2213 if (t)
726a989a 2214 t = build1 (ADDR_EXPR, res_type, t);
6de9cd9a
DN
2215
2216 return t;
2217}
2218
622f91ba
JL
2219/* For passing state through walk_tree into fold_stmt_r and its
2220 children. */
2221
2222struct fold_stmt_r_data
2223{
726a989a 2224 gimple stmt;
6ac01510
ILT
2225 bool *changed_p;
2226 bool *inside_addr_expr_p;
622f91ba
JL
2227};
2228
6de9cd9a
DN
2229/* Subroutine of fold_stmt called via walk_tree. We perform several
2230 simplifications of EXPR_P, mostly having to do with pointer arithmetic. */
2231
2232static tree
2233fold_stmt_r (tree *expr_p, int *walk_subtrees, void *data)
2234{
726a989a
RB
2235 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
2236 struct fold_stmt_r_data *fold_stmt_r_data;
2237 bool *inside_addr_expr_p;
2238 bool *changed_p;
6de9cd9a 2239 tree expr = *expr_p, t;
6aaa4013 2240 bool volatile_p = TREE_THIS_VOLATILE (expr);
6de9cd9a 2241
726a989a
RB
2242 fold_stmt_r_data = (struct fold_stmt_r_data *) wi->info;
2243 inside_addr_expr_p = fold_stmt_r_data->inside_addr_expr_p;
2244 changed_p = fold_stmt_r_data->changed_p;
2245
6de9cd9a
DN
2246 /* ??? It'd be nice if walk_tree had a pre-order option. */
2247 switch (TREE_CODE (expr))
2248 {
2249 case INDIRECT_REF:
2250 t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
2251 if (t)
2252 return t;
2253 *walk_subtrees = 0;
2254
2255 t = maybe_fold_stmt_indirect (expr, TREE_OPERAND (expr, 0),
2256 integer_zero_node);
bab4e8fb
JJ
2257 /* Avoid folding *"abc" = 5 into 'a' = 5. */
2258 if (wi->is_lhs && t && TREE_CODE (t) == INTEGER_CST)
2259 t = NULL_TREE;
16ac8575
RG
2260 if (!t
2261 && TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR)
2262 /* If we had a good reason for propagating the address here,
2263 make sure we end up with valid gimple. See PR34989. */
2264 t = TREE_OPERAND (TREE_OPERAND (expr, 0), 0);
6de9cd9a
DN
2265 break;
2266
fe9821b8
JH
2267 case NOP_EXPR:
2268 t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
2269 if (t)
2270 return t;
2271 *walk_subtrees = 0;
2272
2273 if (POINTER_TYPE_P (TREE_TYPE (expr))
129a37fc 2274 && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (expr)))
fe9821b8 2275 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0)))
99f536cc
RG
2276 && (t = maybe_fold_offset_to_address (TREE_OPERAND (expr, 0),
2277 integer_zero_node,
2278 TREE_TYPE (TREE_TYPE (expr)))))
2279 return t;
fe9821b8
JH
2280 break;
2281
622f91ba 2282 /* ??? Could handle more ARRAY_REFs here, as a variant of INDIRECT_REF.
6de9cd9a
DN
2283 We'd only want to bother decomposing an existing ARRAY_REF if
2284 the base array is found to have another offset contained within.
2285 Otherwise we'd be wasting time. */
622f91ba
JL
2286 case ARRAY_REF:
2287 /* If we are not processing expressions found within an
bab4e8fb
JJ
2288 ADDR_EXPR, then we can fold constant array references.
2289 Don't fold on LHS either, to avoid folding "abc"[0] = 5
2290 into 'a' = 5. */
2291 if (!*inside_addr_expr_p && !wi->is_lhs)
622f91ba
JL
2292 t = fold_read_from_constant_string (expr);
2293 else
2294 t = NULL;
2295 break;
6de9cd9a
DN
2296
2297 case ADDR_EXPR:
622f91ba 2298 *inside_addr_expr_p = true;
6de9cd9a 2299 t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
622f91ba 2300 *inside_addr_expr_p = false;
6de9cd9a
DN
2301 if (t)
2302 return t;
2303 *walk_subtrees = 0;
2304
51eed280
PB
2305 /* Make sure the value is properly considered constant, and so gets
2306 propagated as expected. */
6de9cd9a 2307 if (*changed_p)
127203ac 2308 recompute_tree_invariant_for_addr_expr (expr);
6de9cd9a
DN
2309 return NULL_TREE;
2310
6de9cd9a
DN
2311 case COMPONENT_REF:
2312 t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
2313 if (t)
2314 return t;
2315 *walk_subtrees = 0;
2316
fa27426e
RH
2317 /* Make sure the FIELD_DECL is actually a field in the type on the lhs.
2318 We've already checked that the records are compatible, so we should
2319 come up with a set of compatible fields. */
2320 {
2321 tree expr_record = TREE_TYPE (TREE_OPERAND (expr, 0));
2322 tree expr_field = TREE_OPERAND (expr, 1);
2323
2324 if (DECL_FIELD_CONTEXT (expr_field) != TYPE_MAIN_VARIANT (expr_record))
2325 {
2326 expr_field = find_compatible_field (expr_record, expr_field);
2327 TREE_OPERAND (expr, 1) = expr_field;
2328 }
2329 }
6de9cd9a
DN
2330 break;
2331
ac182688
ZD
2332 case TARGET_MEM_REF:
2333 t = maybe_fold_tmr (expr);
2334 break;
2335
726a989a
RB
2336 case POINTER_PLUS_EXPR:
2337 t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
2338 if (t)
2339 return t;
2340 t = walk_tree (&TREE_OPERAND (expr, 1), fold_stmt_r, data, NULL);
2341 if (t)
2342 return t;
2343 *walk_subtrees = 0;
2344
2345 t = maybe_fold_stmt_addition (TREE_TYPE (expr),
2346 TREE_OPERAND (expr, 0),
2347 TREE_OPERAND (expr, 1));
2348 break;
2349
f393e7f5
RG
2350 case COND_EXPR:
2351 if (COMPARISON_CLASS_P (TREE_OPERAND (expr, 0)))
2352 {
2353 tree op0 = TREE_OPERAND (expr, 0);
6ac01510
ILT
2354 tree tem;
2355 bool set;
2356
2357 fold_defer_overflow_warnings ();
2358 tem = fold_binary (TREE_CODE (op0), TREE_TYPE (op0),
2359 TREE_OPERAND (op0, 0),
2360 TREE_OPERAND (op0, 1));
726a989a
RB
2361 /* This is actually a conditional expression, not a GIMPLE
2362 conditional statement, however, the valid_gimple_rhs_p
2363 test still applies. */
2364 set = tem && is_gimple_condexpr (tem) && valid_gimple_rhs_p (tem);
6ac01510
ILT
2365 fold_undefer_overflow_warnings (set, fold_stmt_r_data->stmt, 0);
2366 if (set)
5cdc4a26 2367 {
726a989a
RB
2368 COND_EXPR_COND (expr) = tem;
2369 t = expr;
5cdc4a26
RS
2370 break;
2371 }
f393e7f5 2372 }
5cdc4a26 2373 return NULL_TREE;
f393e7f5 2374
6de9cd9a
DN
2375 default:
2376 return NULL_TREE;
2377 }
2378
2379 if (t)
2380 {
e2104f59
RG
2381 /* Preserve volatileness of the original expression.
2382 We can end up with a plain decl here which is shared
2383 and we shouldn't mess with its flags. */
2384 if (!SSA_VAR_P (t))
2385 TREE_THIS_VOLATILE (t) = volatile_p;
6de9cd9a
DN
2386 *expr_p = t;
2387 *changed_p = true;
2388 }
2389
2390 return NULL_TREE;
2391}
2392
10a0d495
JJ
2393/* Return the string length, maximum string length or maximum value of
2394 ARG in LENGTH.
2395 If ARG is an SSA name variable, follow its use-def chains. If LENGTH
2396 is not NULL and, for TYPE == 0, its value is not equal to the length
2397 we determine or if we are unable to determine the length or value,
2398 return false. VISITED is a bitmap of visited variables.
2399 TYPE is 0 if string length should be returned, 1 for maximum string
2400 length and 2 for maximum value ARG can have. */
6de9cd9a 2401
06a9b53f 2402static bool
10a0d495 2403get_maxval_strlen (tree arg, tree *length, bitmap visited, int type)
6de9cd9a 2404{
726a989a
RB
2405 tree var, val;
2406 gimple def_stmt;
750628d8
DN
2407
2408 if (TREE_CODE (arg) != SSA_NAME)
06a9b53f 2409 {
f255541f
RC
2410 if (TREE_CODE (arg) == COND_EXPR)
2411 return get_maxval_strlen (COND_EXPR_THEN (arg), length, visited, type)
2412 && get_maxval_strlen (COND_EXPR_ELSE (arg), length, visited, type);
c4e5b5a8
RG
2413 /* We can end up with &(*iftmp_1)[0] here as well, so handle it. */
2414 else if (TREE_CODE (arg) == ADDR_EXPR
2415 && TREE_CODE (TREE_OPERAND (arg, 0)) == ARRAY_REF
2416 && integer_zerop (TREE_OPERAND (TREE_OPERAND (arg, 0), 1)))
2417 {
2418 tree aop0 = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
2419 if (TREE_CODE (aop0) == INDIRECT_REF
2420 && TREE_CODE (TREE_OPERAND (aop0, 0)) == SSA_NAME)
2421 return get_maxval_strlen (TREE_OPERAND (aop0, 0),
2422 length, visited, type);
2423 }
f255541f 2424
10a0d495
JJ
2425 if (type == 2)
2426 {
2427 val = arg;
2428 if (TREE_CODE (val) != INTEGER_CST
2429 || tree_int_cst_sgn (val) < 0)
2430 return false;
2431 }
2432 else
2433 val = c_strlen (arg, 1);
750628d8 2434 if (!val)
06a9b53f 2435 return false;
cd709752 2436
10a0d495
JJ
2437 if (*length)
2438 {
2439 if (type > 0)
2440 {
2441 if (TREE_CODE (*length) != INTEGER_CST
2442 || TREE_CODE (val) != INTEGER_CST)
2443 return false;
2444
2445 if (tree_int_cst_lt (*length, val))
2446 *length = val;
2447 return true;
2448 }
2449 else if (simple_cst_equal (val, *length) != 1)
2450 return false;
2451 }
6de9cd9a 2452
750628d8
DN
2453 *length = val;
2454 return true;
6de9cd9a 2455 }
06a9b53f 2456
750628d8
DN
2457 /* If we were already here, break the infinite cycle. */
2458 if (bitmap_bit_p (visited, SSA_NAME_VERSION (arg)))
2459 return true;
2460 bitmap_set_bit (visited, SSA_NAME_VERSION (arg));
2461
2462 var = arg;
2463 def_stmt = SSA_NAME_DEF_STMT (var);
6de9cd9a 2464
726a989a
RB
2465 switch (gimple_code (def_stmt))
2466 {
2467 case GIMPLE_ASSIGN:
2468 /* The RHS of the statement defining VAR must either have a
2469 constant length or come from another SSA_NAME with a constant
2470 length. */
2471 if (gimple_assign_single_p (def_stmt)
2472 || gimple_assign_unary_nop_p (def_stmt))
2473 {
2474 tree rhs = gimple_assign_rhs1 (def_stmt);
2475 return get_maxval_strlen (rhs, length, visited, type);
2476 }
2477 return false;
2478
2479 case GIMPLE_PHI:
750628d8
DN
2480 {
2481 /* All the arguments of the PHI node must have the same constant
2482 length. */
726a989a
RB
2483 unsigned i;
2484
2485 for (i = 0; i < gimple_phi_num_args (def_stmt); i++)
2486 {
2487 tree arg = gimple_phi_arg (def_stmt, i)->def;
2488
2489 /* If this PHI has itself as an argument, we cannot
2490 determine the string length of this argument. However,
2491 if we can find a constant string length for the other
2492 PHI args then we can still be sure that this is a
2493 constant string length. So be optimistic and just
2494 continue with the next argument. */
2495 if (arg == gimple_phi_result (def_stmt))
2496 continue;
2497
2498 if (!get_maxval_strlen (arg, length, visited, type))
2499 return false;
2500 }
2501 }
2502 return true;
6de9cd9a 2503
750628d8 2504 default:
726a989a 2505 return false;
6de9cd9a 2506 }
6de9cd9a
DN
2507}
2508
2509
726a989a
RB
2510/* Fold builtin call in statement STMT. Returns a simplified tree.
2511 We may return a non-constant expression, including another call
2512 to a different function and with different arguments, e.g.,
2513 substituting memcpy for strcpy when the string length is known.
2514 Note that some builtins expand into inline code that may not
2515 be valid in GIMPLE. Callers must take care. */
6de9cd9a
DN
2516
2517static tree
726a989a 2518ccp_fold_builtin (gimple stmt)
6de9cd9a 2519{
10a0d495 2520 tree result, val[3];
5039610b 2521 tree callee, a;
d9cc481a 2522 int arg_idx, type;
a32e70c3
RS
2523 bitmap visited;
2524 bool ignore;
5039610b 2525 int nargs;
6de9cd9a 2526
726a989a
RB
2527 gcc_assert (is_gimple_call (stmt));
2528
2529 ignore = (gimple_call_lhs (stmt) == NULL);
6de9cd9a
DN
2530
2531 /* First try the generic builtin folder. If that succeeds, return the
2532 result directly. */
726a989a 2533 result = fold_call_stmt (stmt, ignore);
6de9cd9a 2534 if (result)
10a0d495
JJ
2535 {
2536 if (ignore)
2537 STRIP_NOPS (result);
2538 return result;
2539 }
a32e70c3
RS
2540
2541 /* Ignore MD builtins. */
726a989a 2542 callee = gimple_call_fndecl (stmt);
a32e70c3
RS
2543 if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD)
2544 return NULL_TREE;
6de9cd9a
DN
2545
2546 /* If the builtin could not be folded, and it has no argument list,
2547 we're done. */
726a989a 2548 nargs = gimple_call_num_args (stmt);
5039610b 2549 if (nargs == 0)
6de9cd9a
DN
2550 return NULL_TREE;
2551
2552 /* Limit the work only for builtins we know how to simplify. */
2553 switch (DECL_FUNCTION_CODE (callee))
2554 {
2555 case BUILT_IN_STRLEN:
2556 case BUILT_IN_FPUTS:
2557 case BUILT_IN_FPUTS_UNLOCKED:
d9cc481a 2558 arg_idx = 0;
10a0d495 2559 type = 0;
6de9cd9a
DN
2560 break;
2561 case BUILT_IN_STRCPY:
2562 case BUILT_IN_STRNCPY:
d9cc481a 2563 arg_idx = 1;
10a0d495
JJ
2564 type = 0;
2565 break;
2566 case BUILT_IN_MEMCPY_CHK:
2567 case BUILT_IN_MEMPCPY_CHK:
2568 case BUILT_IN_MEMMOVE_CHK:
2569 case BUILT_IN_MEMSET_CHK:
2570 case BUILT_IN_STRNCPY_CHK:
d9cc481a 2571 arg_idx = 2;
10a0d495
JJ
2572 type = 2;
2573 break;
2574 case BUILT_IN_STRCPY_CHK:
2575 case BUILT_IN_STPCPY_CHK:
d9cc481a 2576 arg_idx = 1;
10a0d495
JJ
2577 type = 1;
2578 break;
2579 case BUILT_IN_SNPRINTF_CHK:
2580 case BUILT_IN_VSNPRINTF_CHK:
d9cc481a 2581 arg_idx = 1;
10a0d495 2582 type = 2;
6de9cd9a
DN
2583 break;
2584 default:
2585 return NULL_TREE;
2586 }
2587
f6ab27bb
JJ
2588 if (arg_idx >= nargs)
2589 return NULL_TREE;
2590
6de9cd9a 2591 /* Try to use the dataflow information gathered by the CCP process. */
8bdbfff5 2592 visited = BITMAP_ALLOC (NULL);
d9cc481a 2593 bitmap_clear (visited);
6de9cd9a 2594
10a0d495 2595 memset (val, 0, sizeof (val));
d9cc481a
AN
2596 a = gimple_call_arg (stmt, arg_idx);
2597 if (!get_maxval_strlen (a, &val[arg_idx], visited, type))
2598 val[arg_idx] = NULL_TREE;
6de9cd9a 2599
8bdbfff5 2600 BITMAP_FREE (visited);
6de9cd9a 2601
a32e70c3 2602 result = NULL_TREE;
6de9cd9a
DN
2603 switch (DECL_FUNCTION_CODE (callee))
2604 {
2605 case BUILT_IN_STRLEN:
f6ab27bb 2606 if (val[0] && nargs == 1)
6de9cd9a 2607 {
726a989a
RB
2608 tree new_val =
2609 fold_convert (TREE_TYPE (gimple_call_lhs (stmt)), val[0]);
6de9cd9a
DN
2610
2611 /* If the result is not a valid gimple value, or not a cast
2612 of a valid gimple value, then we can not use the result. */
c22940cd
TN
2613 if (is_gimple_val (new_val)
2614 || (is_gimple_cast (new_val)
2615 && is_gimple_val (TREE_OPERAND (new_val, 0))))
2616 return new_val;
6de9cd9a 2617 }
a32e70c3
RS
2618 break;
2619
6de9cd9a 2620 case BUILT_IN_STRCPY:
5039610b
SL
2621 if (val[1] && is_gimple_val (val[1]) && nargs == 2)
2622 result = fold_builtin_strcpy (callee,
726a989a
RB
2623 gimple_call_arg (stmt, 0),
2624 gimple_call_arg (stmt, 1),
5039610b 2625 val[1]);
a32e70c3
RS
2626 break;
2627
6de9cd9a 2628 case BUILT_IN_STRNCPY:
5039610b
SL
2629 if (val[1] && is_gimple_val (val[1]) && nargs == 3)
2630 result = fold_builtin_strncpy (callee,
726a989a
RB
2631 gimple_call_arg (stmt, 0),
2632 gimple_call_arg (stmt, 1),
2633 gimple_call_arg (stmt, 2),
5039610b 2634 val[1]);
a32e70c3
RS
2635 break;
2636
6de9cd9a 2637 case BUILT_IN_FPUTS:
f6ab27bb
JJ
2638 if (nargs == 2)
2639 result = fold_builtin_fputs (gimple_call_arg (stmt, 0),
2640 gimple_call_arg (stmt, 1),
2641 ignore, false, val[0]);
a32e70c3
RS
2642 break;
2643
6de9cd9a 2644 case BUILT_IN_FPUTS_UNLOCKED:
f6ab27bb
JJ
2645 if (nargs == 2)
2646 result = fold_builtin_fputs (gimple_call_arg (stmt, 0),
2647 gimple_call_arg (stmt, 1),
2648 ignore, true, val[0]);
10a0d495
JJ
2649 break;
2650
2651 case BUILT_IN_MEMCPY_CHK:
2652 case BUILT_IN_MEMPCPY_CHK:
2653 case BUILT_IN_MEMMOVE_CHK:
2654 case BUILT_IN_MEMSET_CHK:
f6ab27bb 2655 if (val[2] && is_gimple_val (val[2]) && nargs == 4)
5039610b 2656 result = fold_builtin_memory_chk (callee,
726a989a
RB
2657 gimple_call_arg (stmt, 0),
2658 gimple_call_arg (stmt, 1),
2659 gimple_call_arg (stmt, 2),
2660 gimple_call_arg (stmt, 3),
5039610b 2661 val[2], ignore,
10a0d495
JJ
2662 DECL_FUNCTION_CODE (callee));
2663 break;
2664
2665 case BUILT_IN_STRCPY_CHK:
2666 case BUILT_IN_STPCPY_CHK:
f6ab27bb 2667 if (val[1] && is_gimple_val (val[1]) && nargs == 3)
5039610b 2668 result = fold_builtin_stxcpy_chk (callee,
726a989a
RB
2669 gimple_call_arg (stmt, 0),
2670 gimple_call_arg (stmt, 1),
2671 gimple_call_arg (stmt, 2),
5039610b 2672 val[1], ignore,
10a0d495
JJ
2673 DECL_FUNCTION_CODE (callee));
2674 break;
2675
2676 case BUILT_IN_STRNCPY_CHK:
f6ab27bb 2677 if (val[2] && is_gimple_val (val[2]) && nargs == 4)
726a989a
RB
2678 result = fold_builtin_strncpy_chk (gimple_call_arg (stmt, 0),
2679 gimple_call_arg (stmt, 1),
2680 gimple_call_arg (stmt, 2),
2681 gimple_call_arg (stmt, 3),
5039610b 2682 val[2]);
10a0d495
JJ
2683 break;
2684
2685 case BUILT_IN_SNPRINTF_CHK:
2686 case BUILT_IN_VSNPRINTF_CHK:
2687 if (val[1] && is_gimple_val (val[1]))
726a989a
RB
2688 result = gimple_fold_builtin_snprintf_chk (stmt, val[1],
2689 DECL_FUNCTION_CODE (callee));
a32e70c3 2690 break;
6de9cd9a
DN
2691
2692 default:
1e128c5f 2693 gcc_unreachable ();
6de9cd9a
DN
2694 }
2695
a32e70c3 2696 if (result && ignore)
9675412f 2697 result = fold_ignored_result (result);
a32e70c3 2698 return result;
6de9cd9a
DN
2699}
2700
726a989a
RB
2701/* Attempt to fold an assignment statement pointed-to by SI. Returns a
2702 replacement rhs for the statement or NULL_TREE if no simplification
2703 could be made. It is assumed that the operands have been previously
2704 folded. */
2705
2706static tree
2707fold_gimple_assign (gimple_stmt_iterator *si)
2708{
2709 gimple stmt = gsi_stmt (*si);
2710 enum tree_code subcode = gimple_assign_rhs_code (stmt);
2711
2712 tree result = NULL;
2713
2714 switch (get_gimple_rhs_class (subcode))
2715 {
2716 case GIMPLE_SINGLE_RHS:
2717 {
2718 tree rhs = gimple_assign_rhs1 (stmt);
2719
2720 /* Try to fold a conditional expression. */
2721 if (TREE_CODE (rhs) == COND_EXPR)
2722 {
2723 tree temp = fold (COND_EXPR_COND (rhs));
2724 if (temp != COND_EXPR_COND (rhs))
2725 result = fold_build3 (COND_EXPR, TREE_TYPE (rhs), temp,
2726 COND_EXPR_THEN (rhs), COND_EXPR_ELSE (rhs));
2727 }
2728
2729 /* If we couldn't fold the RHS, hand over to the generic
2730 fold routines. */
2731 if (result == NULL_TREE)
2732 result = fold (rhs);
2733
2734 /* Strip away useless type conversions. Both the NON_LVALUE_EXPR
2735 that may have been added by fold, and "useless" type
2736 conversions that might now be apparent due to propagation. */
2737 STRIP_USELESS_TYPE_CONVERSION (result);
2738
2739 if (result != rhs && valid_gimple_rhs_p (result))
2740 return result;
2741 else
2742 /* It is possible that fold_stmt_r simplified the RHS.
2743 Make sure that the subcode of this statement still
2744 reflects the principal operator of the rhs operand. */
2745 return rhs;
2746 }
2747 break;
2748
2749 case GIMPLE_UNARY_RHS:
ff8b183b
RG
2750 {
2751 tree rhs = gimple_assign_rhs1 (stmt);
726a989a 2752
ff8b183b
RG
2753 result = fold_unary (subcode, gimple_expr_type (stmt), rhs);
2754 if (result)
2755 {
2756 /* If the operation was a conversion do _not_ mark a
2757 resulting constant with TREE_OVERFLOW if the original
2758 constant was not. These conversions have implementation
2759 defined behavior and retaining the TREE_OVERFLOW flag
2760 here would confuse later passes such as VRP. */
2761 if (CONVERT_EXPR_CODE_P (subcode)
2762 && TREE_CODE (result) == INTEGER_CST
2763 && TREE_CODE (rhs) == INTEGER_CST)
2764 TREE_OVERFLOW (result) = TREE_OVERFLOW (rhs);
2765
2766 STRIP_USELESS_TYPE_CONVERSION (result);
2767 if (valid_gimple_rhs_p (result))
2768 return result;
2769 }
2770 else if (CONVERT_EXPR_CODE_P (subcode)
2771 && POINTER_TYPE_P (gimple_expr_type (stmt))
2772 && POINTER_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
2773 {
2774 tree type = gimple_expr_type (stmt);
2775 tree t = maybe_fold_offset_to_address (gimple_assign_rhs1 (stmt),
2776 integer_zero_node, type);
2777 if (t)
2778 return t;
2779 }
2780 }
726a989a
RB
2781 break;
2782
2783 case GIMPLE_BINARY_RHS:
2784 /* Try to fold pointer addition. */
2785 if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR)
66e8b99c
RG
2786 {
2787 tree type = TREE_TYPE (gimple_assign_rhs1 (stmt));
2788 if (TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
2789 {
2790 type = build_pointer_type (TREE_TYPE (TREE_TYPE (type)));
2791 if (!useless_type_conversion_p
2792 (TREE_TYPE (gimple_assign_lhs (stmt)), type))
2793 type = TREE_TYPE (gimple_assign_rhs1 (stmt));
2794 }
2795 result = maybe_fold_stmt_addition (type,
2796 gimple_assign_rhs1 (stmt),
2797 gimple_assign_rhs2 (stmt));
2798 }
726a989a
RB
2799
2800 if (!result)
2801 result = fold_binary (subcode,
2802 TREE_TYPE (gimple_assign_lhs (stmt)),
2803 gimple_assign_rhs1 (stmt),
2804 gimple_assign_rhs2 (stmt));
2805
2806 if (result)
2807 {
2808 STRIP_USELESS_TYPE_CONVERSION (result);
2809 if (valid_gimple_rhs_p (result))
2810 return result;
001003c2
PB
2811
2812 /* Fold might have produced non-GIMPLE, so if we trust it blindly
2813 we lose canonicalization opportunities. Do not go again
2814 through fold here though, or the same non-GIMPLE will be
2815 produced. */
2816 if (commutative_tree_code (subcode)
2817 && tree_swap_operands_p (gimple_assign_rhs1 (stmt),
2818 gimple_assign_rhs2 (stmt), false))
2819 return build2 (subcode, TREE_TYPE (gimple_assign_lhs (stmt)),
2820 gimple_assign_rhs2 (stmt),
2821 gimple_assign_rhs1 (stmt));
726a989a
RB
2822 }
2823 break;
2824
2825 case GIMPLE_INVALID_RHS:
2826 gcc_unreachable ();
2827 }
2828
2829 return NULL_TREE;
2830}
2831
2832/* Attempt to fold a conditional statement. Return true if any changes were
2833 made. We only attempt to fold the condition expression, and do not perform
2834 any transformation that would require alteration of the cfg. It is
2835 assumed that the operands have been previously folded. */
2836
2837static bool
2838fold_gimple_cond (gimple stmt)
2839{
2840 tree result = fold_binary (gimple_cond_code (stmt),
2841 boolean_type_node,
2842 gimple_cond_lhs (stmt),
2843 gimple_cond_rhs (stmt));
2844
2845 if (result)
2846 {
2847 STRIP_USELESS_TYPE_CONVERSION (result);
2848 if (is_gimple_condexpr (result) && valid_gimple_rhs_p (result))
2849 {
2850 gimple_cond_set_condition_from_tree (stmt, result);
2851 return true;
2852 }
2853 }
2854
2855 return false;
2856}
2857
2858
2859/* Attempt to fold a call statement referenced by the statement iterator GSI.
2860 The statement may be replaced by another statement, e.g., if the call
2861 simplifies to a constant value. Return true if any changes were made.
2862 It is assumed that the operands have been previously folded. */
2863
2864static bool
2865fold_gimple_call (gimple_stmt_iterator *gsi)
2866{
2867 gimple stmt = gsi_stmt (*gsi);
2868
2869 tree callee = gimple_call_fndecl (stmt);
2870
2871 /* Check for builtins that CCP can handle using information not
2872 available in the generic fold routines. */
2873 if (callee && DECL_BUILT_IN (callee))
2874 {
2875 tree result = ccp_fold_builtin (stmt);
2876
2877 if (result)
2878 return update_call_from_tree (gsi, result);
2879 }
2880 else
2881 {
2882 /* Check for resolvable OBJ_TYPE_REF. The only sorts we can resolve
2883 here are when we've propagated the address of a decl into the
2884 object slot. */
2885 /* ??? Should perhaps do this in fold proper. However, doing it
2886 there requires that we create a new CALL_EXPR, and that requires
2887 copying EH region info to the new node. Easier to just do it
2888 here where we can just smash the call operand. */
2889 /* ??? Is there a good reason not to do this in fold_stmt_inplace? */
2890 callee = gimple_call_fn (stmt);
2891 if (TREE_CODE (callee) == OBJ_TYPE_REF
2892 && lang_hooks.fold_obj_type_ref
2893 && TREE_CODE (OBJ_TYPE_REF_OBJECT (callee)) == ADDR_EXPR
2894 && DECL_P (TREE_OPERAND
2895 (OBJ_TYPE_REF_OBJECT (callee), 0)))
2896 {
2897 tree t;
2898
2899 /* ??? Caution: Broken ADDR_EXPR semantics means that
2900 looking at the type of the operand of the addr_expr
2901 can yield an array type. See silly exception in
2902 check_pointer_types_r. */
2903 t = TREE_TYPE (TREE_TYPE (OBJ_TYPE_REF_OBJECT (callee)));
2904 t = lang_hooks.fold_obj_type_ref (callee, t);
2905 if (t)
2906 {
2907 gimple_call_set_fn (stmt, t);
2908 return true;
2909 }
2910 }
2911 }
2912
2913 return false;
2914}
6de9cd9a 2915
726a989a 2916/* Fold the statement pointed to by GSI. In some cases, this function may
750628d8
DN
2917 replace the whole statement with a new one. Returns true iff folding
2918 makes any changes. */
6de9cd9a 2919
750628d8 2920bool
726a989a 2921fold_stmt (gimple_stmt_iterator *gsi)
6de9cd9a 2922{
726a989a 2923 tree res;
622f91ba 2924 struct fold_stmt_r_data fold_stmt_r_data;
726a989a
RB
2925 struct walk_stmt_info wi;
2926
750628d8 2927 bool changed = false;
622f91ba
JL
2928 bool inside_addr_expr = false;
2929
726a989a 2930 gimple stmt = gsi_stmt (*gsi);
6ac01510
ILT
2931
2932 fold_stmt_r_data.stmt = stmt;
622f91ba
JL
2933 fold_stmt_r_data.changed_p = &changed;
2934 fold_stmt_r_data.inside_addr_expr_p = &inside_addr_expr;
6de9cd9a 2935
726a989a
RB
2936 memset (&wi, 0, sizeof (wi));
2937 wi.info = &fold_stmt_r_data;
6de9cd9a 2938
726a989a
RB
2939 /* Fold the individual operands.
2940 For example, fold instances of *&VAR into VAR, etc. */
2941 res = walk_gimple_op (stmt, fold_stmt_r, &wi);
2942 gcc_assert (!res);
6de9cd9a 2943
726a989a
RB
2944 /* Fold the main computation performed by the statement. */
2945 switch (gimple_code (stmt))
6de9cd9a 2946 {
726a989a
RB
2947 case GIMPLE_ASSIGN:
2948 {
2949 tree new_rhs = fold_gimple_assign (gsi);
2950 if (new_rhs != NULL_TREE)
2951 {
2952 gimple_assign_set_rhs_from_tree (gsi, new_rhs);
2953 changed = true;
2954 }
2955 stmt = gsi_stmt (*gsi);
2956 break;
2957 }
2958 case GIMPLE_COND:
2959 changed |= fold_gimple_cond (stmt);
2960 break;
2961 case GIMPLE_CALL:
2962 /* The entire statement may be replaced in this case. */
2963 changed |= fold_gimple_call (gsi);
2964 break;
1809ff6b 2965
726a989a
RB
2966 default:
2967 return changed;
2968 break;
f255541f 2969 }
6de9cd9a 2970
750628d8 2971 return changed;
6de9cd9a
DN
2972}
2973
38965eb2
ZD
2974/* Perform the minimal folding on statement STMT. Only operations like
2975 *&x created by constant propagation are handled. The statement cannot
726a989a
RB
2976 be replaced with a new one. Return true if the statement was
2977 changed, false otherwise. */
38965eb2
ZD
2978
2979bool
726a989a 2980fold_stmt_inplace (gimple stmt)
38965eb2 2981{
726a989a 2982 tree res;
622f91ba 2983 struct fold_stmt_r_data fold_stmt_r_data;
726a989a
RB
2984 struct walk_stmt_info wi;
2985 gimple_stmt_iterator si;
2986
38965eb2 2987 bool changed = false;
622f91ba
JL
2988 bool inside_addr_expr = false;
2989
6ac01510 2990 fold_stmt_r_data.stmt = stmt;
622f91ba
JL
2991 fold_stmt_r_data.changed_p = &changed;
2992 fold_stmt_r_data.inside_addr_expr_p = &inside_addr_expr;
38965eb2 2993
726a989a
RB
2994 memset (&wi, 0, sizeof (wi));
2995 wi.info = &fold_stmt_r_data;
2996
2997 /* Fold the individual operands.
2998 For example, fold instances of *&VAR into VAR, etc.
38965eb2 2999
726a989a
RB
3000 It appears that, at one time, maybe_fold_stmt_indirect
3001 would cause the walk to return non-null in order to
3002 signal that the entire statement should be replaced with
3003 a call to _builtin_trap. This functionality is currently
3004 disabled, as noted in a FIXME, and cannot be supported here. */
3005 res = walk_gimple_op (stmt, fold_stmt_r, &wi);
3006 gcc_assert (!res);
38965eb2 3007
726a989a
RB
3008 /* Fold the main computation performed by the statement. */
3009 switch (gimple_code (stmt))
3010 {
3011 case GIMPLE_ASSIGN:
3012 {
3013 unsigned old_num_ops;
3014 tree new_rhs;
3015 old_num_ops = gimple_num_ops (stmt);
3016 si = gsi_for_stmt (stmt);
3017 new_rhs = fold_gimple_assign (&si);
3018 if (new_rhs != NULL_TREE
3019 && get_gimple_rhs_num_ops (TREE_CODE (new_rhs)) < old_num_ops)
3020 {
3021 gimple_assign_set_rhs_from_tree (&si, new_rhs);
3022 changed = true;
3023 }
3024 gcc_assert (gsi_stmt (si) == stmt);
3025 break;
3026 }
3027 case GIMPLE_COND:
3028 changed |= fold_gimple_cond (stmt);
3029 break;
38965eb2 3030
726a989a
RB
3031 default:
3032 break;
3033 }
38965eb2
ZD
3034
3035 return changed;
3036}
726a989a 3037
cb8e078d
JJ
3038/* Try to optimize out __builtin_stack_restore. Optimize it out
3039 if there is another __builtin_stack_restore in the same basic
3040 block and no calls or ASM_EXPRs are in between, or if this block's
3041 only outgoing edge is to EXIT_BLOCK and there are no calls or
3042 ASM_EXPRs after this __builtin_stack_restore. */
3043
3044static tree
726a989a 3045optimize_stack_restore (gimple_stmt_iterator i)
cb8e078d 3046{
726a989a
RB
3047 tree callee, rhs;
3048 gimple stmt, stack_save;
3049 gimple_stmt_iterator stack_save_gsi;
3050
3051 basic_block bb = gsi_bb (i);
3052 gimple call = gsi_stmt (i);
cb8e078d 3053
726a989a
RB
3054 if (gimple_code (call) != GIMPLE_CALL
3055 || gimple_call_num_args (call) != 1
3056 || TREE_CODE (gimple_call_arg (call, 0)) != SSA_NAME
3057 || !POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (call, 0))))
cb8e078d
JJ
3058 return NULL_TREE;
3059
726a989a 3060 for (gsi_next (&i); !gsi_end_p (i); gsi_next (&i))
cb8e078d 3061 {
726a989a
RB
3062 stmt = gsi_stmt (i);
3063 if (gimple_code (stmt) == GIMPLE_ASM)
cb8e078d 3064 return NULL_TREE;
726a989a 3065 if (gimple_code (stmt) != GIMPLE_CALL)
cb8e078d
JJ
3066 continue;
3067
726a989a 3068 callee = gimple_call_fndecl (stmt);
cb8e078d
JJ
3069 if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
3070 return NULL_TREE;
3071
3072 if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)
3073 break;
3074 }
3075
726a989a 3076 if (gsi_end_p (i)
cb8e078d
JJ
3077 && (! single_succ_p (bb)
3078 || single_succ_edge (bb)->dest != EXIT_BLOCK_PTR))
3079 return NULL_TREE;
3080
726a989a
RB
3081 stack_save = SSA_NAME_DEF_STMT (gimple_call_arg (call, 0));
3082 if (gimple_code (stack_save) != GIMPLE_CALL
3083 || gimple_call_lhs (stack_save) != gimple_call_arg (call, 0)
3084 || stmt_could_throw_p (stack_save)
3085 || !has_single_use (gimple_call_arg (call, 0)))
cb8e078d
JJ
3086 return NULL_TREE;
3087
726a989a 3088 callee = gimple_call_fndecl (stack_save);
cb8e078d
JJ
3089 if (!callee
3090 || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
3091 || DECL_FUNCTION_CODE (callee) != BUILT_IN_STACK_SAVE
726a989a 3092 || gimple_call_num_args (stack_save) != 0)
cb8e078d
JJ
3093 return NULL_TREE;
3094
726a989a
RB
3095 stack_save_gsi = gsi_for_stmt (stack_save);
3096 push_stmt_changes (gsi_stmt_ptr (&stack_save_gsi));
3097 rhs = build_int_cst (TREE_TYPE (gimple_call_arg (call, 0)), 0);
3098 if (!update_call_from_tree (&stack_save_gsi, rhs))
cb8e078d 3099 {
726a989a 3100 discard_stmt_changes (gsi_stmt_ptr (&stack_save_gsi));
cb8e078d
JJ
3101 return NULL_TREE;
3102 }
726a989a 3103 pop_stmt_changes (gsi_stmt_ptr (&stack_save_gsi));
cb8e078d 3104
726a989a 3105 /* No effect, so the statement will be deleted. */
cb8e078d
JJ
3106 return integer_zero_node;
3107}
726a989a 3108
d7bd8aeb
JJ
3109/* If va_list type is a simple pointer and nothing special is needed,
3110 optimize __builtin_va_start (&ap, 0) into ap = __builtin_next_arg (0),
3111 __builtin_va_end (&ap) out as NOP and __builtin_va_copy into a simple
3112 pointer assignment. */
3113
3114static tree
726a989a 3115optimize_stdarg_builtin (gimple call)
d7bd8aeb 3116{
35cbb299 3117 tree callee, lhs, rhs, cfun_va_list;
d7bd8aeb
JJ
3118 bool va_list_simple_ptr;
3119
726a989a 3120 if (gimple_code (call) != GIMPLE_CALL)
d7bd8aeb
JJ
3121 return NULL_TREE;
3122
726a989a 3123 callee = gimple_call_fndecl (call);
35cbb299
KT
3124
3125 cfun_va_list = targetm.fn_abi_va_list (callee);
3126 va_list_simple_ptr = POINTER_TYPE_P (cfun_va_list)
3127 && (TREE_TYPE (cfun_va_list) == void_type_node
3128 || TREE_TYPE (cfun_va_list) == char_type_node);
3129
d7bd8aeb
JJ
3130 switch (DECL_FUNCTION_CODE (callee))
3131 {
3132 case BUILT_IN_VA_START:
3133 if (!va_list_simple_ptr
3134 || targetm.expand_builtin_va_start != NULL
726a989a 3135 || built_in_decls[BUILT_IN_NEXT_ARG] == NULL)
d7bd8aeb
JJ
3136 return NULL_TREE;
3137
726a989a 3138 if (gimple_call_num_args (call) != 2)
d7bd8aeb
JJ
3139 return NULL_TREE;
3140
726a989a 3141 lhs = gimple_call_arg (call, 0);
d7bd8aeb
JJ
3142 if (!POINTER_TYPE_P (TREE_TYPE (lhs))
3143 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
35cbb299 3144 != TYPE_MAIN_VARIANT (cfun_va_list))
d7bd8aeb 3145 return NULL_TREE;
726a989a 3146
d7bd8aeb
JJ
3147 lhs = build_fold_indirect_ref (lhs);
3148 rhs = build_call_expr (built_in_decls[BUILT_IN_NEXT_ARG],
726a989a 3149 1, integer_zero_node);
d7bd8aeb
JJ
3150 rhs = fold_convert (TREE_TYPE (lhs), rhs);
3151 return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
3152
3153 case BUILT_IN_VA_COPY:
3154 if (!va_list_simple_ptr)
3155 return NULL_TREE;
3156
726a989a 3157 if (gimple_call_num_args (call) != 2)
d7bd8aeb
JJ
3158 return NULL_TREE;
3159
726a989a 3160 lhs = gimple_call_arg (call, 0);
d7bd8aeb
JJ
3161 if (!POINTER_TYPE_P (TREE_TYPE (lhs))
3162 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
35cbb299 3163 != TYPE_MAIN_VARIANT (cfun_va_list))
d7bd8aeb
JJ
3164 return NULL_TREE;
3165
3166 lhs = build_fold_indirect_ref (lhs);
726a989a 3167 rhs = gimple_call_arg (call, 1);
d7bd8aeb 3168 if (TYPE_MAIN_VARIANT (TREE_TYPE (rhs))
35cbb299 3169 != TYPE_MAIN_VARIANT (cfun_va_list))
d7bd8aeb
JJ
3170 return NULL_TREE;
3171
3172 rhs = fold_convert (TREE_TYPE (lhs), rhs);
3173 return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
3174
3175 case BUILT_IN_VA_END:
726a989a 3176 /* No effect, so the statement will be deleted. */
d7bd8aeb
JJ
3177 return integer_zero_node;
3178
3179 default:
3180 gcc_unreachable ();
3181 }
3182}
726a989a 3183
b28b1600
JJ
3184/* Convert EXPR into a GIMPLE value suitable for substitution on the
3185 RHS of an assignment. Insert the necessary statements before
726a989a
RB
3186 iterator *SI_P. The statement at *SI_P, which must be a GIMPLE_CALL
3187 is replaced. If the call is expected to produces a result, then it
3188 is replaced by an assignment of the new RHS to the result variable.
3189 If the result is to be ignored, then the call is replaced by a
3190 GIMPLE_NOP. */
b28b1600 3191
726a989a
RB
3192static void
3193gimplify_and_update_call_from_tree (gimple_stmt_iterator *si_p, tree expr)
b28b1600 3194{
726a989a
RB
3195 tree lhs;
3196 tree tmp = NULL_TREE; /* Silence warning. */
3197 gimple stmt, new_stmt;
3198 gimple_stmt_iterator i;
3199 gimple_seq stmts = gimple_seq_alloc();
d406b663 3200 struct gimplify_ctx gctx;
b28b1600 3201
726a989a
RB
3202 stmt = gsi_stmt (*si_p);
3203
3204 gcc_assert (is_gimple_call (stmt));
3205
3206 lhs = gimple_call_lhs (stmt);
3207
d406b663 3208 push_gimplify_context (&gctx);
726a989a
RB
3209
3210 if (lhs == NULL_TREE)
3211 gimplify_and_add (expr, &stmts);
3212 else
2e929cf3 3213 tmp = get_initialized_tmp_var (expr, &stmts, NULL);
726a989a 3214
b28b1600
JJ
3215 pop_gimplify_context (NULL);
3216
726a989a
RB
3217 if (gimple_has_location (stmt))
3218 annotate_all_with_location (stmts, gimple_location (stmt));
f47c96aa 3219
b28b1600 3220 /* The replacement can expose previously unreferenced variables. */
726a989a
RB
3221 for (i = gsi_start (stmts); !gsi_end_p (i); gsi_next (&i))
3222 {
3223 new_stmt = gsi_stmt (i);
3224 find_new_referenced_vars (new_stmt);
3225 gsi_insert_before (si_p, new_stmt, GSI_NEW_STMT);
3226 mark_symbols_for_renaming (new_stmt);
3227 gsi_next (si_p);
3228 }
3229
3230 if (lhs == NULL_TREE)
5006671f
RG
3231 {
3232 new_stmt = gimple_build_nop ();
3233 unlink_stmt_vdef (stmt);
3234 release_defs (stmt);
3235 }
726a989a 3236 else
b28b1600 3237 {
726a989a 3238 new_stmt = gimple_build_assign (lhs, tmp);
5006671f
RG
3239 gimple_set_vuse (new_stmt, gimple_vuse (stmt));
3240 gimple_set_vdef (new_stmt, gimple_vdef (stmt));
726a989a 3241 move_ssa_defining_stmt_for_defs (new_stmt, stmt);
b28b1600
JJ
3242 }
3243
726a989a
RB
3244 gimple_set_location (new_stmt, gimple_location (stmt));
3245 gsi_replace (si_p, new_stmt, false);
b28b1600
JJ
3246}
3247
6de9cd9a
DN
3248/* A simple pass that attempts to fold all builtin functions. This pass
3249 is run after we've propagated as many constants as we can. */
3250
c2924966 3251static unsigned int
6de9cd9a
DN
3252execute_fold_all_builtins (void)
3253{
a7d6ba24 3254 bool cfg_changed = false;
6de9cd9a 3255 basic_block bb;
7b0e48fb
DB
3256 unsigned int todoflags = 0;
3257
6de9cd9a
DN
3258 FOR_EACH_BB (bb)
3259 {
726a989a
RB
3260 gimple_stmt_iterator i;
3261 for (i = gsi_start_bb (bb); !gsi_end_p (i); )
6de9cd9a 3262 {
726a989a 3263 gimple stmt, old_stmt;
6de9cd9a 3264 tree callee, result;
10a0d495 3265 enum built_in_function fcode;
6de9cd9a 3266
726a989a
RB
3267 stmt = gsi_stmt (i);
3268
3269 if (gimple_code (stmt) != GIMPLE_CALL)
10a0d495 3270 {
726a989a 3271 gsi_next (&i);
10a0d495
JJ
3272 continue;
3273 }
726a989a 3274 callee = gimple_call_fndecl (stmt);
6de9cd9a 3275 if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
10a0d495 3276 {
726a989a 3277 gsi_next (&i);
10a0d495
JJ
3278 continue;
3279 }
3280 fcode = DECL_FUNCTION_CODE (callee);
6de9cd9a 3281
726a989a 3282 result = ccp_fold_builtin (stmt);
53a8f709
UB
3283
3284 if (result)
726a989a 3285 gimple_remove_stmt_histograms (cfun, stmt);
53a8f709 3286
6de9cd9a
DN
3287 if (!result)
3288 switch (DECL_FUNCTION_CODE (callee))
3289 {
3290 case BUILT_IN_CONSTANT_P:
3291 /* Resolve __builtin_constant_p. If it hasn't been
3292 folded to integer_one_node by now, it's fairly
3293 certain that the value simply isn't constant. */
726a989a 3294 result = integer_zero_node;
6de9cd9a
DN
3295 break;
3296
cb8e078d 3297 case BUILT_IN_STACK_RESTORE:
726a989a 3298 result = optimize_stack_restore (i);
d7bd8aeb
JJ
3299 if (result)
3300 break;
726a989a 3301 gsi_next (&i);
d7bd8aeb
JJ
3302 continue;
3303
3304 case BUILT_IN_VA_START:
3305 case BUILT_IN_VA_END:
3306 case BUILT_IN_VA_COPY:
3307 /* These shouldn't be folded before pass_stdarg. */
726a989a 3308 result = optimize_stdarg_builtin (stmt);
cb8e078d
JJ
3309 if (result)
3310 break;
3311 /* FALLTHRU */
3312
6de9cd9a 3313 default:
726a989a 3314 gsi_next (&i);
6de9cd9a
DN
3315 continue;
3316 }
3317
3318 if (dump_file && (dump_flags & TDF_DETAILS))
3319 {
3320 fprintf (dump_file, "Simplified\n ");
726a989a 3321 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
6de9cd9a
DN
3322 }
3323
726a989a
RB
3324 old_stmt = stmt;
3325 push_stmt_changes (gsi_stmt_ptr (&i));
cfaab3a9 3326
726a989a 3327 if (!update_call_from_tree (&i, result))
4bad83f5
RG
3328 {
3329 gimplify_and_update_call_from_tree (&i, result);
3330 todoflags |= TODO_update_address_taken;
3331 }
cfaab3a9 3332
726a989a
RB
3333 stmt = gsi_stmt (i);
3334 pop_stmt_changes (gsi_stmt_ptr (&i));
cfaab3a9 3335
726a989a
RB
3336 if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt)
3337 && gimple_purge_dead_eh_edges (bb))
a7d6ba24 3338 cfg_changed = true;
6de9cd9a
DN
3339
3340 if (dump_file && (dump_flags & TDF_DETAILS))
3341 {
3342 fprintf (dump_file, "to\n ");
726a989a 3343 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
6de9cd9a
DN
3344 fprintf (dump_file, "\n");
3345 }
10a0d495
JJ
3346
3347 /* Retry the same statement if it changed into another
3348 builtin, there might be new opportunities now. */
726a989a 3349 if (gimple_code (stmt) != GIMPLE_CALL)
10a0d495 3350 {
726a989a 3351 gsi_next (&i);
10a0d495
JJ
3352 continue;
3353 }
726a989a 3354 callee = gimple_call_fndecl (stmt);
10a0d495 3355 if (!callee
726a989a 3356 || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
10a0d495 3357 || DECL_FUNCTION_CODE (callee) == fcode)
726a989a 3358 gsi_next (&i);
6de9cd9a
DN
3359 }
3360 }
7b0e48fb 3361
a7d6ba24 3362 /* Delete unreachable blocks. */
7b0e48fb
DB
3363 if (cfg_changed)
3364 todoflags |= TODO_cleanup_cfg;
3365
3366 return todoflags;
6de9cd9a
DN
3367}
3368
750628d8 3369
8ddbbcae 3370struct gimple_opt_pass pass_fold_builtins =
6de9cd9a 3371{
8ddbbcae
JH
3372 {
3373 GIMPLE_PASS,
6de9cd9a
DN
3374 "fab", /* name */
3375 NULL, /* gate */
3376 execute_fold_all_builtins, /* execute */
3377 NULL, /* sub */
3378 NULL, /* next */
3379 0, /* static_pass_number */
3380 0, /* tv_id */
7faade0f 3381 PROP_cfg | PROP_ssa, /* properties_required */
6de9cd9a
DN
3382 0, /* properties_provided */
3383 0, /* properties_destroyed */
3384 0, /* todo_flags_start */
b28b1600
JJ
3385 TODO_dump_func
3386 | TODO_verify_ssa
8ddbbcae
JH
3387 | TODO_update_ssa /* todo_flags_finish */
3388 }
6de9cd9a 3389};