]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa-ccp.c
Daily bump.
[thirdparty/gcc.git] / gcc / tree-ssa-ccp.c
CommitLineData
6de9cd9a 1/* Conditional constant propagation pass for the GNU compiler.
b6f65e3c 2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006
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
11Free Software Foundation; either version 2, or (at your option) any
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
20along with GCC; see the file COPYING. If not, write to the Free
366ccddb
KC
21Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2202110-1301, USA. */
6de9cd9a 23
0bca51f0
DN
24/* Conditional constant propagation (CCP) is based on the SSA
25 propagation engine (tree-ssa-propagate.c). Constant assignments of
26 the form VAR = CST are propagated from the assignments into uses of
27 VAR, which in turn may generate new constants. The simulation uses
28 a four level lattice to keep track of constant values associated
29 with SSA names. Given an SSA name V_i, it may take one of the
30 following values:
31
106dec71
ZD
32 UNINITIALIZED -> the initial state of the value. This value
33 is replaced with a correct initial value
34 the first time the value is used, so the
35 rest of the pass does not need to care about
36 it. Using this value simplifies initialization
37 of the pass, and prevents us from needlessly
38 scanning statements that are never reached.
0bca51f0
DN
39
40 UNDEFINED -> V_i is a local variable whose definition
41 has not been processed yet. Therefore we
42 don't yet know if its value is a constant
43 or not.
44
45 CONSTANT -> V_i has been found to hold a constant
46 value C.
47
48 VARYING -> V_i cannot take a constant value, or if it
49 does, it is not possible to determine it
50 at compile time.
51
52 The core of SSA-CCP is in ccp_visit_stmt and ccp_visit_phi_node:
53
54 1- In ccp_visit_stmt, we are interested in assignments whose RHS
55 evaluates into a constant and conditional jumps whose predicate
56 evaluates into a boolean true or false. When an assignment of
57 the form V_i = CONST is found, V_i's lattice value is set to
58 CONSTANT and CONST is associated with it. This causes the
59 propagation engine to add all the SSA edges coming out the
60 assignment into the worklists, so that statements that use V_i
61 can be visited.
62
63 If the statement is a conditional with a constant predicate, we
64 mark the outgoing edges as executable or not executable
65 depending on the predicate's value. This is then used when
66 visiting PHI nodes to know when a PHI argument can be ignored.
67
68
69 2- In ccp_visit_phi_node, if all the PHI arguments evaluate to the
70 same constant C, then the LHS of the PHI is set to C. This
71 evaluation is known as the "meet operation". Since one of the
72 goals of this evaluation is to optimistically return constant
73 values as often as possible, it uses two main short cuts:
74
75 - If an argument is flowing in through a non-executable edge, it
76 is ignored. This is useful in cases like this:
77
78 if (PRED)
79 a_9 = 3;
80 else
81 a_10 = 100;
82 a_11 = PHI (a_9, a_10)
83
84 If PRED is known to always evaluate to false, then we can
85 assume that a_11 will always take its value from a_10, meaning
86 that instead of consider it VARYING (a_9 and a_10 have
87 different values), we can consider it CONSTANT 100.
88
89 - If an argument has an UNDEFINED value, then it does not affect
90 the outcome of the meet operation. If a variable V_i has an
91 UNDEFINED value, it means that either its defining statement
92 hasn't been visited yet or V_i has no defining statement, in
93 which case the original symbol 'V' is being used
94 uninitialized. Since 'V' is a local variable, the compiler
95 may assume any initial value for it.
96
97
98 After propagation, every variable V_i that ends up with a lattice
99 value of CONSTANT will have the associated constant value in the
100 array CONST_VAL[i].VALUE. That is fed into substitute_and_fold for
101 final substitution and folding.
102
103
104 Constant propagation in stores and loads (STORE-CCP)
105 ----------------------------------------------------
106
107 While CCP has all the logic to propagate constants in GIMPLE
108 registers, it is missing the ability to associate constants with
109 stores and loads (i.e., pointer dereferences, structures and
110 global/aliased variables). We don't keep loads and stores in
111 SSA, but we do build a factored use-def web for them (in the
112 virtual operands).
113
114 For instance, consider the following code fragment:
115
116 struct A a;
117 const int B = 42;
118
119 void foo (int i)
120 {
121 if (i > 10)
122 a.a = 42;
123 else
124 {
125 a.b = 21;
126 a.a = a.b + 21;
127 }
128
129 if (a.a != B)
130 never_executed ();
131 }
132
133 We should be able to deduce that the predicate 'a.a != B' is always
134 false. To achieve this, we associate constant values to the SSA
135 names in the V_MAY_DEF and V_MUST_DEF operands for each store.
136 Additionally, since we also glob partial loads/stores with the base
137 symbol, we also keep track of the memory reference where the
138 constant value was stored (in the MEM_REF field of PROP_VALUE_T).
139 For instance,
140
141 # a_5 = V_MAY_DEF <a_4>
142 a.a = 2;
143
144 # VUSE <a_5>
145 x_3 = a.b;
146
147 In the example above, CCP will associate value '2' with 'a_5', but
148 it would be wrong to replace the load from 'a.b' with '2', because
149 '2' had been stored into a.a.
150
106dec71
ZD
151 Note that the initial value of virtual operands is VARYING, not
152 UNDEFINED. Consider, for instance global variables:
0bca51f0
DN
153
154 int A;
155
156 foo (int i)
157 {
158 if (i_3 > 10)
159 A_4 = 3;
160 # A_5 = PHI (A_4, A_2);
161
162 # VUSE <A_5>
163 A.0_6 = A;
164
165 return A.0_6;
166 }
167
168 The value of A_2 cannot be assumed to be UNDEFINED, as it may have
169 been defined outside of foo. If we were to assume it UNDEFINED, we
106dec71 170 would erroneously optimize the above into 'return 3;'.
0bca51f0
DN
171
172 Though STORE-CCP is not too expensive, it does have to do more work
173 than regular CCP, so it is only enabled at -O2. Both regular CCP
174 and STORE-CCP use the exact same algorithm. The only distinction
175 is that when doing STORE-CCP, the boolean variable DO_STORE_CCP is
176 set to true. This affects the evaluation of statements and PHI
177 nodes.
6de9cd9a
DN
178
179 References:
180
181 Constant propagation with conditional branches,
182 Wegman and Zadeck, ACM TOPLAS 13(2):181-210.
183
184 Building an Optimizing Compiler,
185 Robert Morgan, Butterworth-Heinemann, 1998, Section 8.9.
186
187 Advanced Compiler Design and Implementation,
188 Steven Muchnick, Morgan Kaufmann, 1997, Section 12.6 */
189
190#include "config.h"
191#include "system.h"
192#include "coretypes.h"
193#include "tm.h"
6de9cd9a 194#include "tree.h"
750628d8 195#include "flags.h"
6de9cd9a
DN
196#include "rtl.h"
197#include "tm_p.h"
750628d8 198#include "ggc.h"
6de9cd9a 199#include "basic-block.h"
750628d8 200#include "output.h"
750628d8
DN
201#include "expr.h"
202#include "function.h"
6de9cd9a 203#include "diagnostic.h"
750628d8 204#include "timevar.h"
6de9cd9a 205#include "tree-dump.h"
750628d8 206#include "tree-flow.h"
6de9cd9a 207#include "tree-pass.h"
750628d8
DN
208#include "tree-ssa-propagate.h"
209#include "langhooks.h"
ae3df618 210#include "target.h"
6de9cd9a
DN
211
212
213/* Possible lattice values. */
214typedef enum
215{
106dec71 216 UNINITIALIZED,
6de9cd9a
DN
217 UNDEFINED,
218 CONSTANT,
219 VARYING
0bca51f0 220} ccp_lattice_t;
6de9cd9a 221
0bca51f0
DN
222/* Array of propagated constant values. After propagation,
223 CONST_VAL[I].VALUE holds the constant value for SSA_NAME(I). If
224 the constant is held in an SSA name representing a memory store
225 (i.e., a V_MAY_DEF or V_MUST_DEF), CONST_VAL[I].MEM_REF will
226 contain the actual memory reference used to store (i.e., the LHS of
227 the assignment doing the store). */
404f4351 228static prop_value_t *const_val;
6de9cd9a 229
0bca51f0
DN
230/* True if we are also propagating constants in stores and loads. */
231static bool do_store_ccp;
6de9cd9a 232
0bca51f0 233/* Dump constant propagation value VAL to file OUTF prefixed by PREFIX. */
95eec0d6
DB
234
235static void
0bca51f0 236dump_lattice_value (FILE *outf, const char *prefix, prop_value_t val)
95eec0d6 237{
750628d8 238 switch (val.lattice_val)
95eec0d6 239 {
0bca51f0
DN
240 case UNINITIALIZED:
241 fprintf (outf, "%sUNINITIALIZED", prefix);
242 break;
750628d8
DN
243 case UNDEFINED:
244 fprintf (outf, "%sUNDEFINED", prefix);
245 break;
246 case VARYING:
247 fprintf (outf, "%sVARYING", prefix);
248 break;
750628d8
DN
249 case CONSTANT:
250 fprintf (outf, "%sCONSTANT ", prefix);
0bca51f0 251 print_generic_expr (outf, val.value, dump_flags);
750628d8
DN
252 break;
253 default:
1e128c5f 254 gcc_unreachable ();
750628d8 255 }
95eec0d6 256}
6de9cd9a 257
6de9cd9a 258
0bca51f0
DN
259/* Print lattice value VAL to stderr. */
260
261void debug_lattice_value (prop_value_t val);
262
263void
264debug_lattice_value (prop_value_t val)
265{
266 dump_lattice_value (stderr, "", val);
267 fprintf (stderr, "\n");
268}
6de9cd9a 269
6de9cd9a 270
688e936d
RH
271/* The regular is_gimple_min_invariant does a shallow test of the object.
272 It assumes that full gimplification has happened, or will happen on the
273 object. For a value coming from DECL_INITIAL, this is not true, so we
6416ae7f 274 have to be more strict ourselves. */
688e936d
RH
275
276static bool
277ccp_decl_initial_min_invariant (tree t)
278{
279 if (!is_gimple_min_invariant (t))
280 return false;
281 if (TREE_CODE (t) == ADDR_EXPR)
282 {
283 /* Inline and unroll is_gimple_addressable. */
284 while (1)
285 {
286 t = TREE_OPERAND (t, 0);
287 if (is_gimple_id (t))
288 return true;
289 if (!handled_component_p (t))
290 return false;
291 }
292 }
293 return true;
294}
295
fc9962ee
ZD
296/* If SYM is a constant variable with known value, return the value.
297 NULL_TREE is returned otherwise. */
298
299static tree
300get_symbol_constant_value (tree sym)
301{
302 if (TREE_STATIC (sym)
303 && TREE_READONLY (sym)
304 && !MTAG_P (sym))
305 {
306 tree val = DECL_INITIAL (sym);
307 if (val
308 && ccp_decl_initial_min_invariant (val))
309 return val;
310 }
311
312 return NULL_TREE;
313}
688e936d 314
0bca51f0
DN
315/* Compute a default value for variable VAR and store it in the
316 CONST_VAL array. The following rules are used to get default
317 values:
95eec0d6 318
0bca51f0
DN
319 1- Global and static variables that are declared constant are
320 considered CONSTANT.
321
322 2- Any other value is considered UNDEFINED. This is useful when
750628d8
DN
323 considering PHI nodes. PHI arguments that are undefined do not
324 change the constant value of the PHI node, which allows for more
0bca51f0 325 constants to be propagated.
6de9cd9a 326
0bca51f0
DN
327 3- If SSA_NAME_VALUE is set and it is a constant, its value is
328 used.
6de9cd9a 329
0bca51f0
DN
330 4- Variables defined by statements other than assignments and PHI
331 nodes are considered VARYING.
6de9cd9a 332
106dec71
ZD
333 5- Initial values of variables that are not GIMPLE registers are
334 considered VARYING. */
6de9cd9a 335
0bca51f0
DN
336static prop_value_t
337get_default_value (tree var)
338{
339 tree sym = SSA_NAME_VAR (var);
340 prop_value_t val = { UNINITIALIZED, NULL_TREE, NULL_TREE };
fc9962ee 341 tree cst_val;
106dec71 342
0bca51f0 343 if (!do_store_ccp && !is_gimple_reg (var))
6de9cd9a 344 {
0bca51f0
DN
345 /* Short circuit for regular CCP. We are not interested in any
346 non-register when DO_STORE_CCP is false. */
750628d8 347 val.lattice_val = VARYING;
6de9cd9a 348 }
0bca51f0
DN
349 else if (SSA_NAME_VALUE (var)
350 && is_gimple_min_invariant (SSA_NAME_VALUE (var)))
750628d8 351 {
0bca51f0
DN
352 val.lattice_val = CONSTANT;
353 val.value = SSA_NAME_VALUE (var);
750628d8 354 }
fc9962ee 355 else if ((cst_val = get_symbol_constant_value (sym)) != NULL_TREE)
750628d8 356 {
0bca51f0
DN
357 /* Globals and static variables declared 'const' take their
358 initial value. */
359 val.lattice_val = CONSTANT;
fc9962ee 360 val.value = cst_val;
0bca51f0 361 val.mem_ref = sym;
750628d8
DN
362 }
363 else
364 {
750628d8 365 tree stmt = SSA_NAME_DEF_STMT (var);
6de9cd9a 366
0bca51f0
DN
367 if (IS_EMPTY_STMT (stmt))
368 {
369 /* Variables defined by an empty statement are those used
370 before being initialized. If VAR is a local variable, we
106dec71
ZD
371 can assume initially that it is UNDEFINED, otherwise we must
372 consider it VARYING. */
0bca51f0
DN
373 if (is_gimple_reg (sym) && TREE_CODE (sym) != PARM_DECL)
374 val.lattice_val = UNDEFINED;
0bca51f0 375 else
750628d8
DN
376 val.lattice_val = VARYING;
377 }
07beea0d 378 else if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
0bca51f0
DN
379 || TREE_CODE (stmt) == PHI_NODE)
380 {
381 /* Any other variable defined by an assignment or a PHI node
106dec71
ZD
382 is considered UNDEFINED. */
383 val.lattice_val = UNDEFINED;
0bca51f0
DN
384 }
385 else
386 {
387 /* Otherwise, VAR will never take on a constant value. */
388 val.lattice_val = VARYING;
389 }
750628d8 390 }
6de9cd9a 391
750628d8
DN
392 return val;
393}
6de9cd9a 394
6de9cd9a 395
106dec71 396/* Get the constant value associated with variable VAR. */
6de9cd9a 397
106dec71
ZD
398static inline prop_value_t *
399get_value (tree var)
0bca51f0
DN
400{
401 prop_value_t *val = &const_val[SSA_NAME_VERSION (var)];
106dec71
ZD
402
403 if (val->lattice_val == UNINITIALIZED)
6de9cd9a
DN
404 *val = get_default_value (var);
405
406 return val;
407}
408
106dec71
ZD
409/* Sets the value associated with VAR to VARYING. */
410
411static inline void
412set_value_varying (tree var)
413{
414 prop_value_t *val = &const_val[SSA_NAME_VERSION (var)];
415
416 val->lattice_val = VARYING;
417 val->value = NULL_TREE;
418 val->mem_ref = NULL_TREE;
419}
6de9cd9a 420
fbb5445b
L
421/* For float types, modify the value of VAL to make ccp work correctly
422 for non-standard values (-0, NaN):
423
424 If HONOR_SIGNED_ZEROS is false, and VAL = -0, we canonicalize it to 0.
425 If HONOR_NANS is false, and VAL is NaN, we canonicalize it to UNDEFINED.
426 This is to fix the following problem (see PR 29921): Suppose we have
427
428 x = 0.0 * y
429
430 and we set value of y to NaN. This causes value of x to be set to NaN.
431 When we later determine that y is in fact VARYING, fold uses the fact
432 that HONOR_NANS is false, and we try to change the value of x to 0,
433 causing an ICE. With HONOR_NANS being false, the real appearance of
434 NaN would cause undefined behavior, though, so claiming that y (and x)
435 are UNDEFINED initially is correct. */
436
437static void
438canonicalize_float_value (prop_value_t *val)
439{
440 enum machine_mode mode;
441 tree type;
442 REAL_VALUE_TYPE d;
443
444 if (val->lattice_val != CONSTANT
445 || TREE_CODE (val->value) != REAL_CST)
446 return;
447
448 d = TREE_REAL_CST (val->value);
449 type = TREE_TYPE (val->value);
450 mode = TYPE_MODE (type);
451
452 if (!HONOR_SIGNED_ZEROS (mode)
453 && REAL_VALUE_MINUS_ZERO (d))
454 {
455 val->value = build_real (type, dconst0);
456 return;
457 }
458
459 if (!HONOR_NANS (mode)
460 && REAL_VALUE_ISNAN (d))
461 {
462 val->lattice_val = UNDEFINED;
463 val->value = NULL;
464 val->mem_ref = NULL;
465 return;
466 }
467}
468
0bca51f0
DN
469/* Set the value for variable VAR to NEW_VAL. Return true if the new
470 value is different from VAR's previous value. */
6de9cd9a 471
750628d8 472static bool
0bca51f0 473set_lattice_value (tree var, prop_value_t new_val)
6de9cd9a 474{
106dec71 475 prop_value_t *old_val = get_value (var);
0bca51f0 476
fbb5445b
L
477 canonicalize_float_value (&new_val);
478
0bca51f0 479 /* Lattice transitions must always be monotonically increasing in
106dec71
ZD
480 value. If *OLD_VAL and NEW_VAL are the same, return false to
481 inform the caller that this was a non-transition. */
482
fc9962ee 483 gcc_assert (old_val->lattice_val < new_val.lattice_val
0bca51f0 484 || (old_val->lattice_val == new_val.lattice_val
fc9962ee
ZD
485 && ((!old_val->value && !new_val.value)
486 || operand_equal_p (old_val->value, new_val.value, 0))
106dec71 487 && old_val->mem_ref == new_val.mem_ref));
0bca51f0
DN
488
489 if (old_val->lattice_val != new_val.lattice_val)
6de9cd9a 490 {
750628d8
DN
491 if (dump_file && (dump_flags & TDF_DETAILS))
492 {
0bca51f0 493 dump_lattice_value (dump_file, "Lattice value changed to ", new_val);
106dec71 494 fprintf (dump_file, ". Adding SSA edges to worklist.\n");
750628d8
DN
495 }
496
0bca51f0
DN
497 *old_val = new_val;
498
106dec71
ZD
499 gcc_assert (new_val.lattice_val != UNDEFINED);
500 return true;
6de9cd9a 501 }
750628d8
DN
502
503 return false;
6de9cd9a
DN
504}
505
506
0bca51f0 507/* Return the likely CCP lattice value for STMT.
6de9cd9a 508
750628d8 509 If STMT has no operands, then return CONSTANT.
6de9cd9a 510
750628d8 511 Else if any operands of STMT are undefined, then return UNDEFINED.
6de9cd9a 512
750628d8 513 Else if any operands of STMT are constants, then return CONSTANT.
6de9cd9a 514
750628d8 515 Else return VARYING. */
6de9cd9a 516
0bca51f0 517static ccp_lattice_t
750628d8
DN
518likely_value (tree stmt)
519{
106dec71 520 bool has_constant_operand;
750628d8
DN
521 stmt_ann_t ann;
522 tree use;
523 ssa_op_iter iter;
6de9cd9a 524
750628d8 525 ann = stmt_ann (stmt);
0bca51f0
DN
526
527 /* If the statement has volatile operands, it won't fold to a
528 constant value. */
529 if (ann->has_volatile_ops)
530 return VARYING;
531
532 /* If we are not doing store-ccp, statements with loads
533 and/or stores will never fold into a constant. */
534 if (!do_store_ccp
ff88c5aa 535 && !ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
750628d8 536 return VARYING;
6de9cd9a 537
0bca51f0
DN
538
539 /* A CALL_EXPR is assumed to be varying. NOTE: This may be overly
540 conservative, in the presence of const and pure calls. */
750628d8
DN
541 if (get_call_expr_in (stmt) != NULL_TREE)
542 return VARYING;
6de9cd9a 543
0bca51f0
DN
544 /* Anything other than assignments and conditional jumps are not
545 interesting for CCP. */
07beea0d 546 if (TREE_CODE (stmt) != GIMPLE_MODIFY_STMT
106dec71 547 && !(TREE_CODE (stmt) == RETURN_EXPR && get_rhs (stmt) != NULL_TREE)
0bca51f0
DN
548 && TREE_CODE (stmt) != COND_EXPR
549 && TREE_CODE (stmt) != SWITCH_EXPR)
550 return VARYING;
551
a318e3ac
SB
552 if (is_gimple_min_invariant (get_rhs (stmt)))
553 return CONSTANT;
554
106dec71
ZD
555 has_constant_operand = false;
556 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE | SSA_OP_VUSE)
750628d8 557 {
106dec71 558 prop_value_t *val = get_value (use);
750628d8 559
106dec71
ZD
560 if (val->lattice_val == UNDEFINED)
561 return UNDEFINED;
0bca51f0 562
750628d8 563 if (val->lattice_val == CONSTANT)
106dec71 564 has_constant_operand = true;
6de9cd9a 565 }
750628d8 566
106dec71
ZD
567 if (has_constant_operand
568 /* We do not consider virtual operands here -- load from read-only
569 memory may have only VARYING virtual operands, but still be
570 constant. */
571 || ZERO_SSA_OPERANDS (stmt, SSA_OP_USE))
0bca51f0
DN
572 return CONSTANT;
573
106dec71 574 return VARYING;
6de9cd9a
DN
575}
576
106dec71
ZD
577/* Returns true if STMT cannot be constant. */
578
579static bool
580surely_varying_stmt_p (tree stmt)
581{
582 /* If the statement has operands that we cannot handle, it cannot be
583 constant. */
584 if (stmt_ann (stmt)->has_volatile_ops)
585 return true;
586
587 if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
588 {
589 if (!do_store_ccp)
590 return true;
591
592 /* We can only handle simple loads and stores. */
593 if (!stmt_makes_single_load (stmt)
594 && !stmt_makes_single_store (stmt))
595 return true;
596 }
597
598 /* If it contains a call, it is varying. */
599 if (get_call_expr_in (stmt) != NULL_TREE)
600 return true;
601
602 /* Anything other than assignments and conditional jumps are not
603 interesting for CCP. */
07beea0d 604 if (TREE_CODE (stmt) != GIMPLE_MODIFY_STMT
106dec71
ZD
605 && !(TREE_CODE (stmt) == RETURN_EXPR && get_rhs (stmt) != NULL_TREE)
606 && TREE_CODE (stmt) != COND_EXPR
607 && TREE_CODE (stmt) != SWITCH_EXPR)
608 return true;
609
610 return false;
611}
6de9cd9a 612
750628d8 613/* Initialize local data structures for CCP. */
6de9cd9a
DN
614
615static void
750628d8 616ccp_initialize (void)
6de9cd9a 617{
750628d8 618 basic_block bb;
6de9cd9a 619
b9eae1a9 620 const_val = XCNEWVEC (prop_value_t, num_ssa_names);
6de9cd9a 621
750628d8
DN
622 /* Initialize simulation flags for PHI nodes and statements. */
623 FOR_EACH_BB (bb)
6de9cd9a 624 {
750628d8 625 block_stmt_iterator i;
6de9cd9a 626
750628d8
DN
627 for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i))
628 {
750628d8 629 tree stmt = bsi_stmt (i);
106dec71 630 bool is_varying = surely_varying_stmt_p (stmt);
6de9cd9a 631
106dec71 632 if (is_varying)
750628d8 633 {
0bca51f0
DN
634 tree def;
635 ssa_op_iter iter;
636
637 /* If the statement will not produce a constant, mark
638 all its outputs VARYING. */
639 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
106dec71
ZD
640 {
641 if (is_varying)
642 set_value_varying (def);
643 }
750628d8
DN
644 }
645
750628d8
DN
646 DONT_SIMULATE_AGAIN (stmt) = is_varying;
647 }
6de9cd9a
DN
648 }
649
106dec71
ZD
650 /* Now process PHI nodes. We never set DONT_SIMULATE_AGAIN on phi node,
651 since we do not know which edges are executable yet, except for
652 phi nodes for virtual operands when we do not do store ccp. */
750628d8 653 FOR_EACH_BB (bb)
6de9cd9a 654 {
0bca51f0 655 tree phi;
750628d8
DN
656
657 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
658 {
106dec71
ZD
659 if (!do_store_ccp && !is_gimple_reg (PHI_RESULT (phi)))
660 DONT_SIMULATE_AGAIN (phi) = true;
661 else
662 DONT_SIMULATE_AGAIN (phi) = false;
750628d8 663 }
6de9cd9a 664 }
750628d8 665}
6de9cd9a 666
6de9cd9a 667
0bca51f0
DN
668/* Do final substitution of propagated values, cleanup the flowgraph and
669 free allocated storage. */
6de9cd9a 670
0bca51f0
DN
671static void
672ccp_finalize (void)
6de9cd9a 673{
0bca51f0 674 /* Perform substitutions based on the known constant values. */
227858d1 675 substitute_and_fold (const_val, false);
6de9cd9a 676
0bca51f0 677 free (const_val);
6de9cd9a
DN
678}
679
680
0bca51f0
DN
681/* Compute the meet operator between *VAL1 and *VAL2. Store the result
682 in VAL1.
683
684 any M UNDEFINED = any
0bca51f0
DN
685 any M VARYING = VARYING
686 Ci M Cj = Ci if (i == j)
687 Ci M Cj = VARYING if (i != j)
106dec71 688 */
6de9cd9a
DN
689
690static void
0bca51f0 691ccp_lattice_meet (prop_value_t *val1, prop_value_t *val2)
6de9cd9a 692{
0bca51f0 693 if (val1->lattice_val == UNDEFINED)
6de9cd9a 694 {
0bca51f0
DN
695 /* UNDEFINED M any = any */
696 *val1 = *val2;
750628d8 697 }
0bca51f0 698 else if (val2->lattice_val == UNDEFINED)
195da47b 699 {
0bca51f0
DN
700 /* any M UNDEFINED = any
701 Nothing to do. VAL1 already contains the value we want. */
702 ;
195da47b 703 }
0bca51f0
DN
704 else if (val1->lattice_val == VARYING
705 || val2->lattice_val == VARYING)
750628d8 706 {
0bca51f0
DN
707 /* any M VARYING = VARYING. */
708 val1->lattice_val = VARYING;
709 val1->value = NULL_TREE;
710 val1->mem_ref = NULL_TREE;
750628d8 711 }
0bca51f0
DN
712 else if (val1->lattice_val == CONSTANT
713 && val2->lattice_val == CONSTANT
714 && simple_cst_equal (val1->value, val2->value) == 1
715 && (!do_store_ccp
a318e3ac
SB
716 || (val1->mem_ref && val2->mem_ref
717 && operand_equal_p (val1->mem_ref, val2->mem_ref, 0))))
750628d8 718 {
0bca51f0
DN
719 /* Ci M Cj = Ci if (i == j)
720 Ci M Cj = VARYING if (i != j)
721
722 If these two values come from memory stores, make sure that
723 they come from the same memory reference. */
724 val1->lattice_val = CONSTANT;
725 val1->value = val1->value;
726 val1->mem_ref = val1->mem_ref;
750628d8
DN
727 }
728 else
729 {
0bca51f0
DN
730 /* Any other combination is VARYING. */
731 val1->lattice_val = VARYING;
732 val1->value = NULL_TREE;
733 val1->mem_ref = NULL_TREE;
750628d8 734 }
6de9cd9a
DN
735}
736
737
750628d8
DN
738/* Loop through the PHI_NODE's parameters for BLOCK and compare their
739 lattice values to determine PHI_NODE's lattice value. The value of a
0bca51f0 740 PHI node is determined calling ccp_lattice_meet with all the arguments
750628d8 741 of the PHI node that are incoming via executable edges. */
6de9cd9a 742
750628d8
DN
743static enum ssa_prop_result
744ccp_visit_phi_node (tree phi)
6de9cd9a 745{
750628d8 746 int i;
0bca51f0 747 prop_value_t *old_val, new_val;
6de9cd9a 748
750628d8 749 if (dump_file && (dump_flags & TDF_DETAILS))
6de9cd9a 750 {
750628d8
DN
751 fprintf (dump_file, "\nVisiting PHI node: ");
752 print_generic_expr (dump_file, phi, dump_flags);
6de9cd9a 753 }
6de9cd9a 754
106dec71 755 old_val = get_value (PHI_RESULT (phi));
750628d8
DN
756 switch (old_val->lattice_val)
757 {
758 case VARYING:
0bca51f0 759 return SSA_PROP_VARYING;
6de9cd9a 760
750628d8
DN
761 case CONSTANT:
762 new_val = *old_val;
763 break;
6de9cd9a 764
750628d8 765 case UNDEFINED:
750628d8 766 new_val.lattice_val = UNDEFINED;
0bca51f0
DN
767 new_val.value = NULL_TREE;
768 new_val.mem_ref = NULL_TREE;
750628d8 769 break;
6de9cd9a 770
750628d8 771 default:
1e128c5f 772 gcc_unreachable ();
750628d8 773 }
6de9cd9a 774
750628d8
DN
775 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
776 {
0bca51f0
DN
777 /* Compute the meet operator over all the PHI arguments flowing
778 through executable edges. */
750628d8 779 edge e = PHI_ARG_EDGE (phi, i);
6de9cd9a 780
750628d8
DN
781 if (dump_file && (dump_flags & TDF_DETAILS))
782 {
783 fprintf (dump_file,
784 "\n Argument #%d (%d -> %d %sexecutable)\n",
785 i, e->src->index, e->dest->index,
786 (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
787 }
788
789 /* If the incoming edge is executable, Compute the meet operator for
790 the existing value of the PHI node and the current PHI argument. */
791 if (e->flags & EDGE_EXECUTABLE)
792 {
0bca51f0
DN
793 tree arg = PHI_ARG_DEF (phi, i);
794 prop_value_t arg_val;
6de9cd9a 795
0bca51f0 796 if (is_gimple_min_invariant (arg))
750628d8 797 {
0bca51f0
DN
798 arg_val.lattice_val = CONSTANT;
799 arg_val.value = arg;
800 arg_val.mem_ref = NULL_TREE;
750628d8
DN
801 }
802 else
106dec71 803 arg_val = *(get_value (arg));
6de9cd9a 804
0bca51f0 805 ccp_lattice_meet (&new_val, &arg_val);
6de9cd9a 806
750628d8
DN
807 if (dump_file && (dump_flags & TDF_DETAILS))
808 {
809 fprintf (dump_file, "\t");
0bca51f0
DN
810 print_generic_expr (dump_file, arg, dump_flags);
811 dump_lattice_value (dump_file, "\tValue: ", arg_val);
750628d8
DN
812 fprintf (dump_file, "\n");
813 }
6de9cd9a 814
750628d8
DN
815 if (new_val.lattice_val == VARYING)
816 break;
817 }
818 }
6de9cd9a
DN
819
820 if (dump_file && (dump_flags & TDF_DETAILS))
750628d8
DN
821 {
822 dump_lattice_value (dump_file, "\n PHI node value: ", new_val);
823 fprintf (dump_file, "\n\n");
824 }
825
106dec71 826 /* Make the transition to the new value. */
750628d8
DN
827 if (set_lattice_value (PHI_RESULT (phi), new_val))
828 {
829 if (new_val.lattice_val == VARYING)
830 return SSA_PROP_VARYING;
831 else
832 return SSA_PROP_INTERESTING;
833 }
834 else
835 return SSA_PROP_NOT_INTERESTING;
6de9cd9a
DN
836}
837
838
750628d8
DN
839/* CCP specific front-end to the non-destructive constant folding
840 routines.
6de9cd9a
DN
841
842 Attempt to simplify the RHS of STMT knowing that one or more
843 operands are constants.
844
845 If simplification is possible, return the simplified RHS,
846 otherwise return the original RHS. */
847
848static tree
849ccp_fold (tree stmt)
850{
851 tree rhs = get_rhs (stmt);
852 enum tree_code code = TREE_CODE (rhs);
6615c446 853 enum tree_code_class kind = TREE_CODE_CLASS (code);
6de9cd9a
DN
854 tree retval = NULL_TREE;
855
6de9cd9a 856 if (TREE_CODE (rhs) == SSA_NAME)
0bca51f0
DN
857 {
858 /* If the RHS is an SSA_NAME, return its known constant value,
859 if any. */
106dec71 860 return get_value (rhs)->value;
0bca51f0
DN
861 }
862 else if (do_store_ccp && stmt_makes_single_load (stmt))
863 {
864 /* If the RHS is a memory load, see if the VUSEs associated with
865 it are a valid constant for that memory load. */
866 prop_value_t *val = get_value_loaded_by (stmt, const_val);
add9e6d3
AP
867 if (val && val->mem_ref)
868 {
869 if (operand_equal_p (val->mem_ref, rhs, 0))
870 return val->value;
871
872 /* If RHS is extracting REALPART_EXPR or IMAGPART_EXPR of a
873 complex type with a known constant value, return it. */
874 if ((TREE_CODE (rhs) == REALPART_EXPR
875 || TREE_CODE (rhs) == IMAGPART_EXPR)
876 && operand_equal_p (val->mem_ref, TREE_OPERAND (rhs, 0), 0))
877 return fold_build1 (TREE_CODE (rhs), TREE_TYPE (rhs), val->value);
878 }
879 return NULL_TREE;
0bca51f0 880 }
6de9cd9a
DN
881
882 /* Unary operators. Note that we know the single operand must
883 be a constant. So this should almost always return a
884 simplified RHS. */
6615c446 885 if (kind == tcc_unary)
6de9cd9a
DN
886 {
887 /* Handle unary operators which can appear in GIMPLE form. */
888 tree op0 = TREE_OPERAND (rhs, 0);
889
890 /* Simplify the operand down to a constant. */
891 if (TREE_CODE (op0) == SSA_NAME)
892 {
106dec71 893 prop_value_t *val = get_value (op0);
6de9cd9a 894 if (val->lattice_val == CONSTANT)
106dec71 895 op0 = get_value (op0)->value;
6de9cd9a
DN
896 }
897
078152a2
JH
898 if ((code == NOP_EXPR || code == CONVERT_EXPR)
899 && tree_ssa_useless_type_conversion_1 (TREE_TYPE (rhs),
900 TREE_TYPE (op0)))
901 return op0;
615bc06a 902 return fold_unary (code, TREE_TYPE (rhs), op0);
6de9cd9a
DN
903 }
904
905 /* Binary and comparison operators. We know one or both of the
906 operands are constants. */
6615c446
JO
907 else if (kind == tcc_binary
908 || kind == tcc_comparison
6de9cd9a
DN
909 || code == TRUTH_AND_EXPR
910 || code == TRUTH_OR_EXPR
911 || code == TRUTH_XOR_EXPR)
912 {
913 /* Handle binary and comparison operators that can appear in
914 GIMPLE form. */
915 tree op0 = TREE_OPERAND (rhs, 0);
916 tree op1 = TREE_OPERAND (rhs, 1);
917
918 /* Simplify the operands down to constants when appropriate. */
919 if (TREE_CODE (op0) == SSA_NAME)
920 {
106dec71 921 prop_value_t *val = get_value (op0);
6de9cd9a 922 if (val->lattice_val == CONSTANT)
0bca51f0 923 op0 = val->value;
6de9cd9a
DN
924 }
925
926 if (TREE_CODE (op1) == SSA_NAME)
927 {
106dec71 928 prop_value_t *val = get_value (op1);
6de9cd9a 929 if (val->lattice_val == CONSTANT)
0bca51f0 930 op1 = val->value;
6de9cd9a
DN
931 }
932
615bc06a 933 return fold_binary (code, TREE_TYPE (rhs), op0, op1);
6de9cd9a
DN
934 }
935
936 /* We may be able to fold away calls to builtin functions if their
9cf737f8 937 arguments are constants. */
6de9cd9a
DN
938 else if (code == CALL_EXPR
939 && TREE_CODE (TREE_OPERAND (rhs, 0)) == ADDR_EXPR
940 && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0))
941 == FUNCTION_DECL)
942 && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0)))
943 {
f47c96aa 944 if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_USE))
6de9cd9a 945 {
f47c96aa 946 tree *orig, var;
49d1af89 947 tree fndecl, arglist;
f47c96aa
AM
948 size_t i = 0;
949 ssa_op_iter iter;
950 use_operand_p var_p;
6de9cd9a
DN
951
952 /* Preserve the original values of every operand. */
858904db 953 orig = XNEWVEC (tree, NUM_SSA_OPERANDS (stmt, SSA_OP_USE));
f47c96aa
AM
954 FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE)
955 orig[i++] = var;
6de9cd9a
DN
956
957 /* Substitute operands with their values and try to fold. */
0bca51f0 958 replace_uses_in (stmt, NULL, const_val);
49d1af89
KH
959 fndecl = get_callee_fndecl (rhs);
960 arglist = TREE_OPERAND (rhs, 1);
961 retval = fold_builtin (fndecl, arglist, false);
6de9cd9a
DN
962
963 /* Restore operands to their original form. */
f47c96aa
AM
964 i = 0;
965 FOR_EACH_SSA_USE_OPERAND (var_p, stmt, iter, SSA_OP_USE)
966 SET_USE (var_p, orig[i++]);
6de9cd9a
DN
967 free (orig);
968 }
969 }
970 else
971 return rhs;
972
973 /* If we got a simplified form, see if we need to convert its type. */
974 if (retval)
a32e70c3 975 return fold_convert (TREE_TYPE (rhs), retval);
6de9cd9a
DN
976
977 /* No simplification was possible. */
978 return rhs;
979}
980
981
ae3df618
SB
982/* Return the tree representing the element referenced by T if T is an
983 ARRAY_REF or COMPONENT_REF into constant aggregates. Return
984 NULL_TREE otherwise. */
985
986static tree
987fold_const_aggregate_ref (tree t)
988{
989 prop_value_t *value;
4038c495
GB
990 tree base, ctor, idx, field;
991 unsigned HOST_WIDE_INT cnt;
992 tree cfield, cval;
ae3df618
SB
993
994 switch (TREE_CODE (t))
995 {
996 case ARRAY_REF:
997 /* Get a CONSTRUCTOR. If BASE is a VAR_DECL, get its
998 DECL_INITIAL. If BASE is a nested reference into another
999 ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1000 the inner reference. */
1001 base = TREE_OPERAND (t, 0);
1002 switch (TREE_CODE (base))
1003 {
1004 case VAR_DECL:
1005 if (!TREE_READONLY (base)
1006 || TREE_CODE (TREE_TYPE (base)) != ARRAY_TYPE
1007 || !targetm.binds_local_p (base))
1008 return NULL_TREE;
1009
1010 ctor = DECL_INITIAL (base);
1011 break;
1012
1013 case ARRAY_REF:
1014 case COMPONENT_REF:
1015 ctor = fold_const_aggregate_ref (base);
1016 break;
1017
1018 default:
1019 return NULL_TREE;
1020 }
1021
1022 if (ctor == NULL_TREE
faaf1436
RG
1023 || (TREE_CODE (ctor) != CONSTRUCTOR
1024 && TREE_CODE (ctor) != STRING_CST)
ae3df618
SB
1025 || !TREE_STATIC (ctor))
1026 return NULL_TREE;
1027
1028 /* Get the index. If we have an SSA_NAME, try to resolve it
1029 with the current lattice value for the SSA_NAME. */
1030 idx = TREE_OPERAND (t, 1);
1031 switch (TREE_CODE (idx))
1032 {
1033 case SSA_NAME:
106dec71 1034 if ((value = get_value (idx))
ae3df618
SB
1035 && value->lattice_val == CONSTANT
1036 && TREE_CODE (value->value) == INTEGER_CST)
1037 idx = value->value;
1038 else
1039 return NULL_TREE;
1040 break;
1041
1042 case INTEGER_CST:
1043 break;
1044
1045 default:
1046 return NULL_TREE;
1047 }
1048
faaf1436
RG
1049 /* Fold read from constant string. */
1050 if (TREE_CODE (ctor) == STRING_CST)
1051 {
1052 if ((TYPE_MODE (TREE_TYPE (t))
1053 == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1054 && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1055 == MODE_INT)
1056 && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1
1057 && compare_tree_int (idx, TREE_STRING_LENGTH (ctor)) < 0)
1058 return build_int_cst (TREE_TYPE (t), (TREE_STRING_POINTER (ctor)
1059 [TREE_INT_CST_LOW (idx)]));
1060 return NULL_TREE;
1061 }
1062
ae3df618 1063 /* Whoo-hoo! I'll fold ya baby. Yeah! */
4038c495
GB
1064 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1065 if (tree_int_cst_equal (cfield, idx))
1066 return cval;
ae3df618
SB
1067 break;
1068
1069 case COMPONENT_REF:
1070 /* Get a CONSTRUCTOR. If BASE is a VAR_DECL, get its
1071 DECL_INITIAL. If BASE is a nested reference into another
1072 ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1073 the inner reference. */
1074 base = TREE_OPERAND (t, 0);
1075 switch (TREE_CODE (base))
1076 {
1077 case VAR_DECL:
1078 if (!TREE_READONLY (base)
1079 || TREE_CODE (TREE_TYPE (base)) != RECORD_TYPE
1080 || !targetm.binds_local_p (base))
1081 return NULL_TREE;
1082
1083 ctor = DECL_INITIAL (base);
1084 break;
1085
1086 case ARRAY_REF:
1087 case COMPONENT_REF:
1088 ctor = fold_const_aggregate_ref (base);
1089 break;
1090
1091 default:
1092 return NULL_TREE;
1093 }
1094
1095 if (ctor == NULL_TREE
1096 || TREE_CODE (ctor) != CONSTRUCTOR
1097 || !TREE_STATIC (ctor))
1098 return NULL_TREE;
1099
1100 field = TREE_OPERAND (t, 1);
1101
4038c495
GB
1102 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1103 if (cfield == field
ae3df618 1104 /* FIXME: Handle bit-fields. */
4038c495
GB
1105 && ! DECL_BIT_FIELD (cfield))
1106 return cval;
ae3df618
SB
1107 break;
1108
1ebd8d9a
SB
1109 case REALPART_EXPR:
1110 case IMAGPART_EXPR:
1111 {
1112 tree c = fold_const_aggregate_ref (TREE_OPERAND (t, 0));
1113 if (c && TREE_CODE (c) == COMPLEX_CST)
1114 return fold_build1 (TREE_CODE (t), TREE_TYPE (t), c);
1115 break;
1116 }
1117
ae3df618
SB
1118 default:
1119 break;
1120 }
1121
1122 return NULL_TREE;
1123}
1124
6de9cd9a
DN
1125/* Evaluate statement STMT. */
1126
0bca51f0 1127static prop_value_t
6de9cd9a
DN
1128evaluate_stmt (tree stmt)
1129{
0bca51f0 1130 prop_value_t val;
faaf1436 1131 tree simplified = NULL_TREE;
0bca51f0
DN
1132 ccp_lattice_t likelyvalue = likely_value (stmt);
1133
1134 val.mem_ref = NULL_TREE;
6de9cd9a
DN
1135
1136 /* If the statement is likely to have a CONSTANT result, then try
1137 to fold the statement to determine the constant value. */
1138 if (likelyvalue == CONSTANT)
1139 simplified = ccp_fold (stmt);
1140 /* If the statement is likely to have a VARYING result, then do not
1141 bother folding the statement. */
faaf1436 1142 if (likelyvalue == VARYING)
6de9cd9a 1143 simplified = get_rhs (stmt);
ae3df618
SB
1144 /* If the statement is an ARRAY_REF or COMPONENT_REF into constant
1145 aggregates, extract the referenced constant. Otherwise the
1146 statement is likely to have an UNDEFINED value, and there will be
1147 nothing to do. Note that fold_const_aggregate_ref returns
1148 NULL_TREE if the first case does not match. */
faaf1436 1149 else if (!simplified)
ae3df618 1150 simplified = fold_const_aggregate_ref (get_rhs (stmt));
6de9cd9a
DN
1151
1152 if (simplified && is_gimple_min_invariant (simplified))
1153 {
1154 /* The statement produced a constant value. */
1155 val.lattice_val = CONSTANT;
0bca51f0 1156 val.value = simplified;
6de9cd9a
DN
1157 }
1158 else
1159 {
1160 /* The statement produced a nonconstant value. If the statement
0bca51f0
DN
1161 had UNDEFINED operands, then the result of the statement
1162 should be UNDEFINED. Otherwise, the statement is VARYING. */
106dec71 1163 if (likelyvalue == UNDEFINED)
a318e3ac
SB
1164 val.lattice_val = likelyvalue;
1165 else
1166 val.lattice_val = VARYING;
1167
0bca51f0 1168 val.value = NULL_TREE;
6de9cd9a 1169 }
750628d8
DN
1170
1171 return val;
6de9cd9a
DN
1172}
1173
1174
750628d8 1175/* Visit the assignment statement STMT. Set the value of its LHS to the
0bca51f0
DN
1176 value computed by the RHS and store LHS in *OUTPUT_P. If STMT
1177 creates virtual definitions, set the value of each new name to that
1178 of the RHS (if we can derive a constant out of the RHS). */
6de9cd9a 1179
750628d8
DN
1180static enum ssa_prop_result
1181visit_assignment (tree stmt, tree *output_p)
6de9cd9a 1182{
0bca51f0 1183 prop_value_t val;
750628d8 1184 tree lhs, rhs;
0bca51f0 1185 enum ssa_prop_result retval;
6de9cd9a 1186
07beea0d
AH
1187 lhs = GIMPLE_STMT_OPERAND (stmt, 0);
1188 rhs = GIMPLE_STMT_OPERAND (stmt, 1);
6de9cd9a 1189
750628d8
DN
1190 if (TREE_CODE (rhs) == SSA_NAME)
1191 {
1192 /* For a simple copy operation, we copy the lattice values. */
106dec71 1193 prop_value_t *nval = get_value (rhs);
750628d8
DN
1194 val = *nval;
1195 }
0bca51f0 1196 else if (do_store_ccp && stmt_makes_single_load (stmt))
750628d8 1197 {
0bca51f0 1198 /* Same as above, but the RHS is not a gimple register and yet
106dec71 1199 has a known VUSE. If STMT is loading from the same memory
0bca51f0
DN
1200 location that created the SSA_NAMEs for the virtual operands,
1201 we can propagate the value on the RHS. */
1202 prop_value_t *nval = get_value_loaded_by (stmt, const_val);
1203
106dec71
ZD
1204 if (nval
1205 && nval->mem_ref
a318e3ac 1206 && operand_equal_p (nval->mem_ref, rhs, 0))
0bca51f0
DN
1207 val = *nval;
1208 else
1209 val = evaluate_stmt (stmt);
750628d8
DN
1210 }
1211 else
9390c347 1212 /* Evaluate the statement. */
750628d8 1213 val = evaluate_stmt (stmt);
6de9cd9a 1214
9390c347 1215 /* If the original LHS was a VIEW_CONVERT_EXPR, modify the constant
ae95537a 1216 value to be a VIEW_CONVERT_EXPR of the old constant value.
9390c347
RK
1217
1218 ??? Also, if this was a definition of a bitfield, we need to widen
750628d8
DN
1219 the constant value into the type of the destination variable. This
1220 should not be necessary if GCC represented bitfields properly. */
1221 {
07beea0d 1222 tree orig_lhs = GIMPLE_STMT_OPERAND (stmt, 0);
9390c347
RK
1223
1224 if (TREE_CODE (orig_lhs) == VIEW_CONVERT_EXPR
1225 && val.lattice_val == CONSTANT)
1226 {
0dd4b47b
KH
1227 tree w = fold_unary (VIEW_CONVERT_EXPR,
1228 TREE_TYPE (TREE_OPERAND (orig_lhs, 0)),
1229 val.value);
ae95537a 1230
3d36fb45 1231 orig_lhs = TREE_OPERAND (orig_lhs, 0);
ae95537a 1232 if (w && is_gimple_min_invariant (w))
0bca51f0 1233 val.value = w;
ae95537a
RK
1234 else
1235 {
1236 val.lattice_val = VARYING;
0bca51f0 1237 val.value = NULL;
ae95537a 1238 }
9390c347
RK
1239 }
1240
750628d8 1241 if (val.lattice_val == CONSTANT
9390c347
RK
1242 && TREE_CODE (orig_lhs) == COMPONENT_REF
1243 && DECL_BIT_FIELD (TREE_OPERAND (orig_lhs, 1)))
6de9cd9a 1244 {
0bca51f0 1245 tree w = widen_bitfield (val.value, TREE_OPERAND (orig_lhs, 1),
9390c347 1246 orig_lhs);
750628d8
DN
1247
1248 if (w && is_gimple_min_invariant (w))
0bca51f0 1249 val.value = w;
750628d8 1250 else
6de9cd9a 1251 {
750628d8 1252 val.lattice_val = VARYING;
0bca51f0
DN
1253 val.value = NULL_TREE;
1254 val.mem_ref = NULL_TREE;
6de9cd9a 1255 }
6de9cd9a 1256 }
750628d8 1257 }
6de9cd9a 1258
0bca51f0 1259 retval = SSA_PROP_NOT_INTERESTING;
6de9cd9a 1260
750628d8 1261 /* Set the lattice value of the statement's output. */
0bca51f0 1262 if (TREE_CODE (lhs) == SSA_NAME)
6de9cd9a 1263 {
0bca51f0
DN
1264 /* If STMT is an assignment to an SSA_NAME, we only have one
1265 value to set. */
1266 if (set_lattice_value (lhs, val))
1267 {
1268 *output_p = lhs;
1269 if (val.lattice_val == VARYING)
1270 retval = SSA_PROP_VARYING;
1271 else
1272 retval = SSA_PROP_INTERESTING;
1273 }
6de9cd9a 1274 }
0bca51f0
DN
1275 else if (do_store_ccp && stmt_makes_single_store (stmt))
1276 {
1277 /* Otherwise, set the names in V_MAY_DEF/V_MUST_DEF operands
1278 to the new constant value and mark the LHS as the memory
1279 reference associated with VAL. */
1280 ssa_op_iter i;
1281 tree vdef;
1282 bool changed;
1283
0bca51f0 1284 /* Mark VAL as stored in the LHS of this assignment. */
106dec71
ZD
1285 if (val.lattice_val == CONSTANT)
1286 val.mem_ref = lhs;
0bca51f0
DN
1287
1288 /* Set the value of every VDEF to VAL. */
1289 changed = false;
1290 FOR_EACH_SSA_TREE_OPERAND (vdef, stmt, i, SSA_OP_VIRTUAL_DEFS)
fc9962ee
ZD
1291 {
1292 /* See PR 29801. We may have VDEFs for read-only variables
1293 (see the handling of unmodifiable variables in
1294 add_virtual_operand); do not attempt to change their value. */
1295 if (get_symbol_constant_value (SSA_NAME_VAR (vdef)) != NULL_TREE)
1296 continue;
1297
1298 changed |= set_lattice_value (vdef, val);
1299 }
0bca51f0
DN
1300
1301 /* Note that for propagation purposes, we are only interested in
1302 visiting statements that load the exact same memory reference
1303 stored here. Those statements will have the exact same list
1304 of virtual uses, so it is enough to set the output of this
1305 statement to be its first virtual definition. */
1306 *output_p = first_vdef (stmt);
1307 if (changed)
1308 {
1309 if (val.lattice_val == VARYING)
1310 retval = SSA_PROP_VARYING;
1311 else
1312 retval = SSA_PROP_INTERESTING;
1313 }
1314 }
1315
1316 return retval;
6de9cd9a
DN
1317}
1318
6de9cd9a 1319
750628d8
DN
1320/* Visit the conditional statement STMT. Return SSA_PROP_INTERESTING
1321 if it can determine which edge will be taken. Otherwise, return
1322 SSA_PROP_VARYING. */
1323
1324static enum ssa_prop_result
1325visit_cond_stmt (tree stmt, edge *taken_edge_p)
6de9cd9a 1326{
0bca51f0 1327 prop_value_t val;
750628d8
DN
1328 basic_block block;
1329
1330 block = bb_for_stmt (stmt);
1331 val = evaluate_stmt (stmt);
1332
1333 /* Find which edge out of the conditional block will be taken and add it
1334 to the worklist. If no single edge can be determined statically,
1335 return SSA_PROP_VARYING to feed all the outgoing edges to the
1336 propagation engine. */
0bca51f0 1337 *taken_edge_p = val.value ? find_taken_edge (block, val.value) : 0;
750628d8
DN
1338 if (*taken_edge_p)
1339 return SSA_PROP_INTERESTING;
1340 else
1341 return SSA_PROP_VARYING;
6de9cd9a
DN
1342}
1343
6de9cd9a 1344
750628d8
DN
1345/* Evaluate statement STMT. If the statement produces an output value and
1346 its evaluation changes the lattice value of its output, return
1347 SSA_PROP_INTERESTING and set *OUTPUT_P to the SSA_NAME holding the
1348 output value.
1349
1350 If STMT is a conditional branch and we can determine its truth
1351 value, set *TAKEN_EDGE_P accordingly. If STMT produces a varying
1352 value, return SSA_PROP_VARYING. */
6de9cd9a 1353
750628d8
DN
1354static enum ssa_prop_result
1355ccp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
1356{
750628d8
DN
1357 tree def;
1358 ssa_op_iter iter;
6de9cd9a 1359
750628d8 1360 if (dump_file && (dump_flags & TDF_DETAILS))
6de9cd9a 1361 {
0bca51f0
DN
1362 fprintf (dump_file, "\nVisiting statement:\n");
1363 print_generic_stmt (dump_file, stmt, dump_flags);
750628d8 1364 fprintf (dump_file, "\n");
6de9cd9a 1365 }
6de9cd9a 1366
07beea0d 1367 if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
6de9cd9a 1368 {
750628d8
DN
1369 /* If the statement is an assignment that produces a single
1370 output value, evaluate its RHS to see if the lattice value of
1371 its output has changed. */
1372 return visit_assignment (stmt, output_p);
6de9cd9a 1373 }
750628d8 1374 else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
6de9cd9a 1375 {
750628d8
DN
1376 /* If STMT is a conditional branch, see if we can determine
1377 which branch will be taken. */
1378 return visit_cond_stmt (stmt, taken_edge_p);
6de9cd9a 1379 }
6de9cd9a 1380
750628d8
DN
1381 /* Any other kind of statement is not interesting for constant
1382 propagation and, therefore, not worth simulating. */
750628d8
DN
1383 if (dump_file && (dump_flags & TDF_DETAILS))
1384 fprintf (dump_file, "No interesting values produced. Marked VARYING.\n");
6de9cd9a 1385
750628d8
DN
1386 /* Definitions made by statements other than assignments to
1387 SSA_NAMEs represent unknown modifications to their outputs.
1388 Mark them VARYING. */
0bca51f0
DN
1389 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
1390 {
1391 prop_value_t v = { VARYING, NULL_TREE, NULL_TREE };
1392 set_lattice_value (def, v);
1393 }
6de9cd9a 1394
750628d8
DN
1395 return SSA_PROP_VARYING;
1396}
6de9cd9a 1397
6de9cd9a 1398
0bca51f0 1399/* Main entry point for SSA Conditional Constant Propagation. */
750628d8
DN
1400
1401static void
0bca51f0 1402execute_ssa_ccp (bool store_ccp)
750628d8 1403{
0bca51f0 1404 do_store_ccp = store_ccp;
750628d8
DN
1405 ccp_initialize ();
1406 ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node);
1407 ccp_finalize ();
6de9cd9a
DN
1408}
1409
173b818d 1410
c2924966 1411static unsigned int
0bca51f0
DN
1412do_ssa_ccp (void)
1413{
1414 execute_ssa_ccp (false);
c2924966 1415 return 0;
0bca51f0
DN
1416}
1417
1418
173b818d 1419static bool
750628d8 1420gate_ccp (void)
173b818d 1421{
750628d8 1422 return flag_tree_ccp != 0;
173b818d
BB
1423}
1424
6de9cd9a 1425
750628d8
DN
1426struct tree_opt_pass pass_ccp =
1427{
1428 "ccp", /* name */
1429 gate_ccp, /* gate */
0bca51f0 1430 do_ssa_ccp, /* execute */
750628d8
DN
1431 NULL, /* sub */
1432 NULL, /* next */
1433 0, /* static_pass_number */
1434 TV_TREE_CCP, /* tv_id */
1435 PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
1436 0, /* properties_provided */
ae07b463 1437 0, /* properties_destroyed */
750628d8 1438 0, /* todo_flags_start */
cfaab3a9
DN
1439 TODO_cleanup_cfg
1440 | TODO_dump_func
1441 | TODO_update_ssa
1442 | TODO_ggc_collect
1443 | TODO_verify_ssa
1444 | TODO_verify_stmts
1445 | TODO_update_smt_usage, /* todo_flags_finish */
9f8628ba 1446 0 /* letter */
750628d8 1447};
6de9cd9a 1448
6de9cd9a 1449
c2924966 1450static unsigned int
0bca51f0
DN
1451do_ssa_store_ccp (void)
1452{
1453 /* If STORE-CCP is not enabled, we just run regular CCP. */
1454 execute_ssa_ccp (flag_tree_store_ccp != 0);
c2924966 1455 return 0;
0bca51f0
DN
1456}
1457
1458static bool
1459gate_store_ccp (void)
1460{
1461 /* STORE-CCP is enabled only with -ftree-store-ccp, but when
1462 -fno-tree-store-ccp is specified, we should run regular CCP.
1463 That's why the pass is enabled with either flag. */
1464 return flag_tree_store_ccp != 0 || flag_tree_ccp != 0;
1465}
1466
1467
1468struct tree_opt_pass pass_store_ccp =
1469{
1470 "store_ccp", /* name */
1471 gate_store_ccp, /* gate */
1472 do_ssa_store_ccp, /* execute */
1473 NULL, /* sub */
1474 NULL, /* next */
1475 0, /* static_pass_number */
1476 TV_TREE_STORE_CCP, /* tv_id */
1477 PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
1478 0, /* properties_provided */
ae07b463 1479 0, /* properties_destroyed */
0bca51f0 1480 0, /* todo_flags_start */
cfaab3a9
DN
1481 TODO_dump_func
1482 | TODO_update_ssa
1483 | TODO_ggc_collect
1484 | TODO_verify_ssa
0bca51f0 1485 | TODO_cleanup_cfg
cfaab3a9
DN
1486 | TODO_verify_stmts
1487 | TODO_update_smt_usage, /* todo_flags_finish */
0bca51f0
DN
1488 0 /* letter */
1489};
1490
750628d8
DN
1491/* Given a constant value VAL for bitfield FIELD, and a destination
1492 variable VAR, return VAL appropriately widened to fit into VAR. If
1493 FIELD is wider than HOST_WIDE_INT, NULL is returned. */
6de9cd9a 1494
750628d8
DN
1495tree
1496widen_bitfield (tree val, tree field, tree var)
6de9cd9a 1497{
750628d8
DN
1498 unsigned HOST_WIDE_INT var_size, field_size;
1499 tree wide_val;
1500 unsigned HOST_WIDE_INT mask;
1501 unsigned int i;
6de9cd9a 1502
750628d8
DN
1503 /* We can only do this if the size of the type and field and VAL are
1504 all constants representable in HOST_WIDE_INT. */
1505 if (!host_integerp (TYPE_SIZE (TREE_TYPE (var)), 1)
1506 || !host_integerp (DECL_SIZE (field), 1)
1507 || !host_integerp (val, 0))
1508 return NULL_TREE;
6de9cd9a 1509
750628d8
DN
1510 var_size = tree_low_cst (TYPE_SIZE (TREE_TYPE (var)), 1);
1511 field_size = tree_low_cst (DECL_SIZE (field), 1);
6de9cd9a 1512
750628d8
DN
1513 /* Give up if either the bitfield or the variable are too wide. */
1514 if (field_size > HOST_BITS_PER_WIDE_INT || var_size > HOST_BITS_PER_WIDE_INT)
1515 return NULL_TREE;
6de9cd9a 1516
1e128c5f 1517 gcc_assert (var_size >= field_size);
6de9cd9a 1518
750628d8
DN
1519 /* If the sign bit of the value is not set or the field's type is unsigned,
1520 just mask off the high order bits of the value. */
1521 if (DECL_UNSIGNED (field)
1522 || !(tree_low_cst (val, 0) & (((HOST_WIDE_INT)1) << (field_size - 1))))
1523 {
1524 /* Zero extension. Build a mask with the lower 'field_size' bits
1525 set and a BIT_AND_EXPR node to clear the high order bits of
1526 the value. */
1527 for (i = 0, mask = 0; i < field_size; i++)
1528 mask |= ((HOST_WIDE_INT) 1) << i;
6de9cd9a 1529
f457cf40
JM
1530 wide_val = fold_build2 (BIT_AND_EXPR, TREE_TYPE (var), val,
1531 build_int_cst (TREE_TYPE (var), mask));
6de9cd9a 1532 }
750628d8 1533 else
173b818d 1534 {
750628d8
DN
1535 /* Sign extension. Create a mask with the upper 'field_size'
1536 bits set and a BIT_IOR_EXPR to set the high order bits of the
1537 value. */
1538 for (i = 0, mask = 0; i < (var_size - field_size); i++)
1539 mask |= ((HOST_WIDE_INT) 1) << (var_size - i - 1);
1540
f457cf40
JM
1541 wide_val = fold_build2 (BIT_IOR_EXPR, TREE_TYPE (var), val,
1542 build_int_cst (TREE_TYPE (var), mask));
173b818d 1543 }
6de9cd9a 1544
f457cf40 1545 return wide_val;
6de9cd9a
DN
1546}
1547
750628d8 1548
6de9cd9a
DN
1549/* A subroutine of fold_stmt_r. Attempts to fold *(A+O) to A[X].
1550 BASE is an array type. OFFSET is a byte displacement. ORIG_TYPE
9cf737f8 1551 is the desired result type. */
6de9cd9a
DN
1552
1553static tree
1554maybe_fold_offset_to_array_ref (tree base, tree offset, tree orig_type)
1555{
44de5aeb
RK
1556 tree min_idx, idx, elt_offset = integer_zero_node;
1557 tree array_type, elt_type, elt_size;
1558
1559 /* If BASE is an ARRAY_REF, we can pick up another offset (this time
1560 measured in units of the size of elements type) from that ARRAY_REF).
1561 We can't do anything if either is variable.
1562
1563 The case we handle here is *(&A[N]+O). */
1564 if (TREE_CODE (base) == ARRAY_REF)
1565 {
1566 tree low_bound = array_ref_low_bound (base);
1567
1568 elt_offset = TREE_OPERAND (base, 1);
1569 if (TREE_CODE (low_bound) != INTEGER_CST
1570 || TREE_CODE (elt_offset) != INTEGER_CST)
1571 return NULL_TREE;
1572
1573 elt_offset = int_const_binop (MINUS_EXPR, elt_offset, low_bound, 0);
1574 base = TREE_OPERAND (base, 0);
1575 }
6de9cd9a
DN
1576
1577 /* Ignore stupid user tricks of indexing non-array variables. */
1578 array_type = TREE_TYPE (base);
1579 if (TREE_CODE (array_type) != ARRAY_TYPE)
1580 return NULL_TREE;
1581 elt_type = TREE_TYPE (array_type);
1582 if (!lang_hooks.types_compatible_p (orig_type, elt_type))
1583 return NULL_TREE;
1584
44de5aeb
RK
1585 /* If OFFSET and ELT_OFFSET are zero, we don't care about the size of the
1586 element type (so we can use the alignment if it's not constant).
1587 Otherwise, compute the offset as an index by using a division. If the
1588 division isn't exact, then don't do anything. */
6de9cd9a 1589 elt_size = TYPE_SIZE_UNIT (elt_type);
44de5aeb
RK
1590 if (integer_zerop (offset))
1591 {
1592 if (TREE_CODE (elt_size) != INTEGER_CST)
1593 elt_size = size_int (TYPE_ALIGN (elt_type));
6de9cd9a 1594
44de5aeb
RK
1595 idx = integer_zero_node;
1596 }
1597 else
1598 {
1599 unsigned HOST_WIDE_INT lquo, lrem;
1600 HOST_WIDE_INT hquo, hrem;
1601
1602 if (TREE_CODE (elt_size) != INTEGER_CST
1603 || div_and_round_double (TRUNC_DIV_EXPR, 1,
1604 TREE_INT_CST_LOW (offset),
1605 TREE_INT_CST_HIGH (offset),
1606 TREE_INT_CST_LOW (elt_size),
1607 TREE_INT_CST_HIGH (elt_size),
1608 &lquo, &hquo, &lrem, &hrem)
1609 || lrem || hrem)
1610 return NULL_TREE;
6de9cd9a 1611
7d60be94 1612 idx = build_int_cst_wide (NULL_TREE, lquo, hquo);
44de5aeb
RK
1613 }
1614
1615 /* Assume the low bound is zero. If there is a domain type, get the
1616 low bound, if any, convert the index into that type, and add the
1617 low bound. */
1618 min_idx = integer_zero_node;
1619 if (TYPE_DOMAIN (array_type))
6de9cd9a 1620 {
44de5aeb
RK
1621 if (TYPE_MIN_VALUE (TYPE_DOMAIN (array_type)))
1622 min_idx = TYPE_MIN_VALUE (TYPE_DOMAIN (array_type));
1623 else
1624 min_idx = fold_convert (TYPE_DOMAIN (array_type), min_idx);
1625
1626 if (TREE_CODE (min_idx) != INTEGER_CST)
1627 return NULL_TREE;
1628
1629 idx = fold_convert (TYPE_DOMAIN (array_type), idx);
1630 elt_offset = fold_convert (TYPE_DOMAIN (array_type), elt_offset);
6de9cd9a
DN
1631 }
1632
44de5aeb
RK
1633 if (!integer_zerop (min_idx))
1634 idx = int_const_binop (PLUS_EXPR, idx, min_idx, 0);
1635 if (!integer_zerop (elt_offset))
1636 idx = int_const_binop (PLUS_EXPR, idx, elt_offset, 0);
1637
b4257cfc
RG
1638 return build4 (ARRAY_REF, orig_type, base, idx, min_idx,
1639 size_int (tree_low_cst (elt_size, 1)
1640 / (TYPE_ALIGN_UNIT (elt_type))));
6de9cd9a
DN
1641}
1642
750628d8 1643
6de9cd9a
DN
1644/* A subroutine of fold_stmt_r. Attempts to fold *(S+O) to S.X.
1645 BASE is a record type. OFFSET is a byte displacement. ORIG_TYPE
1646 is the desired result type. */
1647/* ??? This doesn't handle class inheritance. */
1648
1649static tree
1650maybe_fold_offset_to_component_ref (tree record_type, tree base, tree offset,
1651 tree orig_type, bool base_is_ptr)
1652{
f34fa464 1653 tree f, t, field_type, tail_array_field, field_offset;
6de9cd9a
DN
1654
1655 if (TREE_CODE (record_type) != RECORD_TYPE
1656 && TREE_CODE (record_type) != UNION_TYPE
1657 && TREE_CODE (record_type) != QUAL_UNION_TYPE)
1658 return NULL_TREE;
1659
1660 /* Short-circuit silly cases. */
1661 if (lang_hooks.types_compatible_p (record_type, orig_type))
1662 return NULL_TREE;
1663
1664 tail_array_field = NULL_TREE;
1665 for (f = TYPE_FIELDS (record_type); f ; f = TREE_CHAIN (f))
1666 {
1667 int cmp;
1668
1669 if (TREE_CODE (f) != FIELD_DECL)
1670 continue;
1671 if (DECL_BIT_FIELD (f))
1672 continue;
f34fa464
ZD
1673
1674 field_offset = byte_position (f);
1675 if (TREE_CODE (field_offset) != INTEGER_CST)
6de9cd9a
DN
1676 continue;
1677
1678 /* ??? Java creates "interesting" fields for representing base classes.
1679 They have no name, and have no context. With no context, we get into
1680 trouble with nonoverlapping_component_refs_p. Skip them. */
1681 if (!DECL_FIELD_CONTEXT (f))
1682 continue;
1683
1684 /* The previous array field isn't at the end. */
1685 tail_array_field = NULL_TREE;
1686
1687 /* Check to see if this offset overlaps with the field. */
f34fa464 1688 cmp = tree_int_cst_compare (field_offset, offset);
6de9cd9a
DN
1689 if (cmp > 0)
1690 continue;
1691
1692 field_type = TREE_TYPE (f);
6de9cd9a
DN
1693
1694 /* Here we exactly match the offset being checked. If the types match,
1695 then we can return that field. */
53dba802
ZD
1696 if (cmp == 0
1697 && lang_hooks.types_compatible_p (orig_type, field_type))
6de9cd9a
DN
1698 {
1699 if (base_is_ptr)
1700 base = build1 (INDIRECT_REF, record_type, base);
b4257cfc 1701 t = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE);
6de9cd9a
DN
1702 return t;
1703 }
53dba802
ZD
1704
1705 /* Don't care about offsets into the middle of scalars. */
1706 if (!AGGREGATE_TYPE_P (field_type))
1707 continue;
6de9cd9a 1708
53dba802
ZD
1709 /* Check for array at the end of the struct. This is often
1710 used as for flexible array members. We should be able to
1711 turn this into an array access anyway. */
1712 if (TREE_CODE (field_type) == ARRAY_TYPE)
1713 tail_array_field = f;
1714
1715 /* Check the end of the field against the offset. */
1716 if (!DECL_SIZE_UNIT (f)
1717 || TREE_CODE (DECL_SIZE_UNIT (f)) != INTEGER_CST)
1718 continue;
1719 t = int_const_binop (MINUS_EXPR, offset, field_offset, 1);
1720 if (!tree_int_cst_lt (t, DECL_SIZE_UNIT (f)))
1721 continue;
6de9cd9a 1722
53dba802
ZD
1723 /* If we matched, then set offset to the displacement into
1724 this field. */
1725 offset = t;
6de9cd9a
DN
1726 goto found;
1727 }
1728
1729 if (!tail_array_field)
1730 return NULL_TREE;
1731
1732 f = tail_array_field;
1733 field_type = TREE_TYPE (f);
53dba802 1734 offset = int_const_binop (MINUS_EXPR, offset, byte_position (f), 1);
6de9cd9a
DN
1735
1736 found:
1737 /* If we get here, we've got an aggregate field, and a possibly
1ea7e6ad 1738 nonzero offset into them. Recurse and hope for a valid match. */
6de9cd9a
DN
1739 if (base_is_ptr)
1740 base = build1 (INDIRECT_REF, record_type, base);
b4257cfc 1741 base = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE);
6de9cd9a
DN
1742
1743 t = maybe_fold_offset_to_array_ref (base, offset, orig_type);
1744 if (t)
1745 return t;
1746 return maybe_fold_offset_to_component_ref (field_type, base, offset,
1747 orig_type, false);
1748}
1749
750628d8 1750
6de9cd9a
DN
1751/* A subroutine of fold_stmt_r. Attempt to simplify *(BASE+OFFSET).
1752 Return the simplified expression, or NULL if nothing could be done. */
1753
1754static tree
1755maybe_fold_stmt_indirect (tree expr, tree base, tree offset)
1756{
1757 tree t;
1758
1759 /* We may well have constructed a double-nested PLUS_EXPR via multiple
1760 substitutions. Fold that down to one. Remove NON_LVALUE_EXPRs that
1761 are sometimes added. */
1762 base = fold (base);
ff7c8597 1763 STRIP_TYPE_NOPS (base);
6de9cd9a
DN
1764 TREE_OPERAND (expr, 0) = base;
1765
1766 /* One possibility is that the address reduces to a string constant. */
1767 t = fold_read_from_constant_string (expr);
1768 if (t)
1769 return t;
1770
1771 /* Add in any offset from a PLUS_EXPR. */
1772 if (TREE_CODE (base) == PLUS_EXPR)
1773 {
1774 tree offset2;
1775
1776 offset2 = TREE_OPERAND (base, 1);
1777 if (TREE_CODE (offset2) != INTEGER_CST)
1778 return NULL_TREE;
1779 base = TREE_OPERAND (base, 0);
1780
1781 offset = int_const_binop (PLUS_EXPR, offset, offset2, 1);
1782 }
1783
1784 if (TREE_CODE (base) == ADDR_EXPR)
1785 {
1786 /* Strip the ADDR_EXPR. */
1787 base = TREE_OPERAND (base, 0);
1788
0534fa56
RH
1789 /* Fold away CONST_DECL to its value, if the type is scalar. */
1790 if (TREE_CODE (base) == CONST_DECL
688e936d 1791 && ccp_decl_initial_min_invariant (DECL_INITIAL (base)))
0534fa56
RH
1792 return DECL_INITIAL (base);
1793
6de9cd9a
DN
1794 /* Try folding *(&B+O) to B[X]. */
1795 t = maybe_fold_offset_to_array_ref (base, offset, TREE_TYPE (expr));
1796 if (t)
1797 return t;
1798
1799 /* Try folding *(&B+O) to B.X. */
1800 t = maybe_fold_offset_to_component_ref (TREE_TYPE (base), base, offset,
1801 TREE_TYPE (expr), false);
1802 if (t)
1803 return t;
1804
44de5aeb
RK
1805 /* Fold *&B to B. We can only do this if EXPR is the same type
1806 as BASE. We can't do this if EXPR is the element type of an array
1807 and BASE is the array. */
1808 if (integer_zerop (offset)
1809 && lang_hooks.types_compatible_p (TREE_TYPE (base),
1810 TREE_TYPE (expr)))
6de9cd9a
DN
1811 return base;
1812 }
1813 else
1814 {
1815 /* We can get here for out-of-range string constant accesses,
1816 such as "_"[3]. Bail out of the entire substitution search
1817 and arrange for the entire statement to be replaced by a
aabcd309 1818 call to __builtin_trap. In all likelihood this will all be
6de9cd9a
DN
1819 constant-folded away, but in the meantime we can't leave with
1820 something that get_expr_operands can't understand. */
1821
1822 t = base;
1823 STRIP_NOPS (t);
1824 if (TREE_CODE (t) == ADDR_EXPR
1825 && TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST)
1826 {
1827 /* FIXME: Except that this causes problems elsewhere with dead
0e61db61 1828 code not being deleted, and we die in the rtl expanders
6de9cd9a
DN
1829 because we failed to remove some ssa_name. In the meantime,
1830 just return zero. */
1831 /* FIXME2: This condition should be signaled by
1832 fold_read_from_constant_string directly, rather than
1833 re-checking for it here. */
1834 return integer_zero_node;
1835 }
1836
1837 /* Try folding *(B+O) to B->X. Still an improvement. */
1838 if (POINTER_TYPE_P (TREE_TYPE (base)))
1839 {
1840 t = maybe_fold_offset_to_component_ref (TREE_TYPE (TREE_TYPE (base)),
1841 base, offset,
1842 TREE_TYPE (expr), true);
1843 if (t)
1844 return t;
1845 }
1846 }
1847
1848 /* Otherwise we had an offset that we could not simplify. */
1849 return NULL_TREE;
1850}
1851
750628d8 1852
6de9cd9a
DN
1853/* A subroutine of fold_stmt_r. EXPR is a PLUS_EXPR.
1854
1855 A quaint feature extant in our address arithmetic is that there
1856 can be hidden type changes here. The type of the result need
1857 not be the same as the type of the input pointer.
1858
1859 What we're after here is an expression of the form
1860 (T *)(&array + const)
1861 where the cast doesn't actually exist, but is implicit in the
1862 type of the PLUS_EXPR. We'd like to turn this into
1863 &array[x]
1864 which may be able to propagate further. */
1865
1866static tree
1867maybe_fold_stmt_addition (tree expr)
1868{
1869 tree op0 = TREE_OPERAND (expr, 0);
1870 tree op1 = TREE_OPERAND (expr, 1);
1871 tree ptr_type = TREE_TYPE (expr);
1872 tree ptd_type;
1873 tree t;
1874 bool subtract = (TREE_CODE (expr) == MINUS_EXPR);
1875
1876 /* We're only interested in pointer arithmetic. */
1877 if (!POINTER_TYPE_P (ptr_type))
1878 return NULL_TREE;
1879 /* Canonicalize the integral operand to op1. */
1880 if (INTEGRAL_TYPE_P (TREE_TYPE (op0)))
1881 {
1882 if (subtract)
1883 return NULL_TREE;
1884 t = op0, op0 = op1, op1 = t;
1885 }
1886 /* It had better be a constant. */
1887 if (TREE_CODE (op1) != INTEGER_CST)
1888 return NULL_TREE;
1889 /* The first operand should be an ADDR_EXPR. */
1890 if (TREE_CODE (op0) != ADDR_EXPR)
1891 return NULL_TREE;
1892 op0 = TREE_OPERAND (op0, 0);
1893
1894 /* If the first operand is an ARRAY_REF, expand it so that we can fold
1895 the offset into it. */
1896 while (TREE_CODE (op0) == ARRAY_REF)
1897 {
1898 tree array_obj = TREE_OPERAND (op0, 0);
1899 tree array_idx = TREE_OPERAND (op0, 1);
1900 tree elt_type = TREE_TYPE (op0);
1901 tree elt_size = TYPE_SIZE_UNIT (elt_type);
1902 tree min_idx;
1903
1904 if (TREE_CODE (array_idx) != INTEGER_CST)
1905 break;
1906 if (TREE_CODE (elt_size) != INTEGER_CST)
1907 break;
1908
1909 /* Un-bias the index by the min index of the array type. */
1910 min_idx = TYPE_DOMAIN (TREE_TYPE (array_obj));
1911 if (min_idx)
1912 {
1913 min_idx = TYPE_MIN_VALUE (min_idx);
1914 if (min_idx)
1915 {
44de5aeb
RK
1916 if (TREE_CODE (min_idx) != INTEGER_CST)
1917 break;
1918
b6f65e3c 1919 array_idx = fold_convert (TREE_TYPE (min_idx), array_idx);
6de9cd9a
DN
1920 if (!integer_zerop (min_idx))
1921 array_idx = int_const_binop (MINUS_EXPR, array_idx,
1922 min_idx, 0);
1923 }
1924 }
1925
1926 /* Convert the index to a byte offset. */
b6f65e3c 1927 array_idx = fold_convert (sizetype, array_idx);
6de9cd9a
DN
1928 array_idx = int_const_binop (MULT_EXPR, array_idx, elt_size, 0);
1929
1930 /* Update the operands for the next round, or for folding. */
1931 /* If we're manipulating unsigned types, then folding into negative
1932 values can produce incorrect results. Particularly if the type
1933 is smaller than the width of the pointer. */
1934 if (subtract
1935 && TYPE_UNSIGNED (TREE_TYPE (op1))
1936 && tree_int_cst_lt (array_idx, op1))
1937 return NULL;
1938 op1 = int_const_binop (subtract ? MINUS_EXPR : PLUS_EXPR,
1939 array_idx, op1, 0);
1940 subtract = false;
1941 op0 = array_obj;
1942 }
1943
1944 /* If we weren't able to fold the subtraction into another array reference,
1945 canonicalize the integer for passing to the array and component ref
1946 simplification functions. */
1947 if (subtract)
1948 {
1949 if (TYPE_UNSIGNED (TREE_TYPE (op1)))
1950 return NULL;
0dd4b47b 1951 op1 = fold_unary (NEGATE_EXPR, TREE_TYPE (op1), op1);
6de9cd9a 1952 /* ??? In theory fold should always produce another integer. */
0dd4b47b 1953 if (op1 == NULL || TREE_CODE (op1) != INTEGER_CST)
6de9cd9a
DN
1954 return NULL;
1955 }
1956
1957 ptd_type = TREE_TYPE (ptr_type);
1958
1959 /* At which point we can try some of the same things as for indirects. */
1960 t = maybe_fold_offset_to_array_ref (op0, op1, ptd_type);
1961 if (!t)
1962 t = maybe_fold_offset_to_component_ref (TREE_TYPE (op0), op0, op1,
1963 ptd_type, false);
1964 if (t)
1965 t = build1 (ADDR_EXPR, ptr_type, t);
1966
1967 return t;
1968}
1969
622f91ba
JL
1970/* For passing state through walk_tree into fold_stmt_r and its
1971 children. */
1972
1973struct fold_stmt_r_data
1974{
1975 bool *changed_p;
1976 bool *inside_addr_expr_p;
1977};
1978
6de9cd9a
DN
1979/* Subroutine of fold_stmt called via walk_tree. We perform several
1980 simplifications of EXPR_P, mostly having to do with pointer arithmetic. */
1981
1982static tree
1983fold_stmt_r (tree *expr_p, int *walk_subtrees, void *data)
1984{
858904db 1985 struct fold_stmt_r_data *fold_stmt_r_data = (struct fold_stmt_r_data *) data;
622f91ba
JL
1986 bool *inside_addr_expr_p = fold_stmt_r_data->inside_addr_expr_p;
1987 bool *changed_p = fold_stmt_r_data->changed_p;
6de9cd9a
DN
1988 tree expr = *expr_p, t;
1989
1990 /* ??? It'd be nice if walk_tree had a pre-order option. */
1991 switch (TREE_CODE (expr))
1992 {
1993 case INDIRECT_REF:
1994 t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
1995 if (t)
1996 return t;
1997 *walk_subtrees = 0;
1998
1999 t = maybe_fold_stmt_indirect (expr, TREE_OPERAND (expr, 0),
2000 integer_zero_node);
2001 break;
2002
622f91ba 2003 /* ??? Could handle more ARRAY_REFs here, as a variant of INDIRECT_REF.
6de9cd9a
DN
2004 We'd only want to bother decomposing an existing ARRAY_REF if
2005 the base array is found to have another offset contained within.
2006 Otherwise we'd be wasting time. */
622f91ba
JL
2007 case ARRAY_REF:
2008 /* If we are not processing expressions found within an
2009 ADDR_EXPR, then we can fold constant array references. */
2010 if (!*inside_addr_expr_p)
2011 t = fold_read_from_constant_string (expr);
2012 else
2013 t = NULL;
2014 break;
6de9cd9a
DN
2015
2016 case ADDR_EXPR:
622f91ba 2017 *inside_addr_expr_p = true;
6de9cd9a 2018 t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
622f91ba 2019 *inside_addr_expr_p = false;
6de9cd9a
DN
2020 if (t)
2021 return t;
2022 *walk_subtrees = 0;
2023
2024 /* Set TREE_INVARIANT properly so that the value is properly
2025 considered constant, and so gets propagated as expected. */
2026 if (*changed_p)
127203ac 2027 recompute_tree_invariant_for_addr_expr (expr);
6de9cd9a
DN
2028 return NULL_TREE;
2029
2030 case PLUS_EXPR:
2031 case MINUS_EXPR:
2032 t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
2033 if (t)
2034 return t;
2035 t = walk_tree (&TREE_OPERAND (expr, 1), fold_stmt_r, data, NULL);
2036 if (t)
2037 return t;
2038 *walk_subtrees = 0;
2039
2040 t = maybe_fold_stmt_addition (expr);
2041 break;
2042
2043 case COMPONENT_REF:
2044 t = walk_tree (&TREE_OPERAND (expr, 0), fold_stmt_r, data, NULL);
2045 if (t)
2046 return t;
2047 *walk_subtrees = 0;
2048
fa27426e
RH
2049 /* Make sure the FIELD_DECL is actually a field in the type on the lhs.
2050 We've already checked that the records are compatible, so we should
2051 come up with a set of compatible fields. */
2052 {
2053 tree expr_record = TREE_TYPE (TREE_OPERAND (expr, 0));
2054 tree expr_field = TREE_OPERAND (expr, 1);
2055
2056 if (DECL_FIELD_CONTEXT (expr_field) != TYPE_MAIN_VARIANT (expr_record))
2057 {
2058 expr_field = find_compatible_field (expr_record, expr_field);
2059 TREE_OPERAND (expr, 1) = expr_field;
2060 }
2061 }
6de9cd9a
DN
2062 break;
2063
ac182688
ZD
2064 case TARGET_MEM_REF:
2065 t = maybe_fold_tmr (expr);
2066 break;
2067
f393e7f5
RG
2068 case COND_EXPR:
2069 if (COMPARISON_CLASS_P (TREE_OPERAND (expr, 0)))
2070 {
2071 tree op0 = TREE_OPERAND (expr, 0);
2072 tree tem = fold_binary (TREE_CODE (op0), TREE_TYPE (op0),
5cdc4a26
RS
2073 TREE_OPERAND (op0, 0),
2074 TREE_OPERAND (op0, 1));
2075 if (tem && set_rhs (expr_p, tem))
2076 {
2077 t = *expr_p;
2078 break;
2079 }
f393e7f5 2080 }
5cdc4a26 2081 return NULL_TREE;
f393e7f5 2082
6de9cd9a
DN
2083 default:
2084 return NULL_TREE;
2085 }
2086
2087 if (t)
2088 {
2089 *expr_p = t;
2090 *changed_p = true;
2091 }
2092
2093 return NULL_TREE;
2094}
2095
6de9cd9a 2096
10a0d495
JJ
2097/* Return the string length, maximum string length or maximum value of
2098 ARG in LENGTH.
2099 If ARG is an SSA name variable, follow its use-def chains. If LENGTH
2100 is not NULL and, for TYPE == 0, its value is not equal to the length
2101 we determine or if we are unable to determine the length or value,
2102 return false. VISITED is a bitmap of visited variables.
2103 TYPE is 0 if string length should be returned, 1 for maximum string
2104 length and 2 for maximum value ARG can have. */
6de9cd9a 2105
06a9b53f 2106static bool
10a0d495 2107get_maxval_strlen (tree arg, tree *length, bitmap visited, int type)
6de9cd9a 2108{
750628d8
DN
2109 tree var, def_stmt, val;
2110
2111 if (TREE_CODE (arg) != SSA_NAME)
06a9b53f 2112 {
10a0d495
JJ
2113 if (type == 2)
2114 {
2115 val = arg;
2116 if (TREE_CODE (val) != INTEGER_CST
2117 || tree_int_cst_sgn (val) < 0)
2118 return false;
2119 }
2120 else
2121 val = c_strlen (arg, 1);
750628d8 2122 if (!val)
06a9b53f 2123 return false;
cd709752 2124
10a0d495
JJ
2125 if (*length)
2126 {
2127 if (type > 0)
2128 {
2129 if (TREE_CODE (*length) != INTEGER_CST
2130 || TREE_CODE (val) != INTEGER_CST)
2131 return false;
2132
2133 if (tree_int_cst_lt (*length, val))
2134 *length = val;
2135 return true;
2136 }
2137 else if (simple_cst_equal (val, *length) != 1)
2138 return false;
2139 }
6de9cd9a 2140
750628d8
DN
2141 *length = val;
2142 return true;
6de9cd9a 2143 }
06a9b53f 2144
750628d8
DN
2145 /* If we were already here, break the infinite cycle. */
2146 if (bitmap_bit_p (visited, SSA_NAME_VERSION (arg)))
2147 return true;
2148 bitmap_set_bit (visited, SSA_NAME_VERSION (arg));
2149
2150 var = arg;
2151 def_stmt = SSA_NAME_DEF_STMT (var);
6de9cd9a 2152
750628d8
DN
2153 switch (TREE_CODE (def_stmt))
2154 {
07beea0d 2155 case GIMPLE_MODIFY_STMT:
750628d8 2156 {
10a0d495
JJ
2157 tree rhs;
2158
750628d8
DN
2159 /* The RHS of the statement defining VAR must either have a
2160 constant length or come from another SSA_NAME with a constant
2161 length. */
07beea0d 2162 rhs = GIMPLE_STMT_OPERAND (def_stmt, 1);
750628d8 2163 STRIP_NOPS (rhs);
10a0d495 2164 return get_maxval_strlen (rhs, length, visited, type);
750628d8 2165 }
6de9cd9a 2166
750628d8
DN
2167 case PHI_NODE:
2168 {
2169 /* All the arguments of the PHI node must have the same constant
2170 length. */
2171 int i;
6de9cd9a 2172
750628d8
DN
2173 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
2174 {
2175 tree arg = PHI_ARG_DEF (def_stmt, i);
6de9cd9a 2176
750628d8
DN
2177 /* If this PHI has itself as an argument, we cannot
2178 determine the string length of this argument. However,
2179 if we can find a constant string length for the other
2180 PHI args then we can still be sure that this is a
2181 constant string length. So be optimistic and just
2182 continue with the next argument. */
2183 if (arg == PHI_RESULT (def_stmt))
2184 continue;
6de9cd9a 2185
10a0d495 2186 if (!get_maxval_strlen (arg, length, visited, type))
750628d8
DN
2187 return false;
2188 }
6de9cd9a 2189
750628d8 2190 return true;
173b818d 2191 }
6de9cd9a 2192
750628d8
DN
2193 default:
2194 break;
6de9cd9a
DN
2195 }
2196
750628d8
DN
2197
2198 return false;
6de9cd9a
DN
2199}
2200
2201
2202/* Fold builtin call FN in statement STMT. If it cannot be folded into a
2203 constant, return NULL_TREE. Otherwise, return its constant value. */
2204
2205static tree
2206ccp_fold_builtin (tree stmt, tree fn)
2207{
10a0d495 2208 tree result, val[3];
a32e70c3 2209 tree callee, arglist, a;
10a0d495 2210 int arg_mask, i, type;
a32e70c3
RS
2211 bitmap visited;
2212 bool ignore;
6de9cd9a 2213
07beea0d 2214 ignore = TREE_CODE (stmt) != GIMPLE_MODIFY_STMT;
6de9cd9a
DN
2215
2216 /* First try the generic builtin folder. If that succeeds, return the
2217 result directly. */
49d1af89
KH
2218 callee = get_callee_fndecl (fn);
2219 arglist = TREE_OPERAND (fn, 1);
2220 result = fold_builtin (callee, arglist, ignore);
6de9cd9a 2221 if (result)
10a0d495
JJ
2222 {
2223 if (ignore)
2224 STRIP_NOPS (result);
2225 return result;
2226 }
a32e70c3
RS
2227
2228 /* Ignore MD builtins. */
a32e70c3
RS
2229 if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD)
2230 return NULL_TREE;
6de9cd9a
DN
2231
2232 /* If the builtin could not be folded, and it has no argument list,
2233 we're done. */
2234 if (!arglist)
2235 return NULL_TREE;
2236
2237 /* Limit the work only for builtins we know how to simplify. */
2238 switch (DECL_FUNCTION_CODE (callee))
2239 {
2240 case BUILT_IN_STRLEN:
2241 case BUILT_IN_FPUTS:
2242 case BUILT_IN_FPUTS_UNLOCKED:
10a0d495
JJ
2243 arg_mask = 1;
2244 type = 0;
6de9cd9a
DN
2245 break;
2246 case BUILT_IN_STRCPY:
2247 case BUILT_IN_STRNCPY:
10a0d495
JJ
2248 arg_mask = 2;
2249 type = 0;
2250 break;
2251 case BUILT_IN_MEMCPY_CHK:
2252 case BUILT_IN_MEMPCPY_CHK:
2253 case BUILT_IN_MEMMOVE_CHK:
2254 case BUILT_IN_MEMSET_CHK:
2255 case BUILT_IN_STRNCPY_CHK:
2256 arg_mask = 4;
2257 type = 2;
2258 break;
2259 case BUILT_IN_STRCPY_CHK:
2260 case BUILT_IN_STPCPY_CHK:
2261 arg_mask = 2;
2262 type = 1;
2263 break;
2264 case BUILT_IN_SNPRINTF_CHK:
2265 case BUILT_IN_VSNPRINTF_CHK:
2266 arg_mask = 2;
2267 type = 2;
6de9cd9a
DN
2268 break;
2269 default:
2270 return NULL_TREE;
2271 }
2272
2273 /* Try to use the dataflow information gathered by the CCP process. */
8bdbfff5 2274 visited = BITMAP_ALLOC (NULL);
6de9cd9a 2275
10a0d495 2276 memset (val, 0, sizeof (val));
6de9cd9a 2277 for (i = 0, a = arglist;
10a0d495
JJ
2278 arg_mask;
2279 i++, arg_mask >>= 1, a = TREE_CHAIN (a))
2280 if (arg_mask & 1)
6de9cd9a
DN
2281 {
2282 bitmap_clear (visited);
10a0d495
JJ
2283 if (!get_maxval_strlen (TREE_VALUE (a), &val[i], visited, type))
2284 val[i] = NULL_TREE;
6de9cd9a
DN
2285 }
2286
8bdbfff5 2287 BITMAP_FREE (visited);
6de9cd9a 2288
a32e70c3 2289 result = NULL_TREE;
6de9cd9a
DN
2290 switch (DECL_FUNCTION_CODE (callee))
2291 {
2292 case BUILT_IN_STRLEN:
10a0d495 2293 if (val[0])
6de9cd9a 2294 {
10a0d495 2295 tree new = fold_convert (TREE_TYPE (fn), val[0]);
6de9cd9a
DN
2296
2297 /* If the result is not a valid gimple value, or not a cast
2298 of a valid gimple value, then we can not use the result. */
2299 if (is_gimple_val (new)
2300 || (is_gimple_cast (new)
2301 && is_gimple_val (TREE_OPERAND (new, 0))))
2302 return new;
6de9cd9a 2303 }
a32e70c3
RS
2304 break;
2305
6de9cd9a 2306 case BUILT_IN_STRCPY:
10a0d495
JJ
2307 if (val[1] && is_gimple_val (val[1]))
2308 result = fold_builtin_strcpy (callee, arglist, val[1]);
a32e70c3
RS
2309 break;
2310
6de9cd9a 2311 case BUILT_IN_STRNCPY:
10a0d495
JJ
2312 if (val[1] && is_gimple_val (val[1]))
2313 result = fold_builtin_strncpy (callee, arglist, val[1]);
a32e70c3
RS
2314 break;
2315
6de9cd9a 2316 case BUILT_IN_FPUTS:
a32e70c3 2317 result = fold_builtin_fputs (arglist,
07beea0d 2318 TREE_CODE (stmt) != GIMPLE_MODIFY_STMT, 0,
10a0d495 2319 val[0]);
a32e70c3
RS
2320 break;
2321
6de9cd9a 2322 case BUILT_IN_FPUTS_UNLOCKED:
a32e70c3 2323 result = fold_builtin_fputs (arglist,
07beea0d 2324 TREE_CODE (stmt) != GIMPLE_MODIFY_STMT, 1,
10a0d495
JJ
2325 val[0]);
2326 break;
2327
2328 case BUILT_IN_MEMCPY_CHK:
2329 case BUILT_IN_MEMPCPY_CHK:
2330 case BUILT_IN_MEMMOVE_CHK:
2331 case BUILT_IN_MEMSET_CHK:
2332 if (val[2] && is_gimple_val (val[2]))
2333 result = fold_builtin_memory_chk (callee, arglist, val[2], ignore,
2334 DECL_FUNCTION_CODE (callee));
2335 break;
2336
2337 case BUILT_IN_STRCPY_CHK:
2338 case BUILT_IN_STPCPY_CHK:
2339 if (val[1] && is_gimple_val (val[1]))
2340 result = fold_builtin_stxcpy_chk (callee, arglist, val[1], ignore,
2341 DECL_FUNCTION_CODE (callee));
2342 break;
2343
2344 case BUILT_IN_STRNCPY_CHK:
2345 if (val[2] && is_gimple_val (val[2]))
2346 result = fold_builtin_strncpy_chk (arglist, val[2]);
2347 break;
2348
2349 case BUILT_IN_SNPRINTF_CHK:
2350 case BUILT_IN_VSNPRINTF_CHK:
2351 if (val[1] && is_gimple_val (val[1]))
2352 result = fold_builtin_snprintf_chk (arglist, val[1],
2353 DECL_FUNCTION_CODE (callee));
a32e70c3 2354 break;
6de9cd9a
DN
2355
2356 default:
1e128c5f 2357 gcc_unreachable ();
6de9cd9a
DN
2358 }
2359
a32e70c3 2360 if (result && ignore)
9675412f 2361 result = fold_ignored_result (result);
a32e70c3 2362 return result;
6de9cd9a
DN
2363}
2364
2365
206048bd 2366/* Fold the statement pointed to by STMT_P. In some cases, this function may
750628d8
DN
2367 replace the whole statement with a new one. Returns true iff folding
2368 makes any changes. */
6de9cd9a 2369
750628d8
DN
2370bool
2371fold_stmt (tree *stmt_p)
6de9cd9a 2372{
750628d8 2373 tree rhs, result, stmt;
622f91ba 2374 struct fold_stmt_r_data fold_stmt_r_data;
750628d8 2375 bool changed = false;
622f91ba
JL
2376 bool inside_addr_expr = false;
2377
2378 fold_stmt_r_data.changed_p = &changed;
2379 fold_stmt_r_data.inside_addr_expr_p = &inside_addr_expr;
6de9cd9a 2380
750628d8 2381 stmt = *stmt_p;
6de9cd9a 2382
750628d8
DN
2383 /* If we replaced constants and the statement makes pointer dereferences,
2384 then we may need to fold instances of *&VAR into VAR, etc. */
622f91ba 2385 if (walk_tree (stmt_p, fold_stmt_r, &fold_stmt_r_data, NULL))
750628d8
DN
2386 {
2387 *stmt_p
2388 = build_function_call_expr (implicit_built_in_decls[BUILT_IN_TRAP],
2389 NULL);
6de9cd9a
DN
2390 return true;
2391 }
2392
750628d8
DN
2393 rhs = get_rhs (stmt);
2394 if (!rhs)
2395 return changed;
2396 result = NULL_TREE;
6de9cd9a 2397
750628d8 2398 if (TREE_CODE (rhs) == CALL_EXPR)
6de9cd9a 2399 {
750628d8 2400 tree callee;
6de9cd9a 2401
750628d8
DN
2402 /* Check for builtins that CCP can handle using information not
2403 available in the generic fold routines. */
2404 callee = get_callee_fndecl (rhs);
2405 if (callee && DECL_BUILT_IN (callee))
2406 result = ccp_fold_builtin (stmt, rhs);
1809ff6b
AP
2407 else
2408 {
2409 /* Check for resolvable OBJ_TYPE_REF. The only sorts we can resolve
2410 here are when we've propagated the address of a decl into the
2411 object slot. */
2412 /* ??? Should perhaps do this in fold proper. However, doing it
2413 there requires that we create a new CALL_EXPR, and that requires
2414 copying EH region info to the new node. Easier to just do it
2415 here where we can just smash the call operand. Also
2416 CALL_EXPR_RETURN_SLOT_OPT needs to be handled correctly and
2417 copied, fold_ternary does not have not information. */
2418 callee = TREE_OPERAND (rhs, 0);
2419 if (TREE_CODE (callee) == OBJ_TYPE_REF
2420 && lang_hooks.fold_obj_type_ref
2421 && TREE_CODE (OBJ_TYPE_REF_OBJECT (callee)) == ADDR_EXPR
2422 && DECL_P (TREE_OPERAND
2423 (OBJ_TYPE_REF_OBJECT (callee), 0)))
2424 {
2425 tree t;
2426
2427 /* ??? Caution: Broken ADDR_EXPR semantics means that
2428 looking at the type of the operand of the addr_expr
2429 can yield an array type. See silly exception in
2430 check_pointer_types_r. */
2431
2432 t = TREE_TYPE (TREE_TYPE (OBJ_TYPE_REF_OBJECT (callee)));
2433 t = lang_hooks.fold_obj_type_ref (callee, t);
2434 if (t)
2435 {
2436 TREE_OPERAND (rhs, 0) = t;
2437 changed = true;
2438 }
2439 }
2440 }
6de9cd9a
DN
2441 }
2442
750628d8
DN
2443 /* If we couldn't fold the RHS, hand over to the generic fold routines. */
2444 if (result == NULL_TREE)
2445 result = fold (rhs);
6de9cd9a 2446
750628d8
DN
2447 /* Strip away useless type conversions. Both the NON_LVALUE_EXPR that
2448 may have been added by fold, and "useless" type conversions that might
2449 now be apparent due to propagation. */
2450 STRIP_USELESS_TYPE_CONVERSION (result);
2451
2452 if (result != rhs)
2453 changed |= set_rhs (stmt_p, result);
2454
2455 return changed;
6de9cd9a
DN
2456}
2457
38965eb2
ZD
2458/* Perform the minimal folding on statement STMT. Only operations like
2459 *&x created by constant propagation are handled. The statement cannot
2460 be replaced with a new one. */
2461
2462bool
2463fold_stmt_inplace (tree stmt)
2464{
2465 tree old_stmt = stmt, rhs, new_rhs;
622f91ba 2466 struct fold_stmt_r_data fold_stmt_r_data;
38965eb2 2467 bool changed = false;
622f91ba
JL
2468 bool inside_addr_expr = false;
2469
2470 fold_stmt_r_data.changed_p = &changed;
2471 fold_stmt_r_data.inside_addr_expr_p = &inside_addr_expr;
38965eb2 2472
622f91ba 2473 walk_tree (&stmt, fold_stmt_r, &fold_stmt_r_data, NULL);
38965eb2
ZD
2474 gcc_assert (stmt == old_stmt);
2475
2476 rhs = get_rhs (stmt);
2477 if (!rhs || rhs == stmt)
2478 return changed;
2479
2480 new_rhs = fold (rhs);
43e364dd 2481 STRIP_USELESS_TYPE_CONVERSION (new_rhs);
38965eb2
ZD
2482 if (new_rhs == rhs)
2483 return changed;
2484
2485 changed |= set_rhs (&stmt, new_rhs);
2486 gcc_assert (stmt == old_stmt);
2487
2488 return changed;
2489}
6de9cd9a 2490\f
b28b1600
JJ
2491/* Convert EXPR into a GIMPLE value suitable for substitution on the
2492 RHS of an assignment. Insert the necessary statements before
2e929cf3
JH
2493 iterator *SI_P.
2494 When IGNORE is set, don't worry about the return value. */
b28b1600
JJ
2495
2496static tree
2e929cf3 2497convert_to_gimple_builtin (block_stmt_iterator *si_p, tree expr, bool ignore)
b28b1600
JJ
2498{
2499 tree_stmt_iterator ti;
2500 tree stmt = bsi_stmt (*si_p);
2501 tree tmp, stmts = NULL;
2502
2503 push_gimplify_context ();
2e929cf3
JH
2504 if (ignore)
2505 {
2506 tmp = build_empty_stmt ();
2507 gimplify_and_add (expr, &stmts);
2508 }
2509 else
2510 tmp = get_initialized_tmp_var (expr, &stmts, NULL);
b28b1600
JJ
2511 pop_gimplify_context (NULL);
2512
f47c96aa
AM
2513 if (EXPR_HAS_LOCATION (stmt))
2514 annotate_all_with_locus (&stmts, EXPR_LOCATION (stmt));
2515
b28b1600
JJ
2516 /* The replacement can expose previously unreferenced variables. */
2517 for (ti = tsi_start (stmts); !tsi_end_p (ti); tsi_next (&ti))
2518 {
f47c96aa 2519 tree new_stmt = tsi_stmt (ti);
b28b1600 2520 find_new_referenced_vars (tsi_stmt_ptr (ti));
f47c96aa 2521 bsi_insert_before (si_p, new_stmt, BSI_NEW_STMT);
cfaab3a9 2522 mark_symbols_for_renaming (new_stmt);
f47c96aa 2523 bsi_next (si_p);
b28b1600
JJ
2524 }
2525
b28b1600
JJ
2526 return tmp;
2527}
2528
2529
6de9cd9a
DN
2530/* A simple pass that attempts to fold all builtin functions. This pass
2531 is run after we've propagated as many constants as we can. */
2532
c2924966 2533static unsigned int
6de9cd9a
DN
2534execute_fold_all_builtins (void)
2535{
a7d6ba24 2536 bool cfg_changed = false;
6de9cd9a
DN
2537 basic_block bb;
2538 FOR_EACH_BB (bb)
2539 {
2540 block_stmt_iterator i;
10a0d495 2541 for (i = bsi_start (bb); !bsi_end_p (i); )
6de9cd9a
DN
2542 {
2543 tree *stmtp = bsi_stmt_ptr (i);
af47810a 2544 tree old_stmt = *stmtp;
6de9cd9a
DN
2545 tree call = get_rhs (*stmtp);
2546 tree callee, result;
10a0d495 2547 enum built_in_function fcode;
6de9cd9a
DN
2548
2549 if (!call || TREE_CODE (call) != CALL_EXPR)
10a0d495
JJ
2550 {
2551 bsi_next (&i);
2552 continue;
2553 }
6de9cd9a
DN
2554 callee = get_callee_fndecl (call);
2555 if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
10a0d495
JJ
2556 {
2557 bsi_next (&i);
2558 continue;
2559 }
2560 fcode = DECL_FUNCTION_CODE (callee);
6de9cd9a
DN
2561
2562 result = ccp_fold_builtin (*stmtp, call);
2563 if (!result)
2564 switch (DECL_FUNCTION_CODE (callee))
2565 {
2566 case BUILT_IN_CONSTANT_P:
2567 /* Resolve __builtin_constant_p. If it hasn't been
2568 folded to integer_one_node by now, it's fairly
2569 certain that the value simply isn't constant. */
2570 result = integer_zero_node;
2571 break;
2572
2573 default:
10a0d495 2574 bsi_next (&i);
6de9cd9a
DN
2575 continue;
2576 }
2577
2578 if (dump_file && (dump_flags & TDF_DETAILS))
2579 {
2580 fprintf (dump_file, "Simplified\n ");
2581 print_generic_stmt (dump_file, *stmtp, dump_flags);
2582 }
2583
cfaab3a9
DN
2584 push_stmt_changes (stmtp);
2585
b28b1600
JJ
2586 if (!set_rhs (stmtp, result))
2587 {
2e929cf3
JH
2588 result = convert_to_gimple_builtin (&i, result,
2589 TREE_CODE (old_stmt)
07beea0d 2590 != GIMPLE_MODIFY_STMT);
e16acfcd
NS
2591 if (result)
2592 {
2593 bool ok = set_rhs (stmtp, result);
e16acfcd
NS
2594 gcc_assert (ok);
2595 }
b28b1600 2596 }
cfaab3a9
DN
2597
2598 pop_stmt_changes (stmtp);
2599
af47810a 2600 if (maybe_clean_or_replace_eh_stmt (old_stmt, *stmtp)
a7d6ba24
JJ
2601 && tree_purge_dead_eh_edges (bb))
2602 cfg_changed = true;
6de9cd9a
DN
2603
2604 if (dump_file && (dump_flags & TDF_DETAILS))
2605 {
2606 fprintf (dump_file, "to\n ");
2607 print_generic_stmt (dump_file, *stmtp, dump_flags);
2608 fprintf (dump_file, "\n");
2609 }
10a0d495
JJ
2610
2611 /* Retry the same statement if it changed into another
2612 builtin, there might be new opportunities now. */
2613 call = get_rhs (*stmtp);
2614 if (!call || TREE_CODE (call) != CALL_EXPR)
2615 {
2616 bsi_next (&i);
2617 continue;
2618 }
2619 callee = get_callee_fndecl (call);
2620 if (!callee
2621 || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
2622 || DECL_FUNCTION_CODE (callee) == fcode)
2623 bsi_next (&i);
6de9cd9a
DN
2624 }
2625 }
a7d6ba24
JJ
2626
2627 /* Delete unreachable blocks. */
2628 if (cfg_changed)
2629 cleanup_tree_cfg ();
c2924966 2630 return 0;
6de9cd9a
DN
2631}
2632
750628d8 2633
6de9cd9a
DN
2634struct tree_opt_pass pass_fold_builtins =
2635{
2636 "fab", /* name */
2637 NULL, /* gate */
2638 execute_fold_all_builtins, /* execute */
2639 NULL, /* sub */
2640 NULL, /* next */
2641 0, /* static_pass_number */
2642 0, /* tv_id */
c1b763fa 2643 PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
6de9cd9a
DN
2644 0, /* properties_provided */
2645 0, /* properties_destroyed */
2646 0, /* todo_flags_start */
b28b1600
JJ
2647 TODO_dump_func
2648 | TODO_verify_ssa
0bca51f0 2649 | TODO_update_ssa, /* todo_flags_finish */
9f8628ba 2650 0 /* letter */
6de9cd9a 2651};