]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa-ccp.c
2010-06-14 Ed Schonberg <schonberg@adacore.com>
[thirdparty/gcc.git] / gcc / tree-ssa-ccp.c
CommitLineData
4ee9c684 1/* Conditional constant propagation pass for the GNU compiler.
87c0a9fc 2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010 Free Software Foundation, Inc.
4ee9c684 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.
48e1416a 8
4ee9c684 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
8c4c00c1 11Free Software Foundation; either version 3, or (at your option) any
4ee9c684 12later version.
48e1416a 13
4ee9c684 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.
48e1416a 18
4ee9c684 19You should have received a copy of the GNU General Public License
8c4c00c1 20along with GCC; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
4ee9c684 22
88dbf20f 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
bfa30570 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.
88dbf20f 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.
48e1416a 66
88dbf20f 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
4fb5e5ca 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,
88dbf20f 138
4fb5e5ca 139 # a_5 = VDEF <a_4>
88dbf20f 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
bfa30570 149 Note that the initial value of virtual operands is VARYING, not
150 UNDEFINED. Consider, for instance global variables:
88dbf20f 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
bfa30570 168 would erroneously optimize the above into 'return 3;'.
88dbf20f 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.
4ee9c684 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"
4ee9c684 192#include "tree.h"
41511585 193#include "flags.h"
4ee9c684 194#include "tm_p.h"
4ee9c684 195#include "basic-block.h"
41511585 196#include "output.h"
41511585 197#include "function.h"
ce084dfc 198#include "tree-pretty-print.h"
199#include "gimple-pretty-print.h"
41511585 200#include "timevar.h"
4ee9c684 201#include "tree-dump.h"
41511585 202#include "tree-flow.h"
4ee9c684 203#include "tree-pass.h"
41511585 204#include "tree-ssa-propagate.h"
5a4b7e1e 205#include "value-prof.h"
41511585 206#include "langhooks.h"
8782adcf 207#include "target.h"
add6ee5e 208#include "toplev.h"
43fb76c1 209#include "dbgcnt.h"
4ee9c684 210
211
212/* Possible lattice values. */
213typedef enum
214{
bfa30570 215 UNINITIALIZED,
4ee9c684 216 UNDEFINED,
217 CONSTANT,
218 VARYING
88dbf20f 219} ccp_lattice_t;
4ee9c684 220
88dbf20f 221/* Array of propagated constant values. After propagation,
222 CONST_VAL[I].VALUE holds the constant value for SSA_NAME(I). If
223 the constant is held in an SSA name representing a memory store
4fb5e5ca 224 (i.e., a VDEF), CONST_VAL[I].MEM_REF will contain the actual
225 memory reference used to store (i.e., the LHS of the assignment
226 doing the store). */
20140406 227static prop_value_t *const_val;
4ee9c684 228
4af351a8 229static void canonicalize_float_value (prop_value_t *);
6688f8ec 230static bool ccp_fold_stmt (gimple_stmt_iterator *);
4af351a8 231
88dbf20f 232/* Dump constant propagation value VAL to file OUTF prefixed by PREFIX. */
01406fc0 233
234static void
88dbf20f 235dump_lattice_value (FILE *outf, const char *prefix, prop_value_t val)
01406fc0 236{
41511585 237 switch (val.lattice_val)
01406fc0 238 {
88dbf20f 239 case UNINITIALIZED:
240 fprintf (outf, "%sUNINITIALIZED", prefix);
241 break;
41511585 242 case UNDEFINED:
243 fprintf (outf, "%sUNDEFINED", prefix);
244 break;
245 case VARYING:
246 fprintf (outf, "%sVARYING", prefix);
247 break;
41511585 248 case CONSTANT:
249 fprintf (outf, "%sCONSTANT ", prefix);
88dbf20f 250 print_generic_expr (outf, val.value, dump_flags);
41511585 251 break;
252 default:
8c0963c4 253 gcc_unreachable ();
41511585 254 }
01406fc0 255}
4ee9c684 256
4ee9c684 257
88dbf20f 258/* Print lattice value VAL to stderr. */
259
260void debug_lattice_value (prop_value_t val);
261
4b987fac 262DEBUG_FUNCTION void
88dbf20f 263debug_lattice_value (prop_value_t val)
264{
265 dump_lattice_value (stderr, "", val);
266 fprintf (stderr, "\n");
267}
4ee9c684 268
4ee9c684 269
88dbf20f 270/* Compute a default value for variable VAR and store it in the
271 CONST_VAL array. The following rules are used to get default
272 values:
01406fc0 273
88dbf20f 274 1- Global and static variables that are declared constant are
275 considered CONSTANT.
276
277 2- Any other value is considered UNDEFINED. This is useful when
41511585 278 considering PHI nodes. PHI arguments that are undefined do not
279 change the constant value of the PHI node, which allows for more
88dbf20f 280 constants to be propagated.
4ee9c684 281
8883e700 282 3- Variables defined by statements other than assignments and PHI
88dbf20f 283 nodes are considered VARYING.
4ee9c684 284
8883e700 285 4- Initial values of variables that are not GIMPLE registers are
bfa30570 286 considered VARYING. */
4ee9c684 287
88dbf20f 288static prop_value_t
289get_default_value (tree var)
290{
291 tree sym = SSA_NAME_VAR (var);
61207d43 292 prop_value_t val = { UNINITIALIZED, NULL_TREE };
8edeb88b 293 gimple stmt;
294
295 stmt = SSA_NAME_DEF_STMT (var);
296
297 if (gimple_nop_p (stmt))
4ee9c684 298 {
8edeb88b 299 /* Variables defined by an empty statement are those used
300 before being initialized. If VAR is a local variable, we
301 can assume initially that it is UNDEFINED, otherwise we must
302 consider it VARYING. */
303 if (is_gimple_reg (sym) && TREE_CODE (sym) != PARM_DECL)
304 val.lattice_val = UNDEFINED;
305 else
306 val.lattice_val = VARYING;
4ee9c684 307 }
8edeb88b 308 else if (is_gimple_assign (stmt)
309 /* Value-returning GIMPLE_CALL statements assign to
310 a variable, and are treated similarly to GIMPLE_ASSIGN. */
311 || (is_gimple_call (stmt)
312 && gimple_call_lhs (stmt) != NULL_TREE)
313 || gimple_code (stmt) == GIMPLE_PHI)
41511585 314 {
8edeb88b 315 tree cst;
316 if (gimple_assign_single_p (stmt)
317 && DECL_P (gimple_assign_rhs1 (stmt))
318 && (cst = get_symbol_constant_value (gimple_assign_rhs1 (stmt))))
88dbf20f 319 {
8edeb88b 320 val.lattice_val = CONSTANT;
321 val.value = cst;
88dbf20f 322 }
323 else
8edeb88b 324 /* Any other variable defined by an assignment or a PHI node
325 is considered UNDEFINED. */
326 val.lattice_val = UNDEFINED;
327 }
328 else
329 {
330 /* Otherwise, VAR will never take on a constant value. */
331 val.lattice_val = VARYING;
41511585 332 }
4ee9c684 333
41511585 334 return val;
335}
4ee9c684 336
4ee9c684 337
bfa30570 338/* Get the constant value associated with variable VAR. */
4ee9c684 339
bfa30570 340static inline prop_value_t *
341get_value (tree var)
88dbf20f 342{
e004838d 343 prop_value_t *val;
bfa30570 344
e004838d 345 if (const_val == NULL)
346 return NULL;
347
348 val = &const_val[SSA_NAME_VERSION (var)];
bfa30570 349 if (val->lattice_val == UNINITIALIZED)
4ee9c684 350 *val = get_default_value (var);
351
4af351a8 352 canonicalize_float_value (val);
353
4ee9c684 354 return val;
355}
356
bfa30570 357/* Sets the value associated with VAR to VARYING. */
358
359static inline void
360set_value_varying (tree var)
361{
362 prop_value_t *val = &const_val[SSA_NAME_VERSION (var)];
363
364 val->lattice_val = VARYING;
365 val->value = NULL_TREE;
bfa30570 366}
4ee9c684 367
b31eb493 368/* For float types, modify the value of VAL to make ccp work correctly
369 for non-standard values (-0, NaN):
370
371 If HONOR_SIGNED_ZEROS is false, and VAL = -0, we canonicalize it to 0.
372 If HONOR_NANS is false, and VAL is NaN, we canonicalize it to UNDEFINED.
373 This is to fix the following problem (see PR 29921): Suppose we have
374
375 x = 0.0 * y
376
377 and we set value of y to NaN. This causes value of x to be set to NaN.
378 When we later determine that y is in fact VARYING, fold uses the fact
379 that HONOR_NANS is false, and we try to change the value of x to 0,
380 causing an ICE. With HONOR_NANS being false, the real appearance of
381 NaN would cause undefined behavior, though, so claiming that y (and x)
382 are UNDEFINED initially is correct. */
383
384static void
385canonicalize_float_value (prop_value_t *val)
386{
387 enum machine_mode mode;
388 tree type;
389 REAL_VALUE_TYPE d;
390
391 if (val->lattice_val != CONSTANT
392 || TREE_CODE (val->value) != REAL_CST)
393 return;
394
395 d = TREE_REAL_CST (val->value);
396 type = TREE_TYPE (val->value);
397 mode = TYPE_MODE (type);
398
399 if (!HONOR_SIGNED_ZEROS (mode)
400 && REAL_VALUE_MINUS_ZERO (d))
401 {
402 val->value = build_real (type, dconst0);
403 return;
404 }
405
406 if (!HONOR_NANS (mode)
407 && REAL_VALUE_ISNAN (d))
408 {
409 val->lattice_val = UNDEFINED;
410 val->value = NULL;
b31eb493 411 return;
412 }
413}
414
88dbf20f 415/* Set the value for variable VAR to NEW_VAL. Return true if the new
416 value is different from VAR's previous value. */
4ee9c684 417
41511585 418static bool
88dbf20f 419set_lattice_value (tree var, prop_value_t new_val)
4ee9c684 420{
bfa30570 421 prop_value_t *old_val = get_value (var);
88dbf20f 422
b31eb493 423 canonicalize_float_value (&new_val);
424
88dbf20f 425 /* Lattice transitions must always be monotonically increasing in
bfa30570 426 value. If *OLD_VAL and NEW_VAL are the same, return false to
427 inform the caller that this was a non-transition. */
428
aecfc21d 429 gcc_assert (old_val->lattice_val < new_val.lattice_val
88dbf20f 430 || (old_val->lattice_val == new_val.lattice_val
aecfc21d 431 && ((!old_val->value && !new_val.value)
61207d43 432 || operand_equal_p (old_val->value, new_val.value, 0))));
88dbf20f 433
434 if (old_val->lattice_val != new_val.lattice_val)
4ee9c684 435 {
41511585 436 if (dump_file && (dump_flags & TDF_DETAILS))
437 {
88dbf20f 438 dump_lattice_value (dump_file, "Lattice value changed to ", new_val);
bfa30570 439 fprintf (dump_file, ". Adding SSA edges to worklist.\n");
41511585 440 }
441
88dbf20f 442 *old_val = new_val;
443
bfa30570 444 gcc_assert (new_val.lattice_val != UNDEFINED);
445 return true;
4ee9c684 446 }
41511585 447
448 return false;
4ee9c684 449}
450
451
88dbf20f 452/* Return the likely CCP lattice value for STMT.
4ee9c684 453
41511585 454 If STMT has no operands, then return CONSTANT.
4ee9c684 455
d61b9af3 456 Else if undefinedness of operands of STMT cause its value to be
457 undefined, then return UNDEFINED.
4ee9c684 458
41511585 459 Else if any operands of STMT are constants, then return CONSTANT.
4ee9c684 460
41511585 461 Else return VARYING. */
4ee9c684 462
88dbf20f 463static ccp_lattice_t
75a70cf9 464likely_value (gimple stmt)
41511585 465{
d61b9af3 466 bool has_constant_operand, has_undefined_operand, all_undefined_operands;
41511585 467 tree use;
468 ssa_op_iter iter;
8edeb88b 469 unsigned i;
4ee9c684 470
590c3166 471 enum gimple_code code = gimple_code (stmt);
75a70cf9 472
473 /* This function appears to be called only for assignments, calls,
474 conditionals, and switches, due to the logic in visit_stmt. */
475 gcc_assert (code == GIMPLE_ASSIGN
476 || code == GIMPLE_CALL
477 || code == GIMPLE_COND
478 || code == GIMPLE_SWITCH);
88dbf20f 479
480 /* If the statement has volatile operands, it won't fold to a
481 constant value. */
75a70cf9 482 if (gimple_has_volatile_ops (stmt))
88dbf20f 483 return VARYING;
484
75a70cf9 485 /* Arrive here for more complex cases. */
bfa30570 486 has_constant_operand = false;
d61b9af3 487 has_undefined_operand = false;
488 all_undefined_operands = true;
8edeb88b 489 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
41511585 490 {
bfa30570 491 prop_value_t *val = get_value (use);
41511585 492
bfa30570 493 if (val->lattice_val == UNDEFINED)
d61b9af3 494 has_undefined_operand = true;
495 else
496 all_undefined_operands = false;
88dbf20f 497
41511585 498 if (val->lattice_val == CONSTANT)
bfa30570 499 has_constant_operand = true;
4ee9c684 500 }
41511585 501
dd277d48 502 /* There may be constants in regular rhs operands. For calls we
503 have to ignore lhs, fndecl and static chain, otherwise only
504 the lhs. */
505 for (i = (is_gimple_call (stmt) ? 2 : 0) + gimple_has_lhs (stmt);
8edeb88b 506 i < gimple_num_ops (stmt); ++i)
507 {
508 tree op = gimple_op (stmt, i);
509 if (!op || TREE_CODE (op) == SSA_NAME)
510 continue;
511 if (is_gimple_min_invariant (op))
512 has_constant_operand = true;
513 }
514
87c0a9fc 515 if (has_constant_operand)
516 all_undefined_operands = false;
517
d61b9af3 518 /* If the operation combines operands like COMPLEX_EXPR make sure to
519 not mark the result UNDEFINED if only one part of the result is
520 undefined. */
75a70cf9 521 if (has_undefined_operand && all_undefined_operands)
d61b9af3 522 return UNDEFINED;
75a70cf9 523 else if (code == GIMPLE_ASSIGN && has_undefined_operand)
d61b9af3 524 {
75a70cf9 525 switch (gimple_assign_rhs_code (stmt))
d61b9af3 526 {
527 /* Unary operators are handled with all_undefined_operands. */
528 case PLUS_EXPR:
529 case MINUS_EXPR:
d61b9af3 530 case POINTER_PLUS_EXPR:
d61b9af3 531 /* Not MIN_EXPR, MAX_EXPR. One VARYING operand may be selected.
532 Not bitwise operators, one VARYING operand may specify the
533 result completely. Not logical operators for the same reason.
05a936a0 534 Not COMPLEX_EXPR as one VARYING operand makes the result partly
535 not UNDEFINED. Not *DIV_EXPR, comparisons and shifts because
536 the undefined operand may be promoted. */
d61b9af3 537 return UNDEFINED;
538
539 default:
540 ;
541 }
542 }
543 /* If there was an UNDEFINED operand but the result may be not UNDEFINED
544 fall back to VARYING even if there were CONSTANT operands. */
545 if (has_undefined_operand)
546 return VARYING;
547
8edeb88b 548 /* We do not consider virtual operands here -- load from read-only
549 memory may have only VARYING virtual operands, but still be
550 constant. */
bfa30570 551 if (has_constant_operand
8edeb88b 552 || gimple_references_memory_p (stmt))
88dbf20f 553 return CONSTANT;
554
bfa30570 555 return VARYING;
4ee9c684 556}
557
bfa30570 558/* Returns true if STMT cannot be constant. */
559
560static bool
75a70cf9 561surely_varying_stmt_p (gimple stmt)
bfa30570 562{
563 /* If the statement has operands that we cannot handle, it cannot be
564 constant. */
75a70cf9 565 if (gimple_has_volatile_ops (stmt))
bfa30570 566 return true;
567
f257af64 568 /* If it is a call and does not return a value or is not a
569 builtin and not an indirect call, it is varying. */
75a70cf9 570 if (is_gimple_call (stmt))
f257af64 571 {
572 tree fndecl;
573 if (!gimple_call_lhs (stmt)
574 || ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
5768aeb3 575 && !DECL_BUILT_IN (fndecl)))
f257af64 576 return true;
577 }
bfa30570 578
8edeb88b 579 /* Any other store operation is not interesting. */
dd277d48 580 else if (gimple_vdef (stmt))
8edeb88b 581 return true;
582
bfa30570 583 /* Anything other than assignments and conditional jumps are not
584 interesting for CCP. */
75a70cf9 585 if (gimple_code (stmt) != GIMPLE_ASSIGN
f257af64 586 && gimple_code (stmt) != GIMPLE_COND
587 && gimple_code (stmt) != GIMPLE_SWITCH
588 && gimple_code (stmt) != GIMPLE_CALL)
bfa30570 589 return true;
590
591 return false;
592}
4ee9c684 593
41511585 594/* Initialize local data structures for CCP. */
4ee9c684 595
596static void
41511585 597ccp_initialize (void)
4ee9c684 598{
41511585 599 basic_block bb;
4ee9c684 600
43959b95 601 const_val = XCNEWVEC (prop_value_t, num_ssa_names);
4ee9c684 602
41511585 603 /* Initialize simulation flags for PHI nodes and statements. */
604 FOR_EACH_BB (bb)
4ee9c684 605 {
75a70cf9 606 gimple_stmt_iterator i;
4ee9c684 607
75a70cf9 608 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
41511585 609 {
75a70cf9 610 gimple stmt = gsi_stmt (i);
2193544e 611 bool is_varying;
612
613 /* If the statement is a control insn, then we do not
614 want to avoid simulating the statement once. Failure
615 to do so means that those edges will never get added. */
616 if (stmt_ends_bb_p (stmt))
617 is_varying = false;
618 else
619 is_varying = surely_varying_stmt_p (stmt);
4ee9c684 620
bfa30570 621 if (is_varying)
41511585 622 {
88dbf20f 623 tree def;
624 ssa_op_iter iter;
625
626 /* If the statement will not produce a constant, mark
627 all its outputs VARYING. */
628 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
8edeb88b 629 set_value_varying (def);
41511585 630 }
75a70cf9 631 prop_set_simulate_again (stmt, !is_varying);
41511585 632 }
4ee9c684 633 }
634
75a70cf9 635 /* Now process PHI nodes. We never clear the simulate_again flag on
636 phi nodes, since we do not know which edges are executable yet,
637 except for phi nodes for virtual operands when we do not do store ccp. */
41511585 638 FOR_EACH_BB (bb)
4ee9c684 639 {
75a70cf9 640 gimple_stmt_iterator i;
41511585 641
75a70cf9 642 for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
643 {
644 gimple phi = gsi_stmt (i);
645
61207d43 646 if (!is_gimple_reg (gimple_phi_result (phi)))
75a70cf9 647 prop_set_simulate_again (phi, false);
bfa30570 648 else
75a70cf9 649 prop_set_simulate_again (phi, true);
41511585 650 }
4ee9c684 651 }
41511585 652}
4ee9c684 653
43fb76c1 654/* Debug count support. Reset the values of ssa names
655 VARYING when the total number ssa names analyzed is
656 beyond the debug count specified. */
657
658static void
659do_dbg_cnt (void)
660{
661 unsigned i;
662 for (i = 0; i < num_ssa_names; i++)
663 {
664 if (!dbg_cnt (ccp))
665 {
666 const_val[i].lattice_val = VARYING;
667 const_val[i].value = NULL_TREE;
668 }
669 }
670}
671
4ee9c684 672
88dbf20f 673/* Do final substitution of propagated values, cleanup the flowgraph and
48e1416a 674 free allocated storage.
4ee9c684 675
33a34f1e 676 Return TRUE when something was optimized. */
677
678static bool
88dbf20f 679ccp_finalize (void)
4ee9c684 680{
43fb76c1 681 bool something_changed;
682
683 do_dbg_cnt ();
88dbf20f 684 /* Perform substitutions based on the known constant values. */
6688f8ec 685 something_changed = substitute_and_fold (const_val, ccp_fold_stmt);
4ee9c684 686
88dbf20f 687 free (const_val);
e004838d 688 const_val = NULL;
33a34f1e 689 return something_changed;;
4ee9c684 690}
691
692
88dbf20f 693/* Compute the meet operator between *VAL1 and *VAL2. Store the result
694 in VAL1.
695
696 any M UNDEFINED = any
88dbf20f 697 any M VARYING = VARYING
698 Ci M Cj = Ci if (i == j)
699 Ci M Cj = VARYING if (i != j)
bfa30570 700 */
4ee9c684 701
702static void
88dbf20f 703ccp_lattice_meet (prop_value_t *val1, prop_value_t *val2)
4ee9c684 704{
88dbf20f 705 if (val1->lattice_val == UNDEFINED)
4ee9c684 706 {
88dbf20f 707 /* UNDEFINED M any = any */
708 *val1 = *val2;
41511585 709 }
88dbf20f 710 else if (val2->lattice_val == UNDEFINED)
92481a4d 711 {
88dbf20f 712 /* any M UNDEFINED = any
713 Nothing to do. VAL1 already contains the value we want. */
714 ;
92481a4d 715 }
88dbf20f 716 else if (val1->lattice_val == VARYING
717 || val2->lattice_val == VARYING)
41511585 718 {
88dbf20f 719 /* any M VARYING = VARYING. */
720 val1->lattice_val = VARYING;
721 val1->value = NULL_TREE;
41511585 722 }
88dbf20f 723 else if (val1->lattice_val == CONSTANT
724 && val2->lattice_val == CONSTANT
61207d43 725 && simple_cst_equal (val1->value, val2->value) == 1)
41511585 726 {
88dbf20f 727 /* Ci M Cj = Ci if (i == j)
728 Ci M Cj = VARYING if (i != j)
729
730 If these two values come from memory stores, make sure that
731 they come from the same memory reference. */
732 val1->lattice_val = CONSTANT;
733 val1->value = val1->value;
41511585 734 }
735 else
736 {
88dbf20f 737 /* Any other combination is VARYING. */
738 val1->lattice_val = VARYING;
739 val1->value = NULL_TREE;
41511585 740 }
4ee9c684 741}
742
743
41511585 744/* Loop through the PHI_NODE's parameters for BLOCK and compare their
745 lattice values to determine PHI_NODE's lattice value. The value of a
88dbf20f 746 PHI node is determined calling ccp_lattice_meet with all the arguments
41511585 747 of the PHI node that are incoming via executable edges. */
4ee9c684 748
41511585 749static enum ssa_prop_result
75a70cf9 750ccp_visit_phi_node (gimple phi)
4ee9c684 751{
75a70cf9 752 unsigned i;
88dbf20f 753 prop_value_t *old_val, new_val;
4ee9c684 754
41511585 755 if (dump_file && (dump_flags & TDF_DETAILS))
4ee9c684 756 {
41511585 757 fprintf (dump_file, "\nVisiting PHI node: ");
75a70cf9 758 print_gimple_stmt (dump_file, phi, 0, dump_flags);
4ee9c684 759 }
4ee9c684 760
75a70cf9 761 old_val = get_value (gimple_phi_result (phi));
41511585 762 switch (old_val->lattice_val)
763 {
764 case VARYING:
88dbf20f 765 return SSA_PROP_VARYING;
4ee9c684 766
41511585 767 case CONSTANT:
768 new_val = *old_val;
769 break;
4ee9c684 770
41511585 771 case UNDEFINED:
41511585 772 new_val.lattice_val = UNDEFINED;
88dbf20f 773 new_val.value = NULL_TREE;
41511585 774 break;
4ee9c684 775
41511585 776 default:
8c0963c4 777 gcc_unreachable ();
41511585 778 }
4ee9c684 779
75a70cf9 780 for (i = 0; i < gimple_phi_num_args (phi); i++)
41511585 781 {
88dbf20f 782 /* Compute the meet operator over all the PHI arguments flowing
783 through executable edges. */
75a70cf9 784 edge e = gimple_phi_arg_edge (phi, i);
4ee9c684 785
41511585 786 if (dump_file && (dump_flags & TDF_DETAILS))
787 {
788 fprintf (dump_file,
789 "\n Argument #%d (%d -> %d %sexecutable)\n",
790 i, e->src->index, e->dest->index,
791 (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
792 }
793
794 /* If the incoming edge is executable, Compute the meet operator for
795 the existing value of the PHI node and the current PHI argument. */
796 if (e->flags & EDGE_EXECUTABLE)
797 {
75a70cf9 798 tree arg = gimple_phi_arg (phi, i)->def;
88dbf20f 799 prop_value_t arg_val;
4ee9c684 800
88dbf20f 801 if (is_gimple_min_invariant (arg))
41511585 802 {
88dbf20f 803 arg_val.lattice_val = CONSTANT;
804 arg_val.value = arg;
41511585 805 }
806 else
bfa30570 807 arg_val = *(get_value (arg));
4ee9c684 808
88dbf20f 809 ccp_lattice_meet (&new_val, &arg_val);
4ee9c684 810
41511585 811 if (dump_file && (dump_flags & TDF_DETAILS))
812 {
813 fprintf (dump_file, "\t");
88dbf20f 814 print_generic_expr (dump_file, arg, dump_flags);
815 dump_lattice_value (dump_file, "\tValue: ", arg_val);
41511585 816 fprintf (dump_file, "\n");
817 }
4ee9c684 818
41511585 819 if (new_val.lattice_val == VARYING)
820 break;
821 }
822 }
4ee9c684 823
824 if (dump_file && (dump_flags & TDF_DETAILS))
41511585 825 {
826 dump_lattice_value (dump_file, "\n PHI node value: ", new_val);
827 fprintf (dump_file, "\n\n");
828 }
829
bfa30570 830 /* Make the transition to the new value. */
75a70cf9 831 if (set_lattice_value (gimple_phi_result (phi), new_val))
41511585 832 {
833 if (new_val.lattice_val == VARYING)
834 return SSA_PROP_VARYING;
835 else
836 return SSA_PROP_INTERESTING;
837 }
838 else
839 return SSA_PROP_NOT_INTERESTING;
4ee9c684 840}
841
41511585 842/* CCP specific front-end to the non-destructive constant folding
843 routines.
4ee9c684 844
845 Attempt to simplify the RHS of STMT knowing that one or more
846 operands are constants.
847
848 If simplification is possible, return the simplified RHS,
75a70cf9 849 otherwise return the original RHS or NULL_TREE. */
4ee9c684 850
851static tree
75a70cf9 852ccp_fold (gimple stmt)
4ee9c684 853{
389dd41b 854 location_t loc = gimple_location (stmt);
75a70cf9 855 switch (gimple_code (stmt))
88dbf20f 856 {
75a70cf9 857 case GIMPLE_ASSIGN:
858 {
859 enum tree_code subcode = gimple_assign_rhs_code (stmt);
860
861 switch (get_gimple_rhs_class (subcode))
862 {
863 case GIMPLE_SINGLE_RHS:
864 {
865 tree rhs = gimple_assign_rhs1 (stmt);
866 enum tree_code_class kind = TREE_CODE_CLASS (subcode);
867
868 if (TREE_CODE (rhs) == SSA_NAME)
869 {
870 /* If the RHS is an SSA_NAME, return its known constant value,
871 if any. */
872 return get_value (rhs)->value;
873 }
874 /* Handle propagating invariant addresses into address operations.
875 The folding we do here matches that in tree-ssa-forwprop.c. */
876 else if (TREE_CODE (rhs) == ADDR_EXPR)
877 {
878 tree *base;
879 base = &TREE_OPERAND (rhs, 0);
880 while (handled_component_p (*base))
881 base = &TREE_OPERAND (*base, 0);
882 if (TREE_CODE (*base) == INDIRECT_REF
883 && TREE_CODE (TREE_OPERAND (*base, 0)) == SSA_NAME)
884 {
885 prop_value_t *val = get_value (TREE_OPERAND (*base, 0));
886 if (val->lattice_val == CONSTANT
887 && TREE_CODE (val->value) == ADDR_EXPR
fb8ed03f 888 && may_propagate_address_into_dereference
889 (val->value, *base))
75a70cf9 890 {
891 /* We need to return a new tree, not modify the IL
892 or share parts of it. So play some tricks to
893 avoid manually building it. */
894 tree ret, save = *base;
895 *base = TREE_OPERAND (val->value, 0);
896 ret = unshare_expr (rhs);
897 recompute_tree_invariant_for_addr_expr (ret);
898 *base = save;
899 return ret;
900 }
901 }
902 }
388a0bc7 903 else if (TREE_CODE (rhs) == CONSTRUCTOR
904 && TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE
905 && (CONSTRUCTOR_NELTS (rhs)
906 == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs))))
907 {
908 unsigned i;
909 tree val, list;
910
911 list = NULL_TREE;
912 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
913 {
914 if (TREE_CODE (val) == SSA_NAME
915 && get_value (val)->lattice_val == CONSTANT)
916 val = get_value (val)->value;
917 if (TREE_CODE (val) == INTEGER_CST
918 || TREE_CODE (val) == REAL_CST
919 || TREE_CODE (val) == FIXED_CST)
920 list = tree_cons (NULL_TREE, val, list);
921 else
922 return NULL_TREE;
923 }
924
925 return build_vector (TREE_TYPE (rhs), nreverse (list));
926 }
4ee9c684 927
75a70cf9 928 if (kind == tcc_reference)
3e4be816 929 {
0fefde02 930 if ((TREE_CODE (rhs) == VIEW_CONVERT_EXPR
931 || TREE_CODE (rhs) == REALPART_EXPR
932 || TREE_CODE (rhs) == IMAGPART_EXPR)
3e4be816 933 && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
934 {
935 prop_value_t *val = get_value (TREE_OPERAND (rhs, 0));
936 if (val->lattice_val == CONSTANT)
389dd41b 937 return fold_unary_loc (EXPR_LOCATION (rhs),
938 TREE_CODE (rhs),
3e4be816 939 TREE_TYPE (rhs), val->value);
940 }
8edeb88b 941 else if (TREE_CODE (rhs) == INDIRECT_REF
942 && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
943 {
944 prop_value_t *val = get_value (TREE_OPERAND (rhs, 0));
945 if (val->lattice_val == CONSTANT
946 && TREE_CODE (val->value) == ADDR_EXPR
947 && useless_type_conversion_p (TREE_TYPE (rhs),
948 TREE_TYPE (TREE_TYPE (val->value))))
949 rhs = TREE_OPERAND (val->value, 0);
950 }
3e4be816 951 return fold_const_aggregate_ref (rhs);
952 }
75a70cf9 953 else if (kind == tcc_declaration)
954 return get_symbol_constant_value (rhs);
955 return rhs;
956 }
48e1416a 957
75a70cf9 958 case GIMPLE_UNARY_RHS:
959 {
960 /* Handle unary operators that can appear in GIMPLE form.
961 Note that we know the single operand must be a constant,
962 so this should almost always return a simplified RHS. */
963 tree lhs = gimple_assign_lhs (stmt);
964 tree op0 = gimple_assign_rhs1 (stmt);
965
966 /* Simplify the operand down to a constant. */
967 if (TREE_CODE (op0) == SSA_NAME)
968 {
969 prop_value_t *val = get_value (op0);
970 if (val->lattice_val == CONSTANT)
971 op0 = get_value (op0)->value;
972 }
973
974 /* Conversions are useless for CCP purposes if they are
975 value-preserving. Thus the restrictions that
976 useless_type_conversion_p places for pointer type conversions
977 do not apply here. Substitution later will only substitute to
978 allowed places. */
d9659041 979 if (CONVERT_EXPR_CODE_P (subcode)
5768aeb3 980 && POINTER_TYPE_P (TREE_TYPE (lhs))
981 && POINTER_TYPE_P (TREE_TYPE (op0))
982 /* Do not allow differences in volatile qualification
983 as this might get us confused as to whether a
984 propagation destination statement is volatile
985 or not. See PR36988. */
986 && (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (lhs)))
987 == TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (op0)))))
988 {
989 tree tem;
990 /* Still try to generate a constant of correct type. */
991 if (!useless_type_conversion_p (TREE_TYPE (lhs),
992 TREE_TYPE (op0))
993 && ((tem = maybe_fold_offset_to_address
389dd41b 994 (loc,
e60a6f7b 995 op0, integer_zero_node, TREE_TYPE (lhs)))
5768aeb3 996 != NULL_TREE))
997 return tem;
998 return op0;
999 }
75a70cf9 1000
48e1416a 1001 return
389dd41b 1002 fold_unary_ignore_overflow_loc (loc, subcode,
1003 gimple_expr_type (stmt), op0);
f1fb2997 1004 }
75a70cf9 1005
1006 case GIMPLE_BINARY_RHS:
1007 {
1008 /* Handle binary operators that can appear in GIMPLE form. */
1009 tree op0 = gimple_assign_rhs1 (stmt);
1010 tree op1 = gimple_assign_rhs2 (stmt);
1011
1012 /* Simplify the operands down to constants when appropriate. */
1013 if (TREE_CODE (op0) == SSA_NAME)
1014 {
1015 prop_value_t *val = get_value (op0);
1016 if (val->lattice_val == CONSTANT)
1017 op0 = val->value;
1018 }
1019
1020 if (TREE_CODE (op1) == SSA_NAME)
1021 {
1022 prop_value_t *val = get_value (op1);
1023 if (val->lattice_val == CONSTANT)
1024 op1 = val->value;
1025 }
1026
5768aeb3 1027 /* Fold &foo + CST into an invariant reference if possible. */
1028 if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
1029 && TREE_CODE (op0) == ADDR_EXPR
1030 && TREE_CODE (op1) == INTEGER_CST)
1031 {
e60a6f7b 1032 tree tem = maybe_fold_offset_to_address
4c0d4e21 1033 (loc, op0, op1, TREE_TYPE (op0));
5768aeb3 1034 if (tem != NULL_TREE)
1035 return tem;
1036 }
1037
389dd41b 1038 return fold_binary_loc (loc, subcode,
1039 gimple_expr_type (stmt), op0, op1);
75a70cf9 1040 }
1041
1042 default:
1043 gcc_unreachable ();
1044 }
1045 }
1046 break;
4ee9c684 1047
75a70cf9 1048 case GIMPLE_CALL:
f257af64 1049 {
1050 tree fn = gimple_call_fn (stmt);
1051 prop_value_t *val;
1052
1053 if (TREE_CODE (fn) == SSA_NAME)
1054 {
1055 val = get_value (fn);
1056 if (val->lattice_val == CONSTANT)
1057 fn = val->value;
1058 }
1059 if (TREE_CODE (fn) == ADDR_EXPR
8ef4f124 1060 && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL
f257af64 1061 && DECL_BUILT_IN (TREE_OPERAND (fn, 0)))
1062 {
1063 tree *args = XALLOCAVEC (tree, gimple_call_num_args (stmt));
1064 tree call, retval;
1065 unsigned i;
1066 for (i = 0; i < gimple_call_num_args (stmt); ++i)
1067 {
1068 args[i] = gimple_call_arg (stmt, i);
1069 if (TREE_CODE (args[i]) == SSA_NAME)
1070 {
1071 val = get_value (args[i]);
1072 if (val->lattice_val == CONSTANT)
1073 args[i] = val->value;
1074 }
1075 }
389dd41b 1076 call = build_call_array_loc (loc,
1077 gimple_call_return_type (stmt),
1078 fn, gimple_call_num_args (stmt), args);
1079 retval = fold_call_expr (EXPR_LOCATION (call), call, false);
f257af64 1080 if (retval)
1081 /* fold_call_expr wraps the result inside a NOP_EXPR. */
1082 STRIP_NOPS (retval);
1083 return retval;
1084 }
1085 return NULL_TREE;
1086 }
4ee9c684 1087
75a70cf9 1088 case GIMPLE_COND:
1089 {
1090 /* Handle comparison operators that can appear in GIMPLE form. */
1091 tree op0 = gimple_cond_lhs (stmt);
1092 tree op1 = gimple_cond_rhs (stmt);
1093 enum tree_code code = gimple_cond_code (stmt);
1094
1095 /* Simplify the operands down to constants when appropriate. */
1096 if (TREE_CODE (op0) == SSA_NAME)
1097 {
1098 prop_value_t *val = get_value (op0);
1099 if (val->lattice_val == CONSTANT)
1100 op0 = val->value;
1101 }
1102
1103 if (TREE_CODE (op1) == SSA_NAME)
1104 {
1105 prop_value_t *val = get_value (op1);
1106 if (val->lattice_val == CONSTANT)
1107 op1 = val->value;
1108 }
1109
389dd41b 1110 return fold_binary_loc (loc, code, boolean_type_node, op0, op1);
75a70cf9 1111 }
4ee9c684 1112
75a70cf9 1113 case GIMPLE_SWITCH:
1114 {
1115 tree rhs = gimple_switch_index (stmt);
04236c3a 1116
75a70cf9 1117 if (TREE_CODE (rhs) == SSA_NAME)
1118 {
1119 /* If the RHS is an SSA_NAME, return its known constant value,
1120 if any. */
1121 return get_value (rhs)->value;
1122 }
04236c3a 1123
75a70cf9 1124 return rhs;
1125 }
912f109f 1126
75a70cf9 1127 default:
1128 gcc_unreachable ();
4ee9c684 1129 }
4ee9c684 1130}
1131
1132
8782adcf 1133/* Return the tree representing the element referenced by T if T is an
1134 ARRAY_REF or COMPONENT_REF into constant aggregates. Return
1135 NULL_TREE otherwise. */
1136
e004838d 1137tree
8782adcf 1138fold_const_aggregate_ref (tree t)
1139{
1140 prop_value_t *value;
c75b4594 1141 tree base, ctor, idx, field;
1142 unsigned HOST_WIDE_INT cnt;
1143 tree cfield, cval;
8782adcf 1144
8edeb88b 1145 if (TREE_CODE_CLASS (TREE_CODE (t)) == tcc_declaration)
1146 return get_symbol_constant_value (t);
1147
8782adcf 1148 switch (TREE_CODE (t))
1149 {
1150 case ARRAY_REF:
1151 /* Get a CONSTRUCTOR. If BASE is a VAR_DECL, get its
1152 DECL_INITIAL. If BASE is a nested reference into another
1153 ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1154 the inner reference. */
1155 base = TREE_OPERAND (t, 0);
1156 switch (TREE_CODE (base))
1157 {
1158 case VAR_DECL:
1159 if (!TREE_READONLY (base)
1160 || TREE_CODE (TREE_TYPE (base)) != ARRAY_TYPE
1161 || !targetm.binds_local_p (base))
1162 return NULL_TREE;
1163
1164 ctor = DECL_INITIAL (base);
1165 break;
1166
1167 case ARRAY_REF:
1168 case COMPONENT_REF:
1169 ctor = fold_const_aggregate_ref (base);
1170 break;
1171
04236c3a 1172 case STRING_CST:
1173 case CONSTRUCTOR:
1174 ctor = base;
1175 break;
1176
8782adcf 1177 default:
1178 return NULL_TREE;
1179 }
1180
1181 if (ctor == NULL_TREE
4f61cce6 1182 || (TREE_CODE (ctor) != CONSTRUCTOR
1183 && TREE_CODE (ctor) != STRING_CST)
8782adcf 1184 || !TREE_STATIC (ctor))
1185 return NULL_TREE;
1186
1187 /* Get the index. If we have an SSA_NAME, try to resolve it
1188 with the current lattice value for the SSA_NAME. */
1189 idx = TREE_OPERAND (t, 1);
1190 switch (TREE_CODE (idx))
1191 {
1192 case SSA_NAME:
bfa30570 1193 if ((value = get_value (idx))
8782adcf 1194 && value->lattice_val == CONSTANT
1195 && TREE_CODE (value->value) == INTEGER_CST)
1196 idx = value->value;
1197 else
1198 return NULL_TREE;
1199 break;
1200
1201 case INTEGER_CST:
1202 break;
1203
1204 default:
1205 return NULL_TREE;
1206 }
1207
4f61cce6 1208 /* Fold read from constant string. */
1209 if (TREE_CODE (ctor) == STRING_CST)
1210 {
1211 if ((TYPE_MODE (TREE_TYPE (t))
1212 == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1213 && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
1214 == MODE_INT)
1215 && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1
1216 && compare_tree_int (idx, TREE_STRING_LENGTH (ctor)) < 0)
7b050b7b 1217 return build_int_cst_type (TREE_TYPE (t),
1218 (TREE_STRING_POINTER (ctor)
1219 [TREE_INT_CST_LOW (idx)]));
4f61cce6 1220 return NULL_TREE;
1221 }
1222
8782adcf 1223 /* Whoo-hoo! I'll fold ya baby. Yeah! */
c75b4594 1224 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1225 if (tree_int_cst_equal (cfield, idx))
590d65aa 1226 {
6872bf3c 1227 STRIP_NOPS (cval);
3a44a278 1228 if (TREE_CODE (cval) == ADDR_EXPR)
1229 {
1230 tree base = get_base_address (TREE_OPERAND (cval, 0));
1231 if (base && TREE_CODE (base) == VAR_DECL)
1232 add_referenced_var (base);
1233 }
590d65aa 1234 return cval;
1235 }
8782adcf 1236 break;
1237
1238 case COMPONENT_REF:
1239 /* Get a CONSTRUCTOR. If BASE is a VAR_DECL, get its
1240 DECL_INITIAL. If BASE is a nested reference into another
1241 ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
1242 the inner reference. */
1243 base = TREE_OPERAND (t, 0);
1244 switch (TREE_CODE (base))
1245 {
1246 case VAR_DECL:
1247 if (!TREE_READONLY (base)
1248 || TREE_CODE (TREE_TYPE (base)) != RECORD_TYPE
1249 || !targetm.binds_local_p (base))
1250 return NULL_TREE;
1251
1252 ctor = DECL_INITIAL (base);
1253 break;
1254
1255 case ARRAY_REF:
1256 case COMPONENT_REF:
1257 ctor = fold_const_aggregate_ref (base);
1258 break;
1259
1260 default:
1261 return NULL_TREE;
1262 }
1263
1264 if (ctor == NULL_TREE
1265 || TREE_CODE (ctor) != CONSTRUCTOR
1266 || !TREE_STATIC (ctor))
1267 return NULL_TREE;
1268
1269 field = TREE_OPERAND (t, 1);
1270
c75b4594 1271 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
1272 if (cfield == field
8782adcf 1273 /* FIXME: Handle bit-fields. */
c75b4594 1274 && ! DECL_BIT_FIELD (cfield))
590d65aa 1275 {
6872bf3c 1276 STRIP_NOPS (cval);
3a44a278 1277 if (TREE_CODE (cval) == ADDR_EXPR)
1278 {
1279 tree base = get_base_address (TREE_OPERAND (cval, 0));
1280 if (base && TREE_CODE (base) == VAR_DECL)
1281 add_referenced_var (base);
1282 }
590d65aa 1283 return cval;
1284 }
8782adcf 1285 break;
1286
908cb59d 1287 case REALPART_EXPR:
1288 case IMAGPART_EXPR:
1289 {
1290 tree c = fold_const_aggregate_ref (TREE_OPERAND (t, 0));
1291 if (c && TREE_CODE (c) == COMPLEX_CST)
389dd41b 1292 return fold_build1_loc (EXPR_LOCATION (t),
1293 TREE_CODE (t), TREE_TYPE (t), c);
908cb59d 1294 break;
1295 }
04236c3a 1296
1297 case INDIRECT_REF:
1298 {
1299 tree base = TREE_OPERAND (t, 0);
1300 if (TREE_CODE (base) == SSA_NAME
1301 && (value = get_value (base))
1302 && value->lattice_val == CONSTANT
65c463fd 1303 && TREE_CODE (value->value) == ADDR_EXPR
1304 && useless_type_conversion_p (TREE_TYPE (t),
1305 TREE_TYPE (TREE_TYPE (value->value))))
04236c3a 1306 return fold_const_aggregate_ref (TREE_OPERAND (value->value, 0));
1307 break;
1308 }
1309
8782adcf 1310 default:
1311 break;
1312 }
1313
1314 return NULL_TREE;
1315}
75a70cf9 1316
1317/* Evaluate statement STMT.
1318 Valid only for assignments, calls, conditionals, and switches. */
4ee9c684 1319
88dbf20f 1320static prop_value_t
75a70cf9 1321evaluate_stmt (gimple stmt)
4ee9c684 1322{
88dbf20f 1323 prop_value_t val;
4f61cce6 1324 tree simplified = NULL_TREE;
88dbf20f 1325 ccp_lattice_t likelyvalue = likely_value (stmt);
add6ee5e 1326 bool is_constant;
88dbf20f 1327
add6ee5e 1328 fold_defer_overflow_warnings ();
1329
4ee9c684 1330 /* If the statement is likely to have a CONSTANT result, then try
1331 to fold the statement to determine the constant value. */
75a70cf9 1332 /* FIXME. This is the only place that we call ccp_fold.
1333 Since likely_value never returns CONSTANT for calls, we will
1334 not attempt to fold them, including builtins that may profit. */
4ee9c684 1335 if (likelyvalue == CONSTANT)
1336 simplified = ccp_fold (stmt);
1337 /* If the statement is likely to have a VARYING result, then do not
1338 bother folding the statement. */
04236c3a 1339 else if (likelyvalue == VARYING)
75a70cf9 1340 {
590c3166 1341 enum gimple_code code = gimple_code (stmt);
75a70cf9 1342 if (code == GIMPLE_ASSIGN)
1343 {
1344 enum tree_code subcode = gimple_assign_rhs_code (stmt);
48e1416a 1345
75a70cf9 1346 /* Other cases cannot satisfy is_gimple_min_invariant
1347 without folding. */
1348 if (get_gimple_rhs_class (subcode) == GIMPLE_SINGLE_RHS)
1349 simplified = gimple_assign_rhs1 (stmt);
1350 }
1351 else if (code == GIMPLE_SWITCH)
1352 simplified = gimple_switch_index (stmt);
1353 else
a65c4d64 1354 /* These cannot satisfy is_gimple_min_invariant without folding. */
1355 gcc_assert (code == GIMPLE_CALL || code == GIMPLE_COND);
75a70cf9 1356 }
4ee9c684 1357
add6ee5e 1358 is_constant = simplified && is_gimple_min_invariant (simplified);
1359
1360 fold_undefer_overflow_warnings (is_constant, stmt, 0);
1361
912f109f 1362 if (dump_file && (dump_flags & TDF_DETAILS))
1363 {
1364 fprintf (dump_file, "which is likely ");
1365 switch (likelyvalue)
1366 {
1367 case CONSTANT:
1368 fprintf (dump_file, "CONSTANT");
1369 break;
1370 case UNDEFINED:
1371 fprintf (dump_file, "UNDEFINED");
1372 break;
1373 case VARYING:
1374 fprintf (dump_file, "VARYING");
1375 break;
1376 default:;
1377 }
1378 fprintf (dump_file, "\n");
1379 }
1380
add6ee5e 1381 if (is_constant)
4ee9c684 1382 {
1383 /* The statement produced a constant value. */
1384 val.lattice_val = CONSTANT;
88dbf20f 1385 val.value = simplified;
4ee9c684 1386 }
1387 else
1388 {
1389 /* The statement produced a nonconstant value. If the statement
88dbf20f 1390 had UNDEFINED operands, then the result of the statement
1391 should be UNDEFINED. Otherwise, the statement is VARYING. */
bfa30570 1392 if (likelyvalue == UNDEFINED)
b765fa12 1393 val.lattice_val = likelyvalue;
1394 else
1395 val.lattice_val = VARYING;
1396
88dbf20f 1397 val.value = NULL_TREE;
4ee9c684 1398 }
41511585 1399
1400 return val;
4ee9c684 1401}
1402
6688f8ec 1403/* Fold the stmt at *GSI with CCP specific information that propagating
1404 and regular folding does not catch. */
1405
1406static bool
1407ccp_fold_stmt (gimple_stmt_iterator *gsi)
1408{
1409 gimple stmt = gsi_stmt (*gsi);
6688f8ec 1410
94144e68 1411 switch (gimple_code (stmt))
1412 {
1413 case GIMPLE_COND:
1414 {
1415 prop_value_t val;
1416 /* Statement evaluation will handle type mismatches in constants
1417 more gracefully than the final propagation. This allows us to
1418 fold more conditionals here. */
1419 val = evaluate_stmt (stmt);
1420 if (val.lattice_val != CONSTANT
1421 || TREE_CODE (val.value) != INTEGER_CST)
1422 return false;
1423
1424 if (integer_zerop (val.value))
1425 gimple_cond_make_false (stmt);
1426 else
1427 gimple_cond_make_true (stmt);
6688f8ec 1428
94144e68 1429 return true;
1430 }
6688f8ec 1431
94144e68 1432 case GIMPLE_CALL:
1433 {
1434 tree lhs = gimple_call_lhs (stmt);
1435 prop_value_t *val;
1436 tree argt;
1437 bool changed = false;
1438 unsigned i;
1439
1440 /* If the call was folded into a constant make sure it goes
1441 away even if we cannot propagate into all uses because of
1442 type issues. */
1443 if (lhs
1444 && TREE_CODE (lhs) == SSA_NAME
1445 && (val = get_value (lhs))
1446 && val->lattice_val == CONSTANT)
1447 {
338cce8f 1448 tree new_rhs = unshare_expr (val->value);
1449 bool res;
94144e68 1450 if (!useless_type_conversion_p (TREE_TYPE (lhs),
1451 TREE_TYPE (new_rhs)))
1452 new_rhs = fold_convert (TREE_TYPE (lhs), new_rhs);
338cce8f 1453 res = update_call_from_tree (gsi, new_rhs);
1454 gcc_assert (res);
94144e68 1455 return true;
1456 }
1457
1458 /* Propagate into the call arguments. Compared to replace_uses_in
1459 this can use the argument slot types for type verification
1460 instead of the current argument type. We also can safely
1461 drop qualifiers here as we are dealing with constants anyway. */
1462 argt = TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (gimple_call_fn (stmt))));
1463 for (i = 0; i < gimple_call_num_args (stmt) && argt;
1464 ++i, argt = TREE_CHAIN (argt))
1465 {
1466 tree arg = gimple_call_arg (stmt, i);
1467 if (TREE_CODE (arg) == SSA_NAME
1468 && (val = get_value (arg))
1469 && val->lattice_val == CONSTANT
1470 && useless_type_conversion_p
1471 (TYPE_MAIN_VARIANT (TREE_VALUE (argt)),
1472 TYPE_MAIN_VARIANT (TREE_TYPE (val->value))))
1473 {
338cce8f 1474 gimple_call_set_arg (stmt, i, unshare_expr (val->value));
94144e68 1475 changed = true;
1476 }
1477 }
1478
1479 return changed;
1480 }
6688f8ec 1481
6872bf3c 1482 case GIMPLE_ASSIGN:
1483 {
1484 tree lhs = gimple_assign_lhs (stmt);
1485 prop_value_t *val;
1486
1487 /* If we have a load that turned out to be constant replace it
1488 as we cannot propagate into all uses in all cases. */
1489 if (gimple_assign_single_p (stmt)
1490 && TREE_CODE (lhs) == SSA_NAME
1491 && (val = get_value (lhs))
1492 && val->lattice_val == CONSTANT)
1493 {
1494 tree rhs = unshare_expr (val->value);
1495 if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
1496 rhs = fold_convert (TREE_TYPE (lhs), rhs);
1497 gimple_assign_set_rhs_from_tree (gsi, rhs);
1498 return true;
1499 }
1500
1501 return false;
1502 }
1503
94144e68 1504 default:
1505 return false;
1506 }
6688f8ec 1507}
1508
41511585 1509/* Visit the assignment statement STMT. Set the value of its LHS to the
88dbf20f 1510 value computed by the RHS and store LHS in *OUTPUT_P. If STMT
1511 creates virtual definitions, set the value of each new name to that
75a70cf9 1512 of the RHS (if we can derive a constant out of the RHS).
1513 Value-returning call statements also perform an assignment, and
1514 are handled here. */
4ee9c684 1515
41511585 1516static enum ssa_prop_result
75a70cf9 1517visit_assignment (gimple stmt, tree *output_p)
4ee9c684 1518{
88dbf20f 1519 prop_value_t val;
88dbf20f 1520 enum ssa_prop_result retval;
4ee9c684 1521
75a70cf9 1522 tree lhs = gimple_get_lhs (stmt);
4ee9c684 1523
75a70cf9 1524 gcc_assert (gimple_code (stmt) != GIMPLE_CALL
1525 || gimple_call_lhs (stmt) != NULL_TREE);
1526
1527 if (gimple_assign_copy_p (stmt))
41511585 1528 {
75a70cf9 1529 tree rhs = gimple_assign_rhs1 (stmt);
88dbf20f 1530
75a70cf9 1531 if (TREE_CODE (rhs) == SSA_NAME)
1532 {
1533 /* For a simple copy operation, we copy the lattice values. */
1534 prop_value_t *nval = get_value (rhs);
1535 val = *nval;
1536 }
88dbf20f 1537 else
75a70cf9 1538 val = evaluate_stmt (stmt);
41511585 1539 }
1540 else
75a70cf9 1541 /* Evaluate the statement, which could be
1542 either a GIMPLE_ASSIGN or a GIMPLE_CALL. */
04236c3a 1543 val = evaluate_stmt (stmt);
4ee9c684 1544
88dbf20f 1545 retval = SSA_PROP_NOT_INTERESTING;
4ee9c684 1546
41511585 1547 /* Set the lattice value of the statement's output. */
88dbf20f 1548 if (TREE_CODE (lhs) == SSA_NAME)
4ee9c684 1549 {
88dbf20f 1550 /* If STMT is an assignment to an SSA_NAME, we only have one
1551 value to set. */
1552 if (set_lattice_value (lhs, val))
1553 {
1554 *output_p = lhs;
1555 if (val.lattice_val == VARYING)
1556 retval = SSA_PROP_VARYING;
1557 else
1558 retval = SSA_PROP_INTERESTING;
1559 }
4ee9c684 1560 }
88dbf20f 1561
1562 return retval;
4ee9c684 1563}
1564
4ee9c684 1565
41511585 1566/* Visit the conditional statement STMT. Return SSA_PROP_INTERESTING
1567 if it can determine which edge will be taken. Otherwise, return
1568 SSA_PROP_VARYING. */
1569
1570static enum ssa_prop_result
75a70cf9 1571visit_cond_stmt (gimple stmt, edge *taken_edge_p)
4ee9c684 1572{
88dbf20f 1573 prop_value_t val;
41511585 1574 basic_block block;
1575
75a70cf9 1576 block = gimple_bb (stmt);
41511585 1577 val = evaluate_stmt (stmt);
1578
1579 /* Find which edge out of the conditional block will be taken and add it
1580 to the worklist. If no single edge can be determined statically,
1581 return SSA_PROP_VARYING to feed all the outgoing edges to the
1582 propagation engine. */
88dbf20f 1583 *taken_edge_p = val.value ? find_taken_edge (block, val.value) : 0;
41511585 1584 if (*taken_edge_p)
1585 return SSA_PROP_INTERESTING;
1586 else
1587 return SSA_PROP_VARYING;
4ee9c684 1588}
1589
4ee9c684 1590
41511585 1591/* Evaluate statement STMT. If the statement produces an output value and
1592 its evaluation changes the lattice value of its output, return
1593 SSA_PROP_INTERESTING and set *OUTPUT_P to the SSA_NAME holding the
1594 output value.
48e1416a 1595
41511585 1596 If STMT is a conditional branch and we can determine its truth
1597 value, set *TAKEN_EDGE_P accordingly. If STMT produces a varying
1598 value, return SSA_PROP_VARYING. */
4ee9c684 1599
41511585 1600static enum ssa_prop_result
75a70cf9 1601ccp_visit_stmt (gimple stmt, edge *taken_edge_p, tree *output_p)
41511585 1602{
41511585 1603 tree def;
1604 ssa_op_iter iter;
4ee9c684 1605
41511585 1606 if (dump_file && (dump_flags & TDF_DETAILS))
4ee9c684 1607 {
88dbf20f 1608 fprintf (dump_file, "\nVisiting statement:\n");
75a70cf9 1609 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
4ee9c684 1610 }
4ee9c684 1611
75a70cf9 1612 switch (gimple_code (stmt))
4ee9c684 1613 {
75a70cf9 1614 case GIMPLE_ASSIGN:
1615 /* If the statement is an assignment that produces a single
1616 output value, evaluate its RHS to see if the lattice value of
1617 its output has changed. */
1618 return visit_assignment (stmt, output_p);
1619
1620 case GIMPLE_CALL:
1621 /* A value-returning call also performs an assignment. */
1622 if (gimple_call_lhs (stmt) != NULL_TREE)
1623 return visit_assignment (stmt, output_p);
1624 break;
1625
1626 case GIMPLE_COND:
1627 case GIMPLE_SWITCH:
1628 /* If STMT is a conditional branch, see if we can determine
1629 which branch will be taken. */
1630 /* FIXME. It appears that we should be able to optimize
1631 computed GOTOs here as well. */
1632 return visit_cond_stmt (stmt, taken_edge_p);
1633
1634 default:
1635 break;
4ee9c684 1636 }
4ee9c684 1637
41511585 1638 /* Any other kind of statement is not interesting for constant
1639 propagation and, therefore, not worth simulating. */
41511585 1640 if (dump_file && (dump_flags & TDF_DETAILS))
1641 fprintf (dump_file, "No interesting values produced. Marked VARYING.\n");
4ee9c684 1642
41511585 1643 /* Definitions made by statements other than assignments to
1644 SSA_NAMEs represent unknown modifications to their outputs.
1645 Mark them VARYING. */
88dbf20f 1646 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
1647 {
61207d43 1648 prop_value_t v = { VARYING, NULL_TREE };
88dbf20f 1649 set_lattice_value (def, v);
1650 }
4ee9c684 1651
41511585 1652 return SSA_PROP_VARYING;
1653}
4ee9c684 1654
4ee9c684 1655
88dbf20f 1656/* Main entry point for SSA Conditional Constant Propagation. */
41511585 1657
33a34f1e 1658static unsigned int
61207d43 1659do_ssa_ccp (void)
41511585 1660{
1661 ccp_initialize ();
1662 ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node);
33a34f1e 1663 if (ccp_finalize ())
eb9161e7 1664 return (TODO_cleanup_cfg | TODO_update_ssa | TODO_remove_unused_locals);
33a34f1e 1665 else
1666 return 0;
4ee9c684 1667}
1668
5664499b 1669
1670static bool
41511585 1671gate_ccp (void)
5664499b 1672{
41511585 1673 return flag_tree_ccp != 0;
5664499b 1674}
1675
4ee9c684 1676
48e1416a 1677struct gimple_opt_pass pass_ccp =
41511585 1678{
20099e35 1679 {
1680 GIMPLE_PASS,
41511585 1681 "ccp", /* name */
1682 gate_ccp, /* gate */
88dbf20f 1683 do_ssa_ccp, /* execute */
41511585 1684 NULL, /* sub */
1685 NULL, /* next */
1686 0, /* static_pass_number */
1687 TV_TREE_CCP, /* tv_id */
49290934 1688 PROP_cfg | PROP_ssa, /* properties_required */
41511585 1689 0, /* properties_provided */
b6246c40 1690 0, /* properties_destroyed */
41511585 1691 0, /* todo_flags_start */
33a34f1e 1692 TODO_dump_func | TODO_verify_ssa
20099e35 1693 | TODO_verify_stmts | TODO_ggc_collect/* todo_flags_finish */
1694 }
41511585 1695};
4ee9c684 1696
4ee9c684 1697
75a70cf9 1698
bdd0e199 1699/* Try to optimize out __builtin_stack_restore. Optimize it out
1700 if there is another __builtin_stack_restore in the same basic
1701 block and no calls or ASM_EXPRs are in between, or if this block's
1702 only outgoing edge is to EXIT_BLOCK and there are no calls or
1703 ASM_EXPRs after this __builtin_stack_restore. */
1704
1705static tree
75a70cf9 1706optimize_stack_restore (gimple_stmt_iterator i)
bdd0e199 1707{
6ea999da 1708 tree callee;
1709 gimple stmt;
75a70cf9 1710
1711 basic_block bb = gsi_bb (i);
1712 gimple call = gsi_stmt (i);
bdd0e199 1713
75a70cf9 1714 if (gimple_code (call) != GIMPLE_CALL
1715 || gimple_call_num_args (call) != 1
1716 || TREE_CODE (gimple_call_arg (call, 0)) != SSA_NAME
1717 || !POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (call, 0))))
bdd0e199 1718 return NULL_TREE;
1719
75a70cf9 1720 for (gsi_next (&i); !gsi_end_p (i); gsi_next (&i))
bdd0e199 1721 {
75a70cf9 1722 stmt = gsi_stmt (i);
1723 if (gimple_code (stmt) == GIMPLE_ASM)
bdd0e199 1724 return NULL_TREE;
75a70cf9 1725 if (gimple_code (stmt) != GIMPLE_CALL)
bdd0e199 1726 continue;
1727
75a70cf9 1728 callee = gimple_call_fndecl (stmt);
c40a6f90 1729 if (!callee
1730 || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
1731 /* All regular builtins are ok, just obviously not alloca. */
1732 || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA)
bdd0e199 1733 return NULL_TREE;
1734
1735 if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)
6ea999da 1736 goto second_stack_restore;
bdd0e199 1737 }
1738
6ea999da 1739 if (!gsi_end_p (i))
bdd0e199 1740 return NULL_TREE;
1741
6ea999da 1742 /* Allow one successor of the exit block, or zero successors. */
1743 switch (EDGE_COUNT (bb->succs))
1744 {
1745 case 0:
1746 break;
1747 case 1:
1748 if (single_succ_edge (bb)->dest != EXIT_BLOCK_PTR)
1749 return NULL_TREE;
1750 break;
1751 default:
1752 return NULL_TREE;
1753 }
1754 second_stack_restore:
bdd0e199 1755
6ea999da 1756 /* If there's exactly one use, then zap the call to __builtin_stack_save.
1757 If there are multiple uses, then the last one should remove the call.
1758 In any case, whether the call to __builtin_stack_save can be removed
1759 or not is irrelevant to removing the call to __builtin_stack_restore. */
1760 if (has_single_use (gimple_call_arg (call, 0)))
1761 {
1762 gimple stack_save = SSA_NAME_DEF_STMT (gimple_call_arg (call, 0));
1763 if (is_gimple_call (stack_save))
1764 {
1765 callee = gimple_call_fndecl (stack_save);
1766 if (callee
1767 && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
1768 && DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_SAVE)
1769 {
1770 gimple_stmt_iterator stack_save_gsi;
1771 tree rhs;
bdd0e199 1772
6ea999da 1773 stack_save_gsi = gsi_for_stmt (stack_save);
1774 rhs = build_int_cst (TREE_TYPE (gimple_call_arg (call, 0)), 0);
1775 update_call_from_tree (&stack_save_gsi, rhs);
1776 }
1777 }
1778 }
bdd0e199 1779
75a70cf9 1780 /* No effect, so the statement will be deleted. */
bdd0e199 1781 return integer_zero_node;
1782}
75a70cf9 1783
8a58ed0a 1784/* If va_list type is a simple pointer and nothing special is needed,
1785 optimize __builtin_va_start (&ap, 0) into ap = __builtin_next_arg (0),
1786 __builtin_va_end (&ap) out as NOP and __builtin_va_copy into a simple
1787 pointer assignment. */
1788
1789static tree
75a70cf9 1790optimize_stdarg_builtin (gimple call)
8a58ed0a 1791{
5f57a8b1 1792 tree callee, lhs, rhs, cfun_va_list;
8a58ed0a 1793 bool va_list_simple_ptr;
389dd41b 1794 location_t loc = gimple_location (call);
8a58ed0a 1795
75a70cf9 1796 if (gimple_code (call) != GIMPLE_CALL)
8a58ed0a 1797 return NULL_TREE;
1798
75a70cf9 1799 callee = gimple_call_fndecl (call);
5f57a8b1 1800
1801 cfun_va_list = targetm.fn_abi_va_list (callee);
1802 va_list_simple_ptr = POINTER_TYPE_P (cfun_va_list)
1803 && (TREE_TYPE (cfun_va_list) == void_type_node
1804 || TREE_TYPE (cfun_va_list) == char_type_node);
1805
8a58ed0a 1806 switch (DECL_FUNCTION_CODE (callee))
1807 {
1808 case BUILT_IN_VA_START:
1809 if (!va_list_simple_ptr
1810 || targetm.expand_builtin_va_start != NULL
75a70cf9 1811 || built_in_decls[BUILT_IN_NEXT_ARG] == NULL)
8a58ed0a 1812 return NULL_TREE;
1813
75a70cf9 1814 if (gimple_call_num_args (call) != 2)
8a58ed0a 1815 return NULL_TREE;
1816
75a70cf9 1817 lhs = gimple_call_arg (call, 0);
8a58ed0a 1818 if (!POINTER_TYPE_P (TREE_TYPE (lhs))
1819 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
5f57a8b1 1820 != TYPE_MAIN_VARIANT (cfun_va_list))
8a58ed0a 1821 return NULL_TREE;
48e1416a 1822
389dd41b 1823 lhs = build_fold_indirect_ref_loc (loc, lhs);
1824 rhs = build_call_expr_loc (loc, built_in_decls[BUILT_IN_NEXT_ARG],
75a70cf9 1825 1, integer_zero_node);
389dd41b 1826 rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
8a58ed0a 1827 return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
1828
1829 case BUILT_IN_VA_COPY:
1830 if (!va_list_simple_ptr)
1831 return NULL_TREE;
1832
75a70cf9 1833 if (gimple_call_num_args (call) != 2)
8a58ed0a 1834 return NULL_TREE;
1835
75a70cf9 1836 lhs = gimple_call_arg (call, 0);
8a58ed0a 1837 if (!POINTER_TYPE_P (TREE_TYPE (lhs))
1838 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
5f57a8b1 1839 != TYPE_MAIN_VARIANT (cfun_va_list))
8a58ed0a 1840 return NULL_TREE;
1841
389dd41b 1842 lhs = build_fold_indirect_ref_loc (loc, lhs);
75a70cf9 1843 rhs = gimple_call_arg (call, 1);
8a58ed0a 1844 if (TYPE_MAIN_VARIANT (TREE_TYPE (rhs))
5f57a8b1 1845 != TYPE_MAIN_VARIANT (cfun_va_list))
8a58ed0a 1846 return NULL_TREE;
1847
389dd41b 1848 rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
8a58ed0a 1849 return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
1850
1851 case BUILT_IN_VA_END:
75a70cf9 1852 /* No effect, so the statement will be deleted. */
8a58ed0a 1853 return integer_zero_node;
1854
1855 default:
1856 gcc_unreachable ();
1857 }
1858}
75a70cf9 1859
4ee9c684 1860/* A simple pass that attempts to fold all builtin functions. This pass
1861 is run after we've propagated as many constants as we can. */
1862
2a1990e9 1863static unsigned int
4ee9c684 1864execute_fold_all_builtins (void)
1865{
b36237eb 1866 bool cfg_changed = false;
4ee9c684 1867 basic_block bb;
b1b7c0c4 1868 unsigned int todoflags = 0;
48e1416a 1869
4ee9c684 1870 FOR_EACH_BB (bb)
1871 {
75a70cf9 1872 gimple_stmt_iterator i;
1873 for (i = gsi_start_bb (bb); !gsi_end_p (i); )
4ee9c684 1874 {
75a70cf9 1875 gimple stmt, old_stmt;
4ee9c684 1876 tree callee, result;
0a39fd54 1877 enum built_in_function fcode;
4ee9c684 1878
75a70cf9 1879 stmt = gsi_stmt (i);
1880
1881 if (gimple_code (stmt) != GIMPLE_CALL)
0a39fd54 1882 {
75a70cf9 1883 gsi_next (&i);
0a39fd54 1884 continue;
1885 }
75a70cf9 1886 callee = gimple_call_fndecl (stmt);
4ee9c684 1887 if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
0a39fd54 1888 {
75a70cf9 1889 gsi_next (&i);
0a39fd54 1890 continue;
1891 }
1892 fcode = DECL_FUNCTION_CODE (callee);
4ee9c684 1893
2d18b16d 1894 result = gimple_fold_builtin (stmt);
5a4b7e1e 1895
1896 if (result)
75a70cf9 1897 gimple_remove_stmt_histograms (cfun, stmt);
5a4b7e1e 1898
4ee9c684 1899 if (!result)
1900 switch (DECL_FUNCTION_CODE (callee))
1901 {
1902 case BUILT_IN_CONSTANT_P:
1903 /* Resolve __builtin_constant_p. If it hasn't been
1904 folded to integer_one_node by now, it's fairly
1905 certain that the value simply isn't constant. */
75a70cf9 1906 result = integer_zero_node;
4ee9c684 1907 break;
1908
bdd0e199 1909 case BUILT_IN_STACK_RESTORE:
75a70cf9 1910 result = optimize_stack_restore (i);
8a58ed0a 1911 if (result)
1912 break;
75a70cf9 1913 gsi_next (&i);
8a58ed0a 1914 continue;
1915
1916 case BUILT_IN_VA_START:
1917 case BUILT_IN_VA_END:
1918 case BUILT_IN_VA_COPY:
1919 /* These shouldn't be folded before pass_stdarg. */
75a70cf9 1920 result = optimize_stdarg_builtin (stmt);
bdd0e199 1921 if (result)
1922 break;
1923 /* FALLTHRU */
1924
4ee9c684 1925 default:
75a70cf9 1926 gsi_next (&i);
4ee9c684 1927 continue;
1928 }
1929
1930 if (dump_file && (dump_flags & TDF_DETAILS))
1931 {
1932 fprintf (dump_file, "Simplified\n ");
75a70cf9 1933 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
4ee9c684 1934 }
1935
75a70cf9 1936 old_stmt = stmt;
75a70cf9 1937 if (!update_call_from_tree (&i, result))
0fefde02 1938 {
1939 gimplify_and_update_call_from_tree (&i, result);
1940 todoflags |= TODO_update_address_taken;
1941 }
de6ed584 1942
75a70cf9 1943 stmt = gsi_stmt (i);
4c5fd53c 1944 update_stmt (stmt);
de6ed584 1945
75a70cf9 1946 if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt)
1947 && gimple_purge_dead_eh_edges (bb))
b36237eb 1948 cfg_changed = true;
4ee9c684 1949
1950 if (dump_file && (dump_flags & TDF_DETAILS))
1951 {
1952 fprintf (dump_file, "to\n ");
75a70cf9 1953 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
4ee9c684 1954 fprintf (dump_file, "\n");
1955 }
0a39fd54 1956
1957 /* Retry the same statement if it changed into another
1958 builtin, there might be new opportunities now. */
75a70cf9 1959 if (gimple_code (stmt) != GIMPLE_CALL)
0a39fd54 1960 {
75a70cf9 1961 gsi_next (&i);
0a39fd54 1962 continue;
1963 }
75a70cf9 1964 callee = gimple_call_fndecl (stmt);
0a39fd54 1965 if (!callee
75a70cf9 1966 || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
0a39fd54 1967 || DECL_FUNCTION_CODE (callee) == fcode)
75a70cf9 1968 gsi_next (&i);
4ee9c684 1969 }
1970 }
48e1416a 1971
b36237eb 1972 /* Delete unreachable blocks. */
b1b7c0c4 1973 if (cfg_changed)
1974 todoflags |= TODO_cleanup_cfg;
48e1416a 1975
b1b7c0c4 1976 return todoflags;
4ee9c684 1977}
1978
41511585 1979
48e1416a 1980struct gimple_opt_pass pass_fold_builtins =
4ee9c684 1981{
20099e35 1982 {
1983 GIMPLE_PASS,
4ee9c684 1984 "fab", /* name */
1985 NULL, /* gate */
1986 execute_fold_all_builtins, /* execute */
1987 NULL, /* sub */
1988 NULL, /* next */
1989 0, /* static_pass_number */
0b1615c1 1990 TV_NONE, /* tv_id */
49290934 1991 PROP_cfg | PROP_ssa, /* properties_required */
4ee9c684 1992 0, /* properties_provided */
1993 0, /* properties_destroyed */
1994 0, /* todo_flags_start */
909e5ecb 1995 TODO_dump_func
1996 | TODO_verify_ssa
20099e35 1997 | TODO_update_ssa /* todo_flags_finish */
1998 }
4ee9c684 1999};