]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa-ccp.c
* include/std/future (atomic_future): Remove declaration of
[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,
3064bb7b 3 2010, 2011, 2012 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
4ee9c684 102 References:
103
104 Constant propagation with conditional branches,
105 Wegman and Zadeck, ACM TOPLAS 13(2):181-210.
106
107 Building an Optimizing Compiler,
108 Robert Morgan, Butterworth-Heinemann, 1998, Section 8.9.
109
110 Advanced Compiler Design and Implementation,
111 Steven Muchnick, Morgan Kaufmann, 1997, Section 12.6 */
112
113#include "config.h"
114#include "system.h"
115#include "coretypes.h"
116#include "tm.h"
4ee9c684 117#include "tree.h"
41511585 118#include "flags.h"
4ee9c684 119#include "tm_p.h"
4ee9c684 120#include "basic-block.h"
41511585 121#include "function.h"
ce084dfc 122#include "gimple-pretty-print.h"
41511585 123#include "tree-flow.h"
4ee9c684 124#include "tree-pass.h"
41511585 125#include "tree-ssa-propagate.h"
5a4b7e1e 126#include "value-prof.h"
41511585 127#include "langhooks.h"
8782adcf 128#include "target.h"
0b205f4c 129#include "diagnostic-core.h"
43fb76c1 130#include "dbgcnt.h"
1d0b727d 131#include "gimple-fold.h"
9a65cc0a 132#include "params.h"
2b15d2ba 133#include "hash-table.h"
4ee9c684 134
135
136/* Possible lattice values. */
137typedef enum
138{
bfa30570 139 UNINITIALIZED,
4ee9c684 140 UNDEFINED,
141 CONSTANT,
142 VARYING
88dbf20f 143} ccp_lattice_t;
4ee9c684 144
14f101cf 145struct prop_value_d {
146 /* Lattice value. */
147 ccp_lattice_t lattice_val;
148
149 /* Propagated value. */
150 tree value;
b7e55469 151
152 /* Mask that applies to the propagated value during CCP. For
153 X with a CONSTANT lattice value X & ~mask == value & ~mask. */
154 double_int mask;
14f101cf 155};
156
157typedef struct prop_value_d prop_value_t;
158
88dbf20f 159/* Array of propagated constant values. After propagation,
160 CONST_VAL[I].VALUE holds the constant value for SSA_NAME(I). If
161 the constant is held in an SSA name representing a memory store
4fb5e5ca 162 (i.e., a VDEF), CONST_VAL[I].MEM_REF will contain the actual
163 memory reference used to store (i.e., the LHS of the assignment
164 doing the store). */
20140406 165static prop_value_t *const_val;
4ee9c684 166
4af351a8 167static void canonicalize_float_value (prop_value_t *);
6688f8ec 168static bool ccp_fold_stmt (gimple_stmt_iterator *);
4af351a8 169
88dbf20f 170/* Dump constant propagation value VAL to file OUTF prefixed by PREFIX. */
01406fc0 171
172static void
88dbf20f 173dump_lattice_value (FILE *outf, const char *prefix, prop_value_t val)
01406fc0 174{
41511585 175 switch (val.lattice_val)
01406fc0 176 {
88dbf20f 177 case UNINITIALIZED:
178 fprintf (outf, "%sUNINITIALIZED", prefix);
179 break;
41511585 180 case UNDEFINED:
181 fprintf (outf, "%sUNDEFINED", prefix);
182 break;
183 case VARYING:
184 fprintf (outf, "%sVARYING", prefix);
185 break;
41511585 186 case CONSTANT:
187 fprintf (outf, "%sCONSTANT ", prefix);
b7e55469 188 if (TREE_CODE (val.value) != INTEGER_CST
cf8f0e63 189 || val.mask.is_zero ())
b7e55469 190 print_generic_expr (outf, val.value, dump_flags);
191 else
192 {
cf8f0e63 193 double_int cval = tree_to_double_int (val.value).and_not (val.mask);
b7e55469 194 fprintf (outf, "%sCONSTANT " HOST_WIDE_INT_PRINT_DOUBLE_HEX,
195 prefix, cval.high, cval.low);
196 fprintf (outf, " (" HOST_WIDE_INT_PRINT_DOUBLE_HEX ")",
197 val.mask.high, val.mask.low);
198 }
41511585 199 break;
200 default:
8c0963c4 201 gcc_unreachable ();
41511585 202 }
01406fc0 203}
4ee9c684 204
4ee9c684 205
88dbf20f 206/* Print lattice value VAL to stderr. */
207
208void debug_lattice_value (prop_value_t val);
209
4b987fac 210DEBUG_FUNCTION void
88dbf20f 211debug_lattice_value (prop_value_t val)
212{
213 dump_lattice_value (stderr, "", val);
214 fprintf (stderr, "\n");
215}
4ee9c684 216
4ee9c684 217
88dbf20f 218/* Compute a default value for variable VAR and store it in the
219 CONST_VAL array. The following rules are used to get default
220 values:
01406fc0 221
88dbf20f 222 1- Global and static variables that are declared constant are
223 considered CONSTANT.
224
225 2- Any other value is considered UNDEFINED. This is useful when
41511585 226 considering PHI nodes. PHI arguments that are undefined do not
227 change the constant value of the PHI node, which allows for more
88dbf20f 228 constants to be propagated.
4ee9c684 229
8883e700 230 3- Variables defined by statements other than assignments and PHI
88dbf20f 231 nodes are considered VARYING.
4ee9c684 232
8883e700 233 4- Initial values of variables that are not GIMPLE registers are
bfa30570 234 considered VARYING. */
4ee9c684 235
88dbf20f 236static prop_value_t
237get_default_value (tree var)
238{
b7e55469 239 prop_value_t val = { UNINITIALIZED, NULL_TREE, { 0, 0 } };
8edeb88b 240 gimple stmt;
241
242 stmt = SSA_NAME_DEF_STMT (var);
243
244 if (gimple_nop_p (stmt))
4ee9c684 245 {
8edeb88b 246 /* Variables defined by an empty statement are those used
247 before being initialized. If VAR is a local variable, we
248 can assume initially that it is UNDEFINED, otherwise we must
249 consider it VARYING. */
7c782c9b 250 if (!virtual_operand_p (var)
251 && TREE_CODE (SSA_NAME_VAR (var)) == VAR_DECL)
8edeb88b 252 val.lattice_val = UNDEFINED;
253 else
b7e55469 254 {
255 val.lattice_val = VARYING;
256 val.mask = double_int_minus_one;
257 }
4ee9c684 258 }
8edeb88b 259 else if (is_gimple_assign (stmt)
260 /* Value-returning GIMPLE_CALL statements assign to
261 a variable, and are treated similarly to GIMPLE_ASSIGN. */
262 || (is_gimple_call (stmt)
263 && gimple_call_lhs (stmt) != NULL_TREE)
264 || gimple_code (stmt) == GIMPLE_PHI)
41511585 265 {
8edeb88b 266 tree cst;
267 if (gimple_assign_single_p (stmt)
268 && DECL_P (gimple_assign_rhs1 (stmt))
269 && (cst = get_symbol_constant_value (gimple_assign_rhs1 (stmt))))
88dbf20f 270 {
8edeb88b 271 val.lattice_val = CONSTANT;
272 val.value = cst;
88dbf20f 273 }
274 else
8edeb88b 275 /* Any other variable defined by an assignment or a PHI node
276 is considered UNDEFINED. */
277 val.lattice_val = UNDEFINED;
278 }
279 else
280 {
281 /* Otherwise, VAR will never take on a constant value. */
282 val.lattice_val = VARYING;
b7e55469 283 val.mask = double_int_minus_one;
41511585 284 }
4ee9c684 285
41511585 286 return val;
287}
4ee9c684 288
4ee9c684 289
bfa30570 290/* Get the constant value associated with variable VAR. */
4ee9c684 291
bfa30570 292static inline prop_value_t *
293get_value (tree var)
88dbf20f 294{
e004838d 295 prop_value_t *val;
bfa30570 296
e004838d 297 if (const_val == NULL)
298 return NULL;
299
300 val = &const_val[SSA_NAME_VERSION (var)];
bfa30570 301 if (val->lattice_val == UNINITIALIZED)
4ee9c684 302 *val = get_default_value (var);
303
4af351a8 304 canonicalize_float_value (val);
305
4ee9c684 306 return val;
307}
308
15d138c9 309/* Return the constant tree value associated with VAR. */
310
311static inline tree
312get_constant_value (tree var)
313{
98d92e3c 314 prop_value_t *val;
315 if (TREE_CODE (var) != SSA_NAME)
316 {
317 if (is_gimple_min_invariant (var))
318 return var;
319 return NULL_TREE;
320 }
321 val = get_value (var);
b7e55469 322 if (val
323 && val->lattice_val == CONSTANT
324 && (TREE_CODE (val->value) != INTEGER_CST
cf8f0e63 325 || val->mask.is_zero ()))
15d138c9 326 return val->value;
327 return NULL_TREE;
328}
329
bfa30570 330/* Sets the value associated with VAR to VARYING. */
331
332static inline void
333set_value_varying (tree var)
334{
335 prop_value_t *val = &const_val[SSA_NAME_VERSION (var)];
336
337 val->lattice_val = VARYING;
338 val->value = NULL_TREE;
b7e55469 339 val->mask = double_int_minus_one;
bfa30570 340}
4ee9c684 341
b31eb493 342/* For float types, modify the value of VAL to make ccp work correctly
343 for non-standard values (-0, NaN):
344
345 If HONOR_SIGNED_ZEROS is false, and VAL = -0, we canonicalize it to 0.
346 If HONOR_NANS is false, and VAL is NaN, we canonicalize it to UNDEFINED.
347 This is to fix the following problem (see PR 29921): Suppose we have
348
349 x = 0.0 * y
350
351 and we set value of y to NaN. This causes value of x to be set to NaN.
352 When we later determine that y is in fact VARYING, fold uses the fact
353 that HONOR_NANS is false, and we try to change the value of x to 0,
354 causing an ICE. With HONOR_NANS being false, the real appearance of
355 NaN would cause undefined behavior, though, so claiming that y (and x)
356 are UNDEFINED initially is correct. */
357
358static void
359canonicalize_float_value (prop_value_t *val)
360{
361 enum machine_mode mode;
362 tree type;
363 REAL_VALUE_TYPE d;
364
365 if (val->lattice_val != CONSTANT
366 || TREE_CODE (val->value) != REAL_CST)
367 return;
368
369 d = TREE_REAL_CST (val->value);
370 type = TREE_TYPE (val->value);
371 mode = TYPE_MODE (type);
372
373 if (!HONOR_SIGNED_ZEROS (mode)
374 && REAL_VALUE_MINUS_ZERO (d))
375 {
376 val->value = build_real (type, dconst0);
377 return;
378 }
379
380 if (!HONOR_NANS (mode)
381 && REAL_VALUE_ISNAN (d))
382 {
383 val->lattice_val = UNDEFINED;
384 val->value = NULL;
b31eb493 385 return;
386 }
387}
388
b7e55469 389/* Return whether the lattice transition is valid. */
390
391static bool
392valid_lattice_transition (prop_value_t old_val, prop_value_t new_val)
393{
394 /* Lattice transitions must always be monotonically increasing in
395 value. */
396 if (old_val.lattice_val < new_val.lattice_val)
397 return true;
398
399 if (old_val.lattice_val != new_val.lattice_val)
400 return false;
401
402 if (!old_val.value && !new_val.value)
403 return true;
404
405 /* Now both lattice values are CONSTANT. */
406
43c92e0a 407 /* Allow transitioning from PHI <&x, not executable> == &x
408 to PHI <&x, &y> == common alignment. */
b7e55469 409 if (TREE_CODE (old_val.value) != INTEGER_CST
410 && TREE_CODE (new_val.value) == INTEGER_CST)
411 return true;
412
413 /* Bit-lattices have to agree in the still valid bits. */
414 if (TREE_CODE (old_val.value) == INTEGER_CST
415 && TREE_CODE (new_val.value) == INTEGER_CST)
cf8f0e63 416 return tree_to_double_int (old_val.value).and_not (new_val.mask)
417 == tree_to_double_int (new_val.value).and_not (new_val.mask);
b7e55469 418
419 /* Otherwise constant values have to agree. */
420 return operand_equal_p (old_val.value, new_val.value, 0);
421}
422
88dbf20f 423/* Set the value for variable VAR to NEW_VAL. Return true if the new
424 value is different from VAR's previous value. */
4ee9c684 425
41511585 426static bool
88dbf20f 427set_lattice_value (tree var, prop_value_t new_val)
4ee9c684 428{
6d0bf6d6 429 /* We can deal with old UNINITIALIZED values just fine here. */
430 prop_value_t *old_val = &const_val[SSA_NAME_VERSION (var)];
88dbf20f 431
b31eb493 432 canonicalize_float_value (&new_val);
433
b7e55469 434 /* We have to be careful to not go up the bitwise lattice
435 represented by the mask.
436 ??? This doesn't seem to be the best place to enforce this. */
437 if (new_val.lattice_val == CONSTANT
438 && old_val->lattice_val == CONSTANT
439 && TREE_CODE (new_val.value) == INTEGER_CST
440 && TREE_CODE (old_val->value) == INTEGER_CST)
441 {
442 double_int diff;
cf8f0e63 443 diff = tree_to_double_int (new_val.value)
444 ^ tree_to_double_int (old_val->value);
445 new_val.mask = new_val.mask | old_val->mask | diff;
b7e55469 446 }
bfa30570 447
b7e55469 448 gcc_assert (valid_lattice_transition (*old_val, new_val));
88dbf20f 449
b7e55469 450 /* If *OLD_VAL and NEW_VAL are the same, return false to inform the
451 caller that this was a non-transition. */
452 if (old_val->lattice_val != new_val.lattice_val
453 || (new_val.lattice_val == CONSTANT
454 && TREE_CODE (new_val.value) == INTEGER_CST
455 && (TREE_CODE (old_val->value) != INTEGER_CST
cf8f0e63 456 || new_val.mask != old_val->mask)))
4ee9c684 457 {
b7e55469 458 /* ??? We would like to delay creation of INTEGER_CSTs from
459 partially constants here. */
460
41511585 461 if (dump_file && (dump_flags & TDF_DETAILS))
462 {
88dbf20f 463 dump_lattice_value (dump_file, "Lattice value changed to ", new_val);
bfa30570 464 fprintf (dump_file, ". Adding SSA edges to worklist.\n");
41511585 465 }
466
88dbf20f 467 *old_val = new_val;
468
6d0bf6d6 469 gcc_assert (new_val.lattice_val != UNINITIALIZED);
bfa30570 470 return true;
4ee9c684 471 }
41511585 472
473 return false;
4ee9c684 474}
475
b7e55469 476static prop_value_t get_value_for_expr (tree, bool);
477static prop_value_t bit_value_binop (enum tree_code, tree, tree, tree);
478static void bit_value_binop_1 (enum tree_code, tree, double_int *, double_int *,
479 tree, double_int, double_int,
480 tree, double_int, double_int);
481
482/* Return a double_int that can be used for bitwise simplifications
483 from VAL. */
484
485static double_int
486value_to_double_int (prop_value_t val)
487{
488 if (val.value
489 && TREE_CODE (val.value) == INTEGER_CST)
490 return tree_to_double_int (val.value);
491 else
492 return double_int_zero;
493}
494
495/* Return the value for the address expression EXPR based on alignment
496 information. */
6d0bf6d6 497
498static prop_value_t
b7e55469 499get_value_from_alignment (tree expr)
500{
f8abb542 501 tree type = TREE_TYPE (expr);
b7e55469 502 prop_value_t val;
f8abb542 503 unsigned HOST_WIDE_INT bitpos;
504 unsigned int align;
b7e55469 505
506 gcc_assert (TREE_CODE (expr) == ADDR_EXPR);
507
59da1bcd 508 get_pointer_alignment_1 (expr, &align, &bitpos);
cf8f0e63 509 val.mask = (POINTER_TYPE_P (type) || TYPE_UNSIGNED (type)
510 ? double_int::mask (TYPE_PRECISION (type))
511 : double_int_minus_one)
512 .and_not (double_int::from_uhwi (align / BITS_PER_UNIT - 1));
513 val.lattice_val = val.mask.is_minus_one () ? VARYING : CONSTANT;
f8abb542 514 if (val.lattice_val == CONSTANT)
515 val.value
cf8f0e63 516 = double_int_to_tree (type,
517 double_int::from_uhwi (bitpos / BITS_PER_UNIT));
b7e55469 518 else
f8abb542 519 val.value = NULL_TREE;
b7e55469 520
521 return val;
522}
523
524/* Return the value for the tree operand EXPR. If FOR_BITS_P is true
525 return constant bits extracted from alignment information for
526 invariant addresses. */
527
528static prop_value_t
529get_value_for_expr (tree expr, bool for_bits_p)
6d0bf6d6 530{
531 prop_value_t val;
532
533 if (TREE_CODE (expr) == SSA_NAME)
b7e55469 534 {
535 val = *get_value (expr);
536 if (for_bits_p
537 && val.lattice_val == CONSTANT
538 && TREE_CODE (val.value) == ADDR_EXPR)
539 val = get_value_from_alignment (val.value);
540 }
541 else if (is_gimple_min_invariant (expr)
542 && (!for_bits_p || TREE_CODE (expr) != ADDR_EXPR))
6d0bf6d6 543 {
544 val.lattice_val = CONSTANT;
545 val.value = expr;
b7e55469 546 val.mask = double_int_zero;
6d0bf6d6 547 canonicalize_float_value (&val);
548 }
b7e55469 549 else if (TREE_CODE (expr) == ADDR_EXPR)
550 val = get_value_from_alignment (expr);
6d0bf6d6 551 else
552 {
553 val.lattice_val = VARYING;
b7e55469 554 val.mask = double_int_minus_one;
6d0bf6d6 555 val.value = NULL_TREE;
556 }
6d0bf6d6 557 return val;
558}
559
88dbf20f 560/* Return the likely CCP lattice value for STMT.
4ee9c684 561
41511585 562 If STMT has no operands, then return CONSTANT.
4ee9c684 563
d61b9af3 564 Else if undefinedness of operands of STMT cause its value to be
565 undefined, then return UNDEFINED.
4ee9c684 566
41511585 567 Else if any operands of STMT are constants, then return CONSTANT.
4ee9c684 568
41511585 569 Else return VARYING. */
4ee9c684 570
88dbf20f 571static ccp_lattice_t
75a70cf9 572likely_value (gimple stmt)
41511585 573{
d61b9af3 574 bool has_constant_operand, has_undefined_operand, all_undefined_operands;
41511585 575 tree use;
576 ssa_op_iter iter;
8edeb88b 577 unsigned i;
4ee9c684 578
590c3166 579 enum gimple_code code = gimple_code (stmt);
75a70cf9 580
581 /* This function appears to be called only for assignments, calls,
582 conditionals, and switches, due to the logic in visit_stmt. */
583 gcc_assert (code == GIMPLE_ASSIGN
584 || code == GIMPLE_CALL
585 || code == GIMPLE_COND
586 || code == GIMPLE_SWITCH);
88dbf20f 587
588 /* If the statement has volatile operands, it won't fold to a
589 constant value. */
75a70cf9 590 if (gimple_has_volatile_ops (stmt))
88dbf20f 591 return VARYING;
592
75a70cf9 593 /* Arrive here for more complex cases. */
bfa30570 594 has_constant_operand = false;
d61b9af3 595 has_undefined_operand = false;
596 all_undefined_operands = true;
8edeb88b 597 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
41511585 598 {
bfa30570 599 prop_value_t *val = get_value (use);
41511585 600
bfa30570 601 if (val->lattice_val == UNDEFINED)
d61b9af3 602 has_undefined_operand = true;
603 else
604 all_undefined_operands = false;
88dbf20f 605
41511585 606 if (val->lattice_val == CONSTANT)
bfa30570 607 has_constant_operand = true;
4ee9c684 608 }
41511585 609
dd277d48 610 /* There may be constants in regular rhs operands. For calls we
611 have to ignore lhs, fndecl and static chain, otherwise only
612 the lhs. */
613 for (i = (is_gimple_call (stmt) ? 2 : 0) + gimple_has_lhs (stmt);
8edeb88b 614 i < gimple_num_ops (stmt); ++i)
615 {
616 tree op = gimple_op (stmt, i);
617 if (!op || TREE_CODE (op) == SSA_NAME)
618 continue;
619 if (is_gimple_min_invariant (op))
620 has_constant_operand = true;
621 }
622
87c0a9fc 623 if (has_constant_operand)
624 all_undefined_operands = false;
625
d61b9af3 626 /* If the operation combines operands like COMPLEX_EXPR make sure to
627 not mark the result UNDEFINED if only one part of the result is
628 undefined. */
75a70cf9 629 if (has_undefined_operand && all_undefined_operands)
d61b9af3 630 return UNDEFINED;
75a70cf9 631 else if (code == GIMPLE_ASSIGN && has_undefined_operand)
d61b9af3 632 {
75a70cf9 633 switch (gimple_assign_rhs_code (stmt))
d61b9af3 634 {
635 /* Unary operators are handled with all_undefined_operands. */
636 case PLUS_EXPR:
637 case MINUS_EXPR:
d61b9af3 638 case POINTER_PLUS_EXPR:
d61b9af3 639 /* Not MIN_EXPR, MAX_EXPR. One VARYING operand may be selected.
640 Not bitwise operators, one VARYING operand may specify the
641 result completely. Not logical operators for the same reason.
05a936a0 642 Not COMPLEX_EXPR as one VARYING operand makes the result partly
643 not UNDEFINED. Not *DIV_EXPR, comparisons and shifts because
644 the undefined operand may be promoted. */
d61b9af3 645 return UNDEFINED;
646
43c92e0a 647 case ADDR_EXPR:
648 /* If any part of an address is UNDEFINED, like the index
649 of an ARRAY_EXPR, then treat the result as UNDEFINED. */
650 return UNDEFINED;
651
d61b9af3 652 default:
653 ;
654 }
655 }
656 /* If there was an UNDEFINED operand but the result may be not UNDEFINED
c91fedc5 657 fall back to CONSTANT. During iteration UNDEFINED may still drop
658 to CONSTANT. */
d61b9af3 659 if (has_undefined_operand)
c91fedc5 660 return CONSTANT;
d61b9af3 661
8edeb88b 662 /* We do not consider virtual operands here -- load from read-only
663 memory may have only VARYING virtual operands, but still be
664 constant. */
bfa30570 665 if (has_constant_operand
8edeb88b 666 || gimple_references_memory_p (stmt))
88dbf20f 667 return CONSTANT;
668
bfa30570 669 return VARYING;
4ee9c684 670}
671
bfa30570 672/* Returns true if STMT cannot be constant. */
673
674static bool
75a70cf9 675surely_varying_stmt_p (gimple stmt)
bfa30570 676{
677 /* If the statement has operands that we cannot handle, it cannot be
678 constant. */
75a70cf9 679 if (gimple_has_volatile_ops (stmt))
bfa30570 680 return true;
681
f257af64 682 /* If it is a call and does not return a value or is not a
683 builtin and not an indirect call, it is varying. */
75a70cf9 684 if (is_gimple_call (stmt))
f257af64 685 {
686 tree fndecl;
687 if (!gimple_call_lhs (stmt)
688 || ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
5768aeb3 689 && !DECL_BUILT_IN (fndecl)))
f257af64 690 return true;
691 }
bfa30570 692
8edeb88b 693 /* Any other store operation is not interesting. */
dd277d48 694 else if (gimple_vdef (stmt))
8edeb88b 695 return true;
696
bfa30570 697 /* Anything other than assignments and conditional jumps are not
698 interesting for CCP. */
75a70cf9 699 if (gimple_code (stmt) != GIMPLE_ASSIGN
f257af64 700 && gimple_code (stmt) != GIMPLE_COND
701 && gimple_code (stmt) != GIMPLE_SWITCH
702 && gimple_code (stmt) != GIMPLE_CALL)
bfa30570 703 return true;
704
705 return false;
706}
4ee9c684 707
41511585 708/* Initialize local data structures for CCP. */
4ee9c684 709
710static void
41511585 711ccp_initialize (void)
4ee9c684 712{
41511585 713 basic_block bb;
4ee9c684 714
43959b95 715 const_val = XCNEWVEC (prop_value_t, num_ssa_names);
4ee9c684 716
41511585 717 /* Initialize simulation flags for PHI nodes and statements. */
718 FOR_EACH_BB (bb)
4ee9c684 719 {
75a70cf9 720 gimple_stmt_iterator i;
4ee9c684 721
75a70cf9 722 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
41511585 723 {
75a70cf9 724 gimple stmt = gsi_stmt (i);
2193544e 725 bool is_varying;
726
727 /* If the statement is a control insn, then we do not
728 want to avoid simulating the statement once. Failure
729 to do so means that those edges will never get added. */
730 if (stmt_ends_bb_p (stmt))
731 is_varying = false;
732 else
733 is_varying = surely_varying_stmt_p (stmt);
4ee9c684 734
bfa30570 735 if (is_varying)
41511585 736 {
88dbf20f 737 tree def;
738 ssa_op_iter iter;
739
740 /* If the statement will not produce a constant, mark
741 all its outputs VARYING. */
742 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
8edeb88b 743 set_value_varying (def);
41511585 744 }
75a70cf9 745 prop_set_simulate_again (stmt, !is_varying);
41511585 746 }
4ee9c684 747 }
748
75a70cf9 749 /* Now process PHI nodes. We never clear the simulate_again flag on
750 phi nodes, since we do not know which edges are executable yet,
751 except for phi nodes for virtual operands when we do not do store ccp. */
41511585 752 FOR_EACH_BB (bb)
4ee9c684 753 {
75a70cf9 754 gimple_stmt_iterator i;
41511585 755
75a70cf9 756 for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
757 {
758 gimple phi = gsi_stmt (i);
759
7c782c9b 760 if (virtual_operand_p (gimple_phi_result (phi)))
75a70cf9 761 prop_set_simulate_again (phi, false);
bfa30570 762 else
75a70cf9 763 prop_set_simulate_again (phi, true);
41511585 764 }
4ee9c684 765 }
41511585 766}
4ee9c684 767
43fb76c1 768/* Debug count support. Reset the values of ssa names
769 VARYING when the total number ssa names analyzed is
770 beyond the debug count specified. */
771
772static void
773do_dbg_cnt (void)
774{
775 unsigned i;
776 for (i = 0; i < num_ssa_names; i++)
777 {
778 if (!dbg_cnt (ccp))
779 {
780 const_val[i].lattice_val = VARYING;
b7e55469 781 const_val[i].mask = double_int_minus_one;
43fb76c1 782 const_val[i].value = NULL_TREE;
783 }
784 }
785}
786
4ee9c684 787
88dbf20f 788/* Do final substitution of propagated values, cleanup the flowgraph and
48e1416a 789 free allocated storage.
4ee9c684 790
33a34f1e 791 Return TRUE when something was optimized. */
792
793static bool
88dbf20f 794ccp_finalize (void)
4ee9c684 795{
43fb76c1 796 bool something_changed;
153c3b50 797 unsigned i;
43fb76c1 798
799 do_dbg_cnt ();
153c3b50 800
801 /* Derive alignment and misalignment information from partially
802 constant pointers in the lattice. */
803 for (i = 1; i < num_ssa_names; ++i)
804 {
805 tree name = ssa_name (i);
806 prop_value_t *val;
153c3b50 807 unsigned int tem, align;
808
809 if (!name
810 || !POINTER_TYPE_P (TREE_TYPE (name)))
811 continue;
812
813 val = get_value (name);
814 if (val->lattice_val != CONSTANT
815 || TREE_CODE (val->value) != INTEGER_CST)
816 continue;
817
818 /* Trailing constant bits specify the alignment, trailing value
819 bits the misalignment. */
820 tem = val->mask.low;
821 align = (tem & -tem);
ceea063b 822 if (align > 1)
823 set_ptr_info_alignment (get_ptr_info (name), align,
824 TREE_INT_CST_LOW (val->value) & (align - 1));
153c3b50 825 }
826
88dbf20f 827 /* Perform substitutions based on the known constant values. */
14f101cf 828 something_changed = substitute_and_fold (get_constant_value,
829 ccp_fold_stmt, true);
4ee9c684 830
88dbf20f 831 free (const_val);
e004838d 832 const_val = NULL;
33a34f1e 833 return something_changed;;
4ee9c684 834}
835
836
88dbf20f 837/* Compute the meet operator between *VAL1 and *VAL2. Store the result
838 in VAL1.
839
840 any M UNDEFINED = any
88dbf20f 841 any M VARYING = VARYING
842 Ci M Cj = Ci if (i == j)
843 Ci M Cj = VARYING if (i != j)
bfa30570 844 */
4ee9c684 845
846static void
88dbf20f 847ccp_lattice_meet (prop_value_t *val1, prop_value_t *val2)
4ee9c684 848{
88dbf20f 849 if (val1->lattice_val == UNDEFINED)
4ee9c684 850 {
88dbf20f 851 /* UNDEFINED M any = any */
852 *val1 = *val2;
41511585 853 }
88dbf20f 854 else if (val2->lattice_val == UNDEFINED)
92481a4d 855 {
88dbf20f 856 /* any M UNDEFINED = any
857 Nothing to do. VAL1 already contains the value we want. */
858 ;
92481a4d 859 }
88dbf20f 860 else if (val1->lattice_val == VARYING
861 || val2->lattice_val == VARYING)
41511585 862 {
88dbf20f 863 /* any M VARYING = VARYING. */
864 val1->lattice_val = VARYING;
b7e55469 865 val1->mask = double_int_minus_one;
88dbf20f 866 val1->value = NULL_TREE;
41511585 867 }
b7e55469 868 else if (val1->lattice_val == CONSTANT
869 && val2->lattice_val == CONSTANT
870 && TREE_CODE (val1->value) == INTEGER_CST
871 && TREE_CODE (val2->value) == INTEGER_CST)
872 {
873 /* Ci M Cj = Ci if (i == j)
874 Ci M Cj = VARYING if (i != j)
875
876 For INTEGER_CSTs mask unequal bits. If no equal bits remain,
877 drop to varying. */
cf8f0e63 878 val1->mask = val1->mask | val2->mask
879 | (tree_to_double_int (val1->value)
880 ^ tree_to_double_int (val2->value));
881 if (val1->mask.is_minus_one ())
b7e55469 882 {
883 val1->lattice_val = VARYING;
884 val1->value = NULL_TREE;
885 }
886 }
88dbf20f 887 else if (val1->lattice_val == CONSTANT
888 && val2->lattice_val == CONSTANT
61207d43 889 && simple_cst_equal (val1->value, val2->value) == 1)
41511585 890 {
88dbf20f 891 /* Ci M Cj = Ci if (i == j)
892 Ci M Cj = VARYING if (i != j)
893
b7e55469 894 VAL1 already contains the value we want for equivalent values. */
895 }
896 else if (val1->lattice_val == CONSTANT
897 && val2->lattice_val == CONSTANT
898 && (TREE_CODE (val1->value) == ADDR_EXPR
899 || TREE_CODE (val2->value) == ADDR_EXPR))
900 {
901 /* When not equal addresses are involved try meeting for
902 alignment. */
903 prop_value_t tem = *val2;
904 if (TREE_CODE (val1->value) == ADDR_EXPR)
905 *val1 = get_value_for_expr (val1->value, true);
906 if (TREE_CODE (val2->value) == ADDR_EXPR)
907 tem = get_value_for_expr (val2->value, true);
908 ccp_lattice_meet (val1, &tem);
41511585 909 }
910 else
911 {
88dbf20f 912 /* Any other combination is VARYING. */
913 val1->lattice_val = VARYING;
b7e55469 914 val1->mask = double_int_minus_one;
88dbf20f 915 val1->value = NULL_TREE;
41511585 916 }
4ee9c684 917}
918
919
41511585 920/* Loop through the PHI_NODE's parameters for BLOCK and compare their
921 lattice values to determine PHI_NODE's lattice value. The value of a
88dbf20f 922 PHI node is determined calling ccp_lattice_meet with all the arguments
41511585 923 of the PHI node that are incoming via executable edges. */
4ee9c684 924
41511585 925static enum ssa_prop_result
75a70cf9 926ccp_visit_phi_node (gimple phi)
4ee9c684 927{
75a70cf9 928 unsigned i;
88dbf20f 929 prop_value_t *old_val, new_val;
4ee9c684 930
41511585 931 if (dump_file && (dump_flags & TDF_DETAILS))
4ee9c684 932 {
41511585 933 fprintf (dump_file, "\nVisiting PHI node: ");
75a70cf9 934 print_gimple_stmt (dump_file, phi, 0, dump_flags);
4ee9c684 935 }
4ee9c684 936
75a70cf9 937 old_val = get_value (gimple_phi_result (phi));
41511585 938 switch (old_val->lattice_val)
939 {
940 case VARYING:
88dbf20f 941 return SSA_PROP_VARYING;
4ee9c684 942
41511585 943 case CONSTANT:
944 new_val = *old_val;
945 break;
4ee9c684 946
41511585 947 case UNDEFINED:
41511585 948 new_val.lattice_val = UNDEFINED;
88dbf20f 949 new_val.value = NULL_TREE;
41511585 950 break;
4ee9c684 951
41511585 952 default:
8c0963c4 953 gcc_unreachable ();
41511585 954 }
4ee9c684 955
75a70cf9 956 for (i = 0; i < gimple_phi_num_args (phi); i++)
41511585 957 {
88dbf20f 958 /* Compute the meet operator over all the PHI arguments flowing
959 through executable edges. */
75a70cf9 960 edge e = gimple_phi_arg_edge (phi, i);
4ee9c684 961
41511585 962 if (dump_file && (dump_flags & TDF_DETAILS))
963 {
964 fprintf (dump_file,
965 "\n Argument #%d (%d -> %d %sexecutable)\n",
966 i, e->src->index, e->dest->index,
967 (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
968 }
969
970 /* If the incoming edge is executable, Compute the meet operator for
971 the existing value of the PHI node and the current PHI argument. */
972 if (e->flags & EDGE_EXECUTABLE)
973 {
75a70cf9 974 tree arg = gimple_phi_arg (phi, i)->def;
b7e55469 975 prop_value_t arg_val = get_value_for_expr (arg, false);
4ee9c684 976
88dbf20f 977 ccp_lattice_meet (&new_val, &arg_val);
4ee9c684 978
41511585 979 if (dump_file && (dump_flags & TDF_DETAILS))
980 {
981 fprintf (dump_file, "\t");
88dbf20f 982 print_generic_expr (dump_file, arg, dump_flags);
983 dump_lattice_value (dump_file, "\tValue: ", arg_val);
41511585 984 fprintf (dump_file, "\n");
985 }
4ee9c684 986
41511585 987 if (new_val.lattice_val == VARYING)
988 break;
989 }
990 }
4ee9c684 991
992 if (dump_file && (dump_flags & TDF_DETAILS))
41511585 993 {
994 dump_lattice_value (dump_file, "\n PHI node value: ", new_val);
995 fprintf (dump_file, "\n\n");
996 }
997
bfa30570 998 /* Make the transition to the new value. */
75a70cf9 999 if (set_lattice_value (gimple_phi_result (phi), new_val))
41511585 1000 {
1001 if (new_val.lattice_val == VARYING)
1002 return SSA_PROP_VARYING;
1003 else
1004 return SSA_PROP_INTERESTING;
1005 }
1006 else
1007 return SSA_PROP_NOT_INTERESTING;
4ee9c684 1008}
1009
15d138c9 1010/* Return the constant value for OP or OP otherwise. */
00f4f705 1011
1012static tree
15d138c9 1013valueize_op (tree op)
00f4f705 1014{
00f4f705 1015 if (TREE_CODE (op) == SSA_NAME)
1016 {
15d138c9 1017 tree tem = get_constant_value (op);
1018 if (tem)
1019 return tem;
00f4f705 1020 }
1021 return op;
1022}
1023
41511585 1024/* CCP specific front-end to the non-destructive constant folding
1025 routines.
4ee9c684 1026
1027 Attempt to simplify the RHS of STMT knowing that one or more
1028 operands are constants.
1029
1030 If simplification is possible, return the simplified RHS,
75a70cf9 1031 otherwise return the original RHS or NULL_TREE. */
4ee9c684 1032
1033static tree
75a70cf9 1034ccp_fold (gimple stmt)
4ee9c684 1035{
389dd41b 1036 location_t loc = gimple_location (stmt);
75a70cf9 1037 switch (gimple_code (stmt))
88dbf20f 1038 {
75a70cf9 1039 case GIMPLE_COND:
1040 {
1041 /* Handle comparison operators that can appear in GIMPLE form. */
15d138c9 1042 tree op0 = valueize_op (gimple_cond_lhs (stmt));
1043 tree op1 = valueize_op (gimple_cond_rhs (stmt));
75a70cf9 1044 enum tree_code code = gimple_cond_code (stmt);
389dd41b 1045 return fold_binary_loc (loc, code, boolean_type_node, op0, op1);
75a70cf9 1046 }
4ee9c684 1047
75a70cf9 1048 case GIMPLE_SWITCH:
1049 {
15d138c9 1050 /* Return the constant switch index. */
1051 return valueize_op (gimple_switch_index (stmt));
75a70cf9 1052 }
912f109f 1053
1d0b727d 1054 case GIMPLE_ASSIGN:
1055 case GIMPLE_CALL:
1056 return gimple_fold_stmt_to_constant_1 (stmt, valueize_op);
04236c3a 1057
8782adcf 1058 default:
1d0b727d 1059 gcc_unreachable ();
8782adcf 1060 }
8782adcf 1061}
75a70cf9 1062
b7e55469 1063/* Apply the operation CODE in type TYPE to the value, mask pair
1064 RVAL and RMASK representing a value of type RTYPE and set
1065 the value, mask pair *VAL and *MASK to the result. */
1066
1067static void
1068bit_value_unop_1 (enum tree_code code, tree type,
1069 double_int *val, double_int *mask,
1070 tree rtype, double_int rval, double_int rmask)
1071{
1072 switch (code)
1073 {
1074 case BIT_NOT_EXPR:
1075 *mask = rmask;
cf8f0e63 1076 *val = ~rval;
b7e55469 1077 break;
1078
1079 case NEGATE_EXPR:
1080 {
1081 double_int temv, temm;
1082 /* Return ~rval + 1. */
1083 bit_value_unop_1 (BIT_NOT_EXPR, type, &temv, &temm, type, rval, rmask);
1084 bit_value_binop_1 (PLUS_EXPR, type, val, mask,
1085 type, temv, temm,
1086 type, double_int_one, double_int_zero);
1087 break;
1088 }
1089
1090 CASE_CONVERT:
1091 {
1092 bool uns;
1093
1094 /* First extend mask and value according to the original type. */
85d86b55 1095 uns = TYPE_UNSIGNED (rtype);
cf8f0e63 1096 *mask = rmask.ext (TYPE_PRECISION (rtype), uns);
1097 *val = rval.ext (TYPE_PRECISION (rtype), uns);
b7e55469 1098
1099 /* Then extend mask and value according to the target type. */
85d86b55 1100 uns = TYPE_UNSIGNED (type);
cf8f0e63 1101 *mask = (*mask).ext (TYPE_PRECISION (type), uns);
1102 *val = (*val).ext (TYPE_PRECISION (type), uns);
b7e55469 1103 break;
1104 }
1105
1106 default:
1107 *mask = double_int_minus_one;
1108 break;
1109 }
1110}
1111
1112/* Apply the operation CODE in type TYPE to the value, mask pairs
1113 R1VAL, R1MASK and R2VAL, R2MASK representing a values of type R1TYPE
1114 and R2TYPE and set the value, mask pair *VAL and *MASK to the result. */
1115
1116static void
1117bit_value_binop_1 (enum tree_code code, tree type,
1118 double_int *val, double_int *mask,
1119 tree r1type, double_int r1val, double_int r1mask,
1120 tree r2type, double_int r2val, double_int r2mask)
1121{
85d86b55 1122 bool uns = TYPE_UNSIGNED (type);
b7e55469 1123 /* Assume we'll get a constant result. Use an initial varying value,
1124 we fall back to varying in the end if necessary. */
1125 *mask = double_int_minus_one;
1126 switch (code)
1127 {
1128 case BIT_AND_EXPR:
1129 /* The mask is constant where there is a known not
1130 set bit, (m1 | m2) & ((v1 | m1) & (v2 | m2)) */
cf8f0e63 1131 *mask = (r1mask | r2mask) & (r1val | r1mask) & (r2val | r2mask);
1132 *val = r1val & r2val;
b7e55469 1133 break;
1134
1135 case BIT_IOR_EXPR:
1136 /* The mask is constant where there is a known
1137 set bit, (m1 | m2) & ~((v1 & ~m1) | (v2 & ~m2)). */
cf8f0e63 1138 *mask = (r1mask | r2mask)
1139 .and_not (r1val.and_not (r1mask) | r2val.and_not (r2mask));
1140 *val = r1val | r2val;
b7e55469 1141 break;
1142
1143 case BIT_XOR_EXPR:
1144 /* m1 | m2 */
cf8f0e63 1145 *mask = r1mask | r2mask;
1146 *val = r1val ^ r2val;
b7e55469 1147 break;
1148
1149 case LROTATE_EXPR:
1150 case RROTATE_EXPR:
cf8f0e63 1151 if (r2mask.is_zero ())
b7e55469 1152 {
1153 HOST_WIDE_INT shift = r2val.low;
1154 if (code == RROTATE_EXPR)
1155 shift = -shift;
cf8f0e63 1156 *mask = r1mask.lrotate (shift, TYPE_PRECISION (type));
1157 *val = r1val.lrotate (shift, TYPE_PRECISION (type));
b7e55469 1158 }
1159 break;
1160
1161 case LSHIFT_EXPR:
1162 case RSHIFT_EXPR:
1163 /* ??? We can handle partially known shift counts if we know
1164 its sign. That way we can tell that (x << (y | 8)) & 255
1165 is zero. */
cf8f0e63 1166 if (r2mask.is_zero ())
b7e55469 1167 {
1168 HOST_WIDE_INT shift = r2val.low;
1169 if (code == RSHIFT_EXPR)
1170 shift = -shift;
1171 /* We need to know if we are doing a left or a right shift
1172 to properly shift in zeros for left shift and unsigned
1173 right shifts and the sign bit for signed right shifts.
1174 For signed right shifts we shift in varying in case
1175 the sign bit was varying. */
1176 if (shift > 0)
1177 {
cf8f0e63 1178 *mask = r1mask.llshift (shift, TYPE_PRECISION (type));
1179 *val = r1val.llshift (shift, TYPE_PRECISION (type));
b7e55469 1180 }
1181 else if (shift < 0)
1182 {
1183 shift = -shift;
cf8f0e63 1184 *mask = r1mask.rshift (shift, TYPE_PRECISION (type), !uns);
1185 *val = r1val.rshift (shift, TYPE_PRECISION (type), !uns);
b7e55469 1186 }
1187 else
1188 {
1189 *mask = r1mask;
1190 *val = r1val;
1191 }
1192 }
1193 break;
1194
1195 case PLUS_EXPR:
1196 case POINTER_PLUS_EXPR:
1197 {
1198 double_int lo, hi;
1199 /* Do the addition with unknown bits set to zero, to give carry-ins of
1200 zero wherever possible. */
cf8f0e63 1201 lo = r1val.and_not (r1mask) + r2val.and_not (r2mask);
1202 lo = lo.ext (TYPE_PRECISION (type), uns);
b7e55469 1203 /* Do the addition with unknown bits set to one, to give carry-ins of
1204 one wherever possible. */
cf8f0e63 1205 hi = (r1val | r1mask) + (r2val | r2mask);
1206 hi = hi.ext (TYPE_PRECISION (type), uns);
b7e55469 1207 /* Each bit in the result is known if (a) the corresponding bits in
1208 both inputs are known, and (b) the carry-in to that bit position
1209 is known. We can check condition (b) by seeing if we got the same
1210 result with minimised carries as with maximised carries. */
cf8f0e63 1211 *mask = r1mask | r2mask | (lo ^ hi);
1212 *mask = (*mask).ext (TYPE_PRECISION (type), uns);
b7e55469 1213 /* It shouldn't matter whether we choose lo or hi here. */
1214 *val = lo;
1215 break;
1216 }
1217
1218 case MINUS_EXPR:
1219 {
1220 double_int temv, temm;
1221 bit_value_unop_1 (NEGATE_EXPR, r2type, &temv, &temm,
1222 r2type, r2val, r2mask);
1223 bit_value_binop_1 (PLUS_EXPR, type, val, mask,
1224 r1type, r1val, r1mask,
1225 r2type, temv, temm);
1226 break;
1227 }
1228
1229 case MULT_EXPR:
1230 {
1231 /* Just track trailing zeros in both operands and transfer
1232 them to the other. */
cf8f0e63 1233 int r1tz = (r1val | r1mask).trailing_zeros ();
1234 int r2tz = (r2val | r2mask).trailing_zeros ();
b7e55469 1235 if (r1tz + r2tz >= HOST_BITS_PER_DOUBLE_INT)
1236 {
1237 *mask = double_int_zero;
1238 *val = double_int_zero;
1239 }
1240 else if (r1tz + r2tz > 0)
1241 {
cf8f0e63 1242 *mask = ~double_int::mask (r1tz + r2tz);
1243 *mask = (*mask).ext (TYPE_PRECISION (type), uns);
b7e55469 1244 *val = double_int_zero;
1245 }
1246 break;
1247 }
1248
1249 case EQ_EXPR:
1250 case NE_EXPR:
1251 {
cf8f0e63 1252 double_int m = r1mask | r2mask;
1253 if (r1val.and_not (m) != r2val.and_not (m))
b7e55469 1254 {
1255 *mask = double_int_zero;
1256 *val = ((code == EQ_EXPR) ? double_int_zero : double_int_one);
1257 }
1258 else
1259 {
1260 /* We know the result of a comparison is always one or zero. */
1261 *mask = double_int_one;
1262 *val = double_int_zero;
1263 }
1264 break;
1265 }
1266
1267 case GE_EXPR:
1268 case GT_EXPR:
1269 {
1270 double_int tem = r1val;
1271 r1val = r2val;
1272 r2val = tem;
1273 tem = r1mask;
1274 r1mask = r2mask;
1275 r2mask = tem;
1276 code = swap_tree_comparison (code);
1277 }
1278 /* Fallthru. */
1279 case LT_EXPR:
1280 case LE_EXPR:
1281 {
1282 int minmax, maxmin;
1283 /* If the most significant bits are not known we know nothing. */
cf8f0e63 1284 if (r1mask.is_negative () || r2mask.is_negative ())
b7e55469 1285 break;
1286
90c0f5b7 1287 /* For comparisons the signedness is in the comparison operands. */
85d86b55 1288 uns = TYPE_UNSIGNED (r1type);
90c0f5b7 1289
b7e55469 1290 /* If we know the most significant bits we know the values
1291 value ranges by means of treating varying bits as zero
1292 or one. Do a cross comparison of the max/min pairs. */
cf8f0e63 1293 maxmin = (r1val | r1mask).cmp (r2val.and_not (r2mask), uns);
1294 minmax = r1val.and_not (r1mask).cmp (r2val | r2mask, uns);
b7e55469 1295 if (maxmin < 0) /* r1 is less than r2. */
1296 {
1297 *mask = double_int_zero;
1298 *val = double_int_one;
1299 }
1300 else if (minmax > 0) /* r1 is not less or equal to r2. */
1301 {
1302 *mask = double_int_zero;
1303 *val = double_int_zero;
1304 }
1305 else if (maxmin == minmax) /* r1 and r2 are equal. */
1306 {
1307 /* This probably should never happen as we'd have
1308 folded the thing during fully constant value folding. */
1309 *mask = double_int_zero;
1310 *val = (code == LE_EXPR ? double_int_one : double_int_zero);
1311 }
1312 else
1313 {
1314 /* We know the result of a comparison is always one or zero. */
1315 *mask = double_int_one;
1316 *val = double_int_zero;
1317 }
1318 break;
1319 }
1320
1321 default:;
1322 }
1323}
1324
1325/* Return the propagation value when applying the operation CODE to
1326 the value RHS yielding type TYPE. */
1327
1328static prop_value_t
1329bit_value_unop (enum tree_code code, tree type, tree rhs)
1330{
1331 prop_value_t rval = get_value_for_expr (rhs, true);
1332 double_int value, mask;
1333 prop_value_t val;
c91fedc5 1334
1335 if (rval.lattice_val == UNDEFINED)
1336 return rval;
1337
b7e55469 1338 gcc_assert ((rval.lattice_val == CONSTANT
1339 && TREE_CODE (rval.value) == INTEGER_CST)
cf8f0e63 1340 || rval.mask.is_minus_one ());
b7e55469 1341 bit_value_unop_1 (code, type, &value, &mask,
1342 TREE_TYPE (rhs), value_to_double_int (rval), rval.mask);
cf8f0e63 1343 if (!mask.is_minus_one ())
b7e55469 1344 {
1345 val.lattice_val = CONSTANT;
1346 val.mask = mask;
1347 /* ??? Delay building trees here. */
1348 val.value = double_int_to_tree (type, value);
1349 }
1350 else
1351 {
1352 val.lattice_val = VARYING;
1353 val.value = NULL_TREE;
1354 val.mask = double_int_minus_one;
1355 }
1356 return val;
1357}
1358
1359/* Return the propagation value when applying the operation CODE to
1360 the values RHS1 and RHS2 yielding type TYPE. */
1361
1362static prop_value_t
1363bit_value_binop (enum tree_code code, tree type, tree rhs1, tree rhs2)
1364{
1365 prop_value_t r1val = get_value_for_expr (rhs1, true);
1366 prop_value_t r2val = get_value_for_expr (rhs2, true);
1367 double_int value, mask;
1368 prop_value_t val;
c91fedc5 1369
1370 if (r1val.lattice_val == UNDEFINED
1371 || r2val.lattice_val == UNDEFINED)
1372 {
1373 val.lattice_val = VARYING;
1374 val.value = NULL_TREE;
1375 val.mask = double_int_minus_one;
1376 return val;
1377 }
1378
b7e55469 1379 gcc_assert ((r1val.lattice_val == CONSTANT
1380 && TREE_CODE (r1val.value) == INTEGER_CST)
cf8f0e63 1381 || r1val.mask.is_minus_one ());
b7e55469 1382 gcc_assert ((r2val.lattice_val == CONSTANT
1383 && TREE_CODE (r2val.value) == INTEGER_CST)
cf8f0e63 1384 || r2val.mask.is_minus_one ());
b7e55469 1385 bit_value_binop_1 (code, type, &value, &mask,
1386 TREE_TYPE (rhs1), value_to_double_int (r1val), r1val.mask,
1387 TREE_TYPE (rhs2), value_to_double_int (r2val), r2val.mask);
cf8f0e63 1388 if (!mask.is_minus_one ())
b7e55469 1389 {
1390 val.lattice_val = CONSTANT;
1391 val.mask = mask;
1392 /* ??? Delay building trees here. */
1393 val.value = double_int_to_tree (type, value);
1394 }
1395 else
1396 {
1397 val.lattice_val = VARYING;
1398 val.value = NULL_TREE;
1399 val.mask = double_int_minus_one;
1400 }
1401 return val;
1402}
1403
fca0886c 1404/* Return the propagation value when applying __builtin_assume_aligned to
1405 its arguments. */
1406
1407static prop_value_t
1408bit_value_assume_aligned (gimple stmt)
1409{
1410 tree ptr = gimple_call_arg (stmt, 0), align, misalign = NULL_TREE;
1411 tree type = TREE_TYPE (ptr);
1412 unsigned HOST_WIDE_INT aligni, misaligni = 0;
1413 prop_value_t ptrval = get_value_for_expr (ptr, true);
1414 prop_value_t alignval;
1415 double_int value, mask;
1416 prop_value_t val;
1417 if (ptrval.lattice_val == UNDEFINED)
1418 return ptrval;
1419 gcc_assert ((ptrval.lattice_val == CONSTANT
1420 && TREE_CODE (ptrval.value) == INTEGER_CST)
cf8f0e63 1421 || ptrval.mask.is_minus_one ());
fca0886c 1422 align = gimple_call_arg (stmt, 1);
1423 if (!host_integerp (align, 1))
1424 return ptrval;
1425 aligni = tree_low_cst (align, 1);
1426 if (aligni <= 1
1427 || (aligni & (aligni - 1)) != 0)
1428 return ptrval;
1429 if (gimple_call_num_args (stmt) > 2)
1430 {
1431 misalign = gimple_call_arg (stmt, 2);
1432 if (!host_integerp (misalign, 1))
1433 return ptrval;
1434 misaligni = tree_low_cst (misalign, 1);
1435 if (misaligni >= aligni)
1436 return ptrval;
1437 }
1438 align = build_int_cst_type (type, -aligni);
1439 alignval = get_value_for_expr (align, true);
1440 bit_value_binop_1 (BIT_AND_EXPR, type, &value, &mask,
1441 type, value_to_double_int (ptrval), ptrval.mask,
1442 type, value_to_double_int (alignval), alignval.mask);
cf8f0e63 1443 if (!mask.is_minus_one ())
fca0886c 1444 {
1445 val.lattice_val = CONSTANT;
1446 val.mask = mask;
1447 gcc_assert ((mask.low & (aligni - 1)) == 0);
1448 gcc_assert ((value.low & (aligni - 1)) == 0);
1449 value.low |= misaligni;
1450 /* ??? Delay building trees here. */
1451 val.value = double_int_to_tree (type, value);
1452 }
1453 else
1454 {
1455 val.lattice_val = VARYING;
1456 val.value = NULL_TREE;
1457 val.mask = double_int_minus_one;
1458 }
1459 return val;
1460}
1461
75a70cf9 1462/* Evaluate statement STMT.
1463 Valid only for assignments, calls, conditionals, and switches. */
4ee9c684 1464
88dbf20f 1465static prop_value_t
75a70cf9 1466evaluate_stmt (gimple stmt)
4ee9c684 1467{
88dbf20f 1468 prop_value_t val;
4f61cce6 1469 tree simplified = NULL_TREE;
88dbf20f 1470 ccp_lattice_t likelyvalue = likely_value (stmt);
b7e55469 1471 bool is_constant = false;
581bf1c2 1472 unsigned int align;
88dbf20f 1473
b7e55469 1474 if (dump_file && (dump_flags & TDF_DETAILS))
1475 {
1476 fprintf (dump_file, "which is likely ");
1477 switch (likelyvalue)
1478 {
1479 case CONSTANT:
1480 fprintf (dump_file, "CONSTANT");
1481 break;
1482 case UNDEFINED:
1483 fprintf (dump_file, "UNDEFINED");
1484 break;
1485 case VARYING:
1486 fprintf (dump_file, "VARYING");
1487 break;
1488 default:;
1489 }
1490 fprintf (dump_file, "\n");
1491 }
add6ee5e 1492
4ee9c684 1493 /* If the statement is likely to have a CONSTANT result, then try
1494 to fold the statement to determine the constant value. */
75a70cf9 1495 /* FIXME. This is the only place that we call ccp_fold.
1496 Since likely_value never returns CONSTANT for calls, we will
1497 not attempt to fold them, including builtins that may profit. */
4ee9c684 1498 if (likelyvalue == CONSTANT)
b7e55469 1499 {
1500 fold_defer_overflow_warnings ();
1501 simplified = ccp_fold (stmt);
1502 is_constant = simplified && is_gimple_min_invariant (simplified);
1503 fold_undefer_overflow_warnings (is_constant, stmt, 0);
1504 if (is_constant)
1505 {
1506 /* The statement produced a constant value. */
1507 val.lattice_val = CONSTANT;
1508 val.value = simplified;
1509 val.mask = double_int_zero;
1510 }
1511 }
4ee9c684 1512 /* If the statement is likely to have a VARYING result, then do not
1513 bother folding the statement. */
04236c3a 1514 else if (likelyvalue == VARYING)
75a70cf9 1515 {
590c3166 1516 enum gimple_code code = gimple_code (stmt);
75a70cf9 1517 if (code == GIMPLE_ASSIGN)
1518 {
1519 enum tree_code subcode = gimple_assign_rhs_code (stmt);
48e1416a 1520
75a70cf9 1521 /* Other cases cannot satisfy is_gimple_min_invariant
1522 without folding. */
1523 if (get_gimple_rhs_class (subcode) == GIMPLE_SINGLE_RHS)
1524 simplified = gimple_assign_rhs1 (stmt);
1525 }
1526 else if (code == GIMPLE_SWITCH)
1527 simplified = gimple_switch_index (stmt);
1528 else
a65c4d64 1529 /* These cannot satisfy is_gimple_min_invariant without folding. */
1530 gcc_assert (code == GIMPLE_CALL || code == GIMPLE_COND);
b7e55469 1531 is_constant = simplified && is_gimple_min_invariant (simplified);
1532 if (is_constant)
1533 {
1534 /* The statement produced a constant value. */
1535 val.lattice_val = CONSTANT;
1536 val.value = simplified;
1537 val.mask = double_int_zero;
1538 }
75a70cf9 1539 }
4ee9c684 1540
b7e55469 1541 /* Resort to simplification for bitwise tracking. */
1542 if (flag_tree_bit_ccp
939514e9 1543 && (likelyvalue == CONSTANT || is_gimple_call (stmt))
b7e55469 1544 && !is_constant)
912f109f 1545 {
b7e55469 1546 enum gimple_code code = gimple_code (stmt);
153c3b50 1547 tree fndecl;
b7e55469 1548 val.lattice_val = VARYING;
1549 val.value = NULL_TREE;
1550 val.mask = double_int_minus_one;
1551 if (code == GIMPLE_ASSIGN)
912f109f 1552 {
b7e55469 1553 enum tree_code subcode = gimple_assign_rhs_code (stmt);
1554 tree rhs1 = gimple_assign_rhs1 (stmt);
1555 switch (get_gimple_rhs_class (subcode))
1556 {
1557 case GIMPLE_SINGLE_RHS:
1558 if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
1559 || POINTER_TYPE_P (TREE_TYPE (rhs1)))
1560 val = get_value_for_expr (rhs1, true);
1561 break;
1562
1563 case GIMPLE_UNARY_RHS:
1564 if ((INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
1565 || POINTER_TYPE_P (TREE_TYPE (rhs1)))
1566 && (INTEGRAL_TYPE_P (gimple_expr_type (stmt))
1567 || POINTER_TYPE_P (gimple_expr_type (stmt))))
1568 val = bit_value_unop (subcode, gimple_expr_type (stmt), rhs1);
1569 break;
1570
1571 case GIMPLE_BINARY_RHS:
1572 if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
1573 || POINTER_TYPE_P (TREE_TYPE (rhs1)))
1574 {
e47d81e0 1575 tree lhs = gimple_assign_lhs (stmt);
b7e55469 1576 tree rhs2 = gimple_assign_rhs2 (stmt);
1577 val = bit_value_binop (subcode,
e47d81e0 1578 TREE_TYPE (lhs), rhs1, rhs2);
b7e55469 1579 }
1580 break;
1581
1582 default:;
1583 }
912f109f 1584 }
b7e55469 1585 else if (code == GIMPLE_COND)
1586 {
1587 enum tree_code code = gimple_cond_code (stmt);
1588 tree rhs1 = gimple_cond_lhs (stmt);
1589 tree rhs2 = gimple_cond_rhs (stmt);
1590 if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
1591 || POINTER_TYPE_P (TREE_TYPE (rhs1)))
1592 val = bit_value_binop (code, TREE_TYPE (rhs1), rhs1, rhs2);
1593 }
153c3b50 1594 else if (code == GIMPLE_CALL
1595 && (fndecl = gimple_call_fndecl (stmt))
1596 && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
1597 {
1598 switch (DECL_FUNCTION_CODE (fndecl))
1599 {
1600 case BUILT_IN_MALLOC:
1601 case BUILT_IN_REALLOC:
1602 case BUILT_IN_CALLOC:
939514e9 1603 case BUILT_IN_STRDUP:
1604 case BUILT_IN_STRNDUP:
153c3b50 1605 val.lattice_val = CONSTANT;
1606 val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0);
cf8f0e63 1607 val.mask = double_int::from_shwi
153c3b50 1608 (~(((HOST_WIDE_INT) MALLOC_ABI_ALIGNMENT)
1609 / BITS_PER_UNIT - 1));
1610 break;
1611
1612 case BUILT_IN_ALLOCA:
581bf1c2 1613 case BUILT_IN_ALLOCA_WITH_ALIGN:
1614 align = (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_ALLOCA_WITH_ALIGN
1615 ? TREE_INT_CST_LOW (gimple_call_arg (stmt, 1))
1616 : BIGGEST_ALIGNMENT);
153c3b50 1617 val.lattice_val = CONSTANT;
1618 val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0);
cf8f0e63 1619 val.mask = double_int::from_shwi (~(((HOST_WIDE_INT) align)
1620 / BITS_PER_UNIT - 1));
153c3b50 1621 break;
1622
939514e9 1623 /* These builtins return their first argument, unmodified. */
1624 case BUILT_IN_MEMCPY:
1625 case BUILT_IN_MEMMOVE:
1626 case BUILT_IN_MEMSET:
1627 case BUILT_IN_STRCPY:
1628 case BUILT_IN_STRNCPY:
1629 case BUILT_IN_MEMCPY_CHK:
1630 case BUILT_IN_MEMMOVE_CHK:
1631 case BUILT_IN_MEMSET_CHK:
1632 case BUILT_IN_STRCPY_CHK:
1633 case BUILT_IN_STRNCPY_CHK:
1634 val = get_value_for_expr (gimple_call_arg (stmt, 0), true);
1635 break;
1636
fca0886c 1637 case BUILT_IN_ASSUME_ALIGNED:
1638 val = bit_value_assume_aligned (stmt);
1639 break;
1640
153c3b50 1641 default:;
1642 }
1643 }
b7e55469 1644 is_constant = (val.lattice_val == CONSTANT);
912f109f 1645 }
1646
b7e55469 1647 if (!is_constant)
4ee9c684 1648 {
1649 /* The statement produced a nonconstant value. If the statement
88dbf20f 1650 had UNDEFINED operands, then the result of the statement
1651 should be UNDEFINED. Otherwise, the statement is VARYING. */
bfa30570 1652 if (likelyvalue == UNDEFINED)
b7e55469 1653 {
1654 val.lattice_val = likelyvalue;
1655 val.mask = double_int_zero;
1656 }
b765fa12 1657 else
b7e55469 1658 {
1659 val.lattice_val = VARYING;
1660 val.mask = double_int_minus_one;
1661 }
b765fa12 1662
88dbf20f 1663 val.value = NULL_TREE;
4ee9c684 1664 }
41511585 1665
1666 return val;
4ee9c684 1667}
1668
494bbaae 1669typedef hash_table <pointer_hash <gimple_statement_d> > gimple_htab;
2b15d2ba 1670
582a80ed 1671/* Given a BUILT_IN_STACK_SAVE value SAVED_VAL, insert a clobber of VAR before
1672 each matching BUILT_IN_STACK_RESTORE. Mark visited phis in VISITED. */
1673
1674static void
2b15d2ba 1675insert_clobber_before_stack_restore (tree saved_val, tree var,
1676 gimple_htab *visited)
582a80ed 1677{
1678 gimple stmt, clobber_stmt;
1679 tree clobber;
1680 imm_use_iterator iter;
1681 gimple_stmt_iterator i;
1682 gimple *slot;
1683
1684 FOR_EACH_IMM_USE_STMT (stmt, iter, saved_val)
1685 if (gimple_call_builtin_p (stmt, BUILT_IN_STACK_RESTORE))
1686 {
1687 clobber = build_constructor (TREE_TYPE (var), NULL);
1688 TREE_THIS_VOLATILE (clobber) = 1;
1689 clobber_stmt = gimple_build_assign (var, clobber);
1690
1691 i = gsi_for_stmt (stmt);
1692 gsi_insert_before (&i, clobber_stmt, GSI_SAME_STMT);
1693 }
1694 else if (gimple_code (stmt) == GIMPLE_PHI)
1695 {
2b15d2ba 1696 if (!visited->is_created ())
1697 visited->create (10);
582a80ed 1698
2b15d2ba 1699 slot = visited->find_slot (stmt, INSERT);
582a80ed 1700 if (*slot != NULL)
1701 continue;
1702
1703 *slot = stmt;
1704 insert_clobber_before_stack_restore (gimple_phi_result (stmt), var,
1705 visited);
1706 }
1707 else
1708 gcc_assert (is_gimple_debug (stmt));
1709}
1710
1711/* Advance the iterator to the previous non-debug gimple statement in the same
1712 or dominating basic block. */
1713
1714static inline void
1715gsi_prev_dom_bb_nondebug (gimple_stmt_iterator *i)
1716{
1717 basic_block dom;
1718
1719 gsi_prev_nondebug (i);
1720 while (gsi_end_p (*i))
1721 {
1722 dom = get_immediate_dominator (CDI_DOMINATORS, i->bb);
1723 if (dom == NULL || dom == ENTRY_BLOCK_PTR)
1724 return;
1725
1726 *i = gsi_last_bb (dom);
1727 }
1728}
1729
1730/* Find a BUILT_IN_STACK_SAVE dominating gsi_stmt (I), and insert
1543f720 1731 a clobber of VAR before each matching BUILT_IN_STACK_RESTORE.
1732
1733 It is possible that BUILT_IN_STACK_SAVE cannot be find in a dominator when a
1734 previous pass (such as DOM) duplicated it along multiple paths to a BB. In
1735 that case the function gives up without inserting the clobbers. */
582a80ed 1736
1737static void
1738insert_clobbers_for_var (gimple_stmt_iterator i, tree var)
1739{
582a80ed 1740 gimple stmt;
1741 tree saved_val;
2b15d2ba 1742 gimple_htab visited;
582a80ed 1743
1543f720 1744 for (; !gsi_end_p (i); gsi_prev_dom_bb_nondebug (&i))
582a80ed 1745 {
1746 stmt = gsi_stmt (i);
1747
1748 if (!gimple_call_builtin_p (stmt, BUILT_IN_STACK_SAVE))
1749 continue;
582a80ed 1750
1751 saved_val = gimple_call_lhs (stmt);
1752 if (saved_val == NULL_TREE)
1753 continue;
1754
1755 insert_clobber_before_stack_restore (saved_val, var, &visited);
1756 break;
1757 }
1758
2b15d2ba 1759 if (visited.is_created ())
1760 visited.dispose ();
582a80ed 1761}
1762
581bf1c2 1763/* Detects a __builtin_alloca_with_align with constant size argument. Declares
1764 fixed-size array and returns the address, if found, otherwise returns
1765 NULL_TREE. */
9a65cc0a 1766
1767static tree
581bf1c2 1768fold_builtin_alloca_with_align (gimple stmt)
9a65cc0a 1769{
1770 unsigned HOST_WIDE_INT size, threshold, n_elem;
1771 tree lhs, arg, block, var, elem_type, array_type;
9a65cc0a 1772
1773 /* Get lhs. */
1774 lhs = gimple_call_lhs (stmt);
1775 if (lhs == NULL_TREE)
1776 return NULL_TREE;
1777
1778 /* Detect constant argument. */
1779 arg = get_constant_value (gimple_call_arg (stmt, 0));
6e93d308 1780 if (arg == NULL_TREE
1781 || TREE_CODE (arg) != INTEGER_CST
9a65cc0a 1782 || !host_integerp (arg, 1))
1783 return NULL_TREE;
6e93d308 1784
9a65cc0a 1785 size = TREE_INT_CST_LOW (arg);
1786
581bf1c2 1787 /* Heuristic: don't fold large allocas. */
9a65cc0a 1788 threshold = (unsigned HOST_WIDE_INT)PARAM_VALUE (PARAM_LARGE_STACK_FRAME);
581bf1c2 1789 /* In case the alloca is located at function entry, it has the same lifetime
1790 as a declared array, so we allow a larger size. */
9a65cc0a 1791 block = gimple_block (stmt);
1792 if (!(cfun->after_inlining
1793 && TREE_CODE (BLOCK_SUPERCONTEXT (block)) == FUNCTION_DECL))
1794 threshold /= 10;
1795 if (size > threshold)
1796 return NULL_TREE;
1797
1798 /* Declare array. */
1799 elem_type = build_nonstandard_integer_type (BITS_PER_UNIT, 1);
1800 n_elem = size * 8 / BITS_PER_UNIT;
9a65cc0a 1801 array_type = build_array_type_nelts (elem_type, n_elem);
1802 var = create_tmp_var (array_type, NULL);
581bf1c2 1803 DECL_ALIGN (var) = TREE_INT_CST_LOW (gimple_call_arg (stmt, 1));
3d4a0a4b 1804 {
1805 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (lhs);
1806 if (pi != NULL && !pi->pt.anything)
1807 {
1808 bool singleton_p;
1809 unsigned uid;
1810 singleton_p = pt_solution_singleton_p (&pi->pt, &uid);
1811 gcc_assert (singleton_p);
1812 SET_DECL_PT_UID (var, uid);
1813 }
1814 }
9a65cc0a 1815
1816 /* Fold alloca to the address of the array. */
1817 return fold_convert (TREE_TYPE (lhs), build_fold_addr_expr (var));
1818}
1819
6688f8ec 1820/* Fold the stmt at *GSI with CCP specific information that propagating
1821 and regular folding does not catch. */
1822
1823static bool
1824ccp_fold_stmt (gimple_stmt_iterator *gsi)
1825{
1826 gimple stmt = gsi_stmt (*gsi);
6688f8ec 1827
94144e68 1828 switch (gimple_code (stmt))
1829 {
1830 case GIMPLE_COND:
1831 {
1832 prop_value_t val;
1833 /* Statement evaluation will handle type mismatches in constants
1834 more gracefully than the final propagation. This allows us to
1835 fold more conditionals here. */
1836 val = evaluate_stmt (stmt);
1837 if (val.lattice_val != CONSTANT
cf8f0e63 1838 || !val.mask.is_zero ())
94144e68 1839 return false;
1840
b7e55469 1841 if (dump_file)
1842 {
1843 fprintf (dump_file, "Folding predicate ");
1844 print_gimple_expr (dump_file, stmt, 0, 0);
1845 fprintf (dump_file, " to ");
1846 print_generic_expr (dump_file, val.value, 0);
1847 fprintf (dump_file, "\n");
1848 }
1849
94144e68 1850 if (integer_zerop (val.value))
1851 gimple_cond_make_false (stmt);
1852 else
1853 gimple_cond_make_true (stmt);
6688f8ec 1854
94144e68 1855 return true;
1856 }
6688f8ec 1857
94144e68 1858 case GIMPLE_CALL:
1859 {
1860 tree lhs = gimple_call_lhs (stmt);
3064bb7b 1861 int flags = gimple_call_flags (stmt);
15d138c9 1862 tree val;
94144e68 1863 tree argt;
1864 bool changed = false;
1865 unsigned i;
1866
1867 /* If the call was folded into a constant make sure it goes
1868 away even if we cannot propagate into all uses because of
1869 type issues. */
1870 if (lhs
1871 && TREE_CODE (lhs) == SSA_NAME
3064bb7b 1872 && (val = get_constant_value (lhs))
1873 /* Don't optimize away calls that have side-effects. */
1874 && (flags & (ECF_CONST|ECF_PURE)) != 0
1875 && (flags & ECF_LOOPING_CONST_OR_PURE) == 0)
94144e68 1876 {
15d138c9 1877 tree new_rhs = unshare_expr (val);
338cce8f 1878 bool res;
94144e68 1879 if (!useless_type_conversion_p (TREE_TYPE (lhs),
1880 TREE_TYPE (new_rhs)))
1881 new_rhs = fold_convert (TREE_TYPE (lhs), new_rhs);
338cce8f 1882 res = update_call_from_tree (gsi, new_rhs);
1883 gcc_assert (res);
94144e68 1884 return true;
1885 }
1886
fb049fba 1887 /* Internal calls provide no argument types, so the extra laxity
1888 for normal calls does not apply. */
1889 if (gimple_call_internal_p (stmt))
1890 return false;
1891
581bf1c2 1892 /* The heuristic of fold_builtin_alloca_with_align differs before and
1893 after inlining, so we don't require the arg to be changed into a
1894 constant for folding, but just to be constant. */
1895 if (gimple_call_builtin_p (stmt, BUILT_IN_ALLOCA_WITH_ALIGN))
9a65cc0a 1896 {
581bf1c2 1897 tree new_rhs = fold_builtin_alloca_with_align (stmt);
6e93d308 1898 if (new_rhs)
1899 {
1900 bool res = update_call_from_tree (gsi, new_rhs);
582a80ed 1901 tree var = TREE_OPERAND (TREE_OPERAND (new_rhs, 0),0);
6e93d308 1902 gcc_assert (res);
582a80ed 1903 insert_clobbers_for_var (*gsi, var);
6e93d308 1904 return true;
1905 }
9a65cc0a 1906 }
1907
94144e68 1908 /* Propagate into the call arguments. Compared to replace_uses_in
1909 this can use the argument slot types for type verification
1910 instead of the current argument type. We also can safely
1911 drop qualifiers here as we are dealing with constants anyway. */
2de00a2d 1912 argt = TYPE_ARG_TYPES (gimple_call_fntype (stmt));
94144e68 1913 for (i = 0; i < gimple_call_num_args (stmt) && argt;
1914 ++i, argt = TREE_CHAIN (argt))
1915 {
1916 tree arg = gimple_call_arg (stmt, i);
1917 if (TREE_CODE (arg) == SSA_NAME
15d138c9 1918 && (val = get_constant_value (arg))
94144e68 1919 && useless_type_conversion_p
1920 (TYPE_MAIN_VARIANT (TREE_VALUE (argt)),
15d138c9 1921 TYPE_MAIN_VARIANT (TREE_TYPE (val))))
94144e68 1922 {
15d138c9 1923 gimple_call_set_arg (stmt, i, unshare_expr (val));
94144e68 1924 changed = true;
1925 }
1926 }
e16f4c39 1927
94144e68 1928 return changed;
1929 }
6688f8ec 1930
6872bf3c 1931 case GIMPLE_ASSIGN:
1932 {
1933 tree lhs = gimple_assign_lhs (stmt);
15d138c9 1934 tree val;
6872bf3c 1935
1936 /* If we have a load that turned out to be constant replace it
1937 as we cannot propagate into all uses in all cases. */
1938 if (gimple_assign_single_p (stmt)
1939 && TREE_CODE (lhs) == SSA_NAME
15d138c9 1940 && (val = get_constant_value (lhs)))
6872bf3c 1941 {
15d138c9 1942 tree rhs = unshare_expr (val);
6872bf3c 1943 if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
182cf5a9 1944 rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lhs), rhs);
6872bf3c 1945 gimple_assign_set_rhs_from_tree (gsi, rhs);
1946 return true;
1947 }
1948
1949 return false;
1950 }
1951
94144e68 1952 default:
1953 return false;
1954 }
6688f8ec 1955}
1956
41511585 1957/* Visit the assignment statement STMT. Set the value of its LHS to the
88dbf20f 1958 value computed by the RHS and store LHS in *OUTPUT_P. If STMT
1959 creates virtual definitions, set the value of each new name to that
75a70cf9 1960 of the RHS (if we can derive a constant out of the RHS).
1961 Value-returning call statements also perform an assignment, and
1962 are handled here. */
4ee9c684 1963
41511585 1964static enum ssa_prop_result
75a70cf9 1965visit_assignment (gimple stmt, tree *output_p)
4ee9c684 1966{
88dbf20f 1967 prop_value_t val;
88dbf20f 1968 enum ssa_prop_result retval;
4ee9c684 1969
75a70cf9 1970 tree lhs = gimple_get_lhs (stmt);
4ee9c684 1971
75a70cf9 1972 gcc_assert (gimple_code (stmt) != GIMPLE_CALL
1973 || gimple_call_lhs (stmt) != NULL_TREE);
1974
15d138c9 1975 if (gimple_assign_single_p (stmt)
1976 && gimple_assign_rhs_code (stmt) == SSA_NAME)
1977 /* For a simple copy operation, we copy the lattice values. */
1978 val = *get_value (gimple_assign_rhs1 (stmt));
41511585 1979 else
75a70cf9 1980 /* Evaluate the statement, which could be
1981 either a GIMPLE_ASSIGN or a GIMPLE_CALL. */
04236c3a 1982 val = evaluate_stmt (stmt);
4ee9c684 1983
88dbf20f 1984 retval = SSA_PROP_NOT_INTERESTING;
4ee9c684 1985
41511585 1986 /* Set the lattice value of the statement's output. */
88dbf20f 1987 if (TREE_CODE (lhs) == SSA_NAME)
4ee9c684 1988 {
88dbf20f 1989 /* If STMT is an assignment to an SSA_NAME, we only have one
1990 value to set. */
1991 if (set_lattice_value (lhs, val))
1992 {
1993 *output_p = lhs;
1994 if (val.lattice_val == VARYING)
1995 retval = SSA_PROP_VARYING;
1996 else
1997 retval = SSA_PROP_INTERESTING;
1998 }
4ee9c684 1999 }
88dbf20f 2000
2001 return retval;
4ee9c684 2002}
2003
4ee9c684 2004
41511585 2005/* Visit the conditional statement STMT. Return SSA_PROP_INTERESTING
2006 if it can determine which edge will be taken. Otherwise, return
2007 SSA_PROP_VARYING. */
2008
2009static enum ssa_prop_result
75a70cf9 2010visit_cond_stmt (gimple stmt, edge *taken_edge_p)
4ee9c684 2011{
88dbf20f 2012 prop_value_t val;
41511585 2013 basic_block block;
2014
75a70cf9 2015 block = gimple_bb (stmt);
41511585 2016 val = evaluate_stmt (stmt);
b7e55469 2017 if (val.lattice_val != CONSTANT
cf8f0e63 2018 || !val.mask.is_zero ())
b7e55469 2019 return SSA_PROP_VARYING;
41511585 2020
2021 /* Find which edge out of the conditional block will be taken and add it
2022 to the worklist. If no single edge can be determined statically,
2023 return SSA_PROP_VARYING to feed all the outgoing edges to the
2024 propagation engine. */
b7e55469 2025 *taken_edge_p = find_taken_edge (block, val.value);
41511585 2026 if (*taken_edge_p)
2027 return SSA_PROP_INTERESTING;
2028 else
2029 return SSA_PROP_VARYING;
4ee9c684 2030}
2031
4ee9c684 2032
41511585 2033/* Evaluate statement STMT. If the statement produces an output value and
2034 its evaluation changes the lattice value of its output, return
2035 SSA_PROP_INTERESTING and set *OUTPUT_P to the SSA_NAME holding the
2036 output value.
48e1416a 2037
41511585 2038 If STMT is a conditional branch and we can determine its truth
2039 value, set *TAKEN_EDGE_P accordingly. If STMT produces a varying
2040 value, return SSA_PROP_VARYING. */
4ee9c684 2041
41511585 2042static enum ssa_prop_result
75a70cf9 2043ccp_visit_stmt (gimple stmt, edge *taken_edge_p, tree *output_p)
41511585 2044{
41511585 2045 tree def;
2046 ssa_op_iter iter;
4ee9c684 2047
41511585 2048 if (dump_file && (dump_flags & TDF_DETAILS))
4ee9c684 2049 {
88dbf20f 2050 fprintf (dump_file, "\nVisiting statement:\n");
75a70cf9 2051 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
4ee9c684 2052 }
4ee9c684 2053
75a70cf9 2054 switch (gimple_code (stmt))
4ee9c684 2055 {
75a70cf9 2056 case GIMPLE_ASSIGN:
2057 /* If the statement is an assignment that produces a single
2058 output value, evaluate its RHS to see if the lattice value of
2059 its output has changed. */
2060 return visit_assignment (stmt, output_p);
2061
2062 case GIMPLE_CALL:
2063 /* A value-returning call also performs an assignment. */
2064 if (gimple_call_lhs (stmt) != NULL_TREE)
2065 return visit_assignment (stmt, output_p);
2066 break;
2067
2068 case GIMPLE_COND:
2069 case GIMPLE_SWITCH:
2070 /* If STMT is a conditional branch, see if we can determine
2071 which branch will be taken. */
2072 /* FIXME. It appears that we should be able to optimize
2073 computed GOTOs here as well. */
2074 return visit_cond_stmt (stmt, taken_edge_p);
2075
2076 default:
2077 break;
4ee9c684 2078 }
4ee9c684 2079
41511585 2080 /* Any other kind of statement is not interesting for constant
2081 propagation and, therefore, not worth simulating. */
41511585 2082 if (dump_file && (dump_flags & TDF_DETAILS))
2083 fprintf (dump_file, "No interesting values produced. Marked VARYING.\n");
4ee9c684 2084
41511585 2085 /* Definitions made by statements other than assignments to
2086 SSA_NAMEs represent unknown modifications to their outputs.
2087 Mark them VARYING. */
88dbf20f 2088 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
2089 {
b7e55469 2090 prop_value_t v = { VARYING, NULL_TREE, { -1, (HOST_WIDE_INT) -1 } };
88dbf20f 2091 set_lattice_value (def, v);
2092 }
4ee9c684 2093
41511585 2094 return SSA_PROP_VARYING;
2095}
4ee9c684 2096
4ee9c684 2097
88dbf20f 2098/* Main entry point for SSA Conditional Constant Propagation. */
41511585 2099
33a34f1e 2100static unsigned int
61207d43 2101do_ssa_ccp (void)
41511585 2102{
582a80ed 2103 unsigned int todo = 0;
2104 calculate_dominance_info (CDI_DOMINATORS);
41511585 2105 ccp_initialize ();
2106 ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node);
33a34f1e 2107 if (ccp_finalize ())
582a80ed 2108 todo = (TODO_cleanup_cfg | TODO_update_ssa | TODO_remove_unused_locals);
2109 free_dominance_info (CDI_DOMINATORS);
2110 return todo;
4ee9c684 2111}
2112
5664499b 2113
2114static bool
41511585 2115gate_ccp (void)
5664499b 2116{
41511585 2117 return flag_tree_ccp != 0;
5664499b 2118}
2119
4ee9c684 2120
48e1416a 2121struct gimple_opt_pass pass_ccp =
41511585 2122{
20099e35 2123 {
2124 GIMPLE_PASS,
41511585 2125 "ccp", /* name */
c7875731 2126 OPTGROUP_NONE, /* optinfo_flags */
41511585 2127 gate_ccp, /* gate */
88dbf20f 2128 do_ssa_ccp, /* execute */
41511585 2129 NULL, /* sub */
2130 NULL, /* next */
2131 0, /* static_pass_number */
2132 TV_TREE_CCP, /* tv_id */
49290934 2133 PROP_cfg | PROP_ssa, /* properties_required */
41511585 2134 0, /* properties_provided */
b6246c40 2135 0, /* properties_destroyed */
41511585 2136 0, /* todo_flags_start */
771e2890 2137 TODO_verify_ssa
5b48275c 2138 | TODO_update_address_taken
20099e35 2139 | TODO_verify_stmts | TODO_ggc_collect/* todo_flags_finish */
2140 }
41511585 2141};
4ee9c684 2142
4ee9c684 2143
75a70cf9 2144
bdd0e199 2145/* Try to optimize out __builtin_stack_restore. Optimize it out
2146 if there is another __builtin_stack_restore in the same basic
2147 block and no calls or ASM_EXPRs are in between, or if this block's
2148 only outgoing edge is to EXIT_BLOCK and there are no calls or
2149 ASM_EXPRs after this __builtin_stack_restore. */
2150
2151static tree
75a70cf9 2152optimize_stack_restore (gimple_stmt_iterator i)
bdd0e199 2153{
6ea999da 2154 tree callee;
2155 gimple stmt;
75a70cf9 2156
2157 basic_block bb = gsi_bb (i);
2158 gimple call = gsi_stmt (i);
bdd0e199 2159
75a70cf9 2160 if (gimple_code (call) != GIMPLE_CALL
2161 || gimple_call_num_args (call) != 1
2162 || TREE_CODE (gimple_call_arg (call, 0)) != SSA_NAME
2163 || !POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (call, 0))))
bdd0e199 2164 return NULL_TREE;
2165
75a70cf9 2166 for (gsi_next (&i); !gsi_end_p (i); gsi_next (&i))
bdd0e199 2167 {
75a70cf9 2168 stmt = gsi_stmt (i);
2169 if (gimple_code (stmt) == GIMPLE_ASM)
bdd0e199 2170 return NULL_TREE;
75a70cf9 2171 if (gimple_code (stmt) != GIMPLE_CALL)
bdd0e199 2172 continue;
2173
75a70cf9 2174 callee = gimple_call_fndecl (stmt);
c40a6f90 2175 if (!callee
2176 || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
2177 /* All regular builtins are ok, just obviously not alloca. */
581bf1c2 2178 || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA
2179 || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA_WITH_ALIGN)
bdd0e199 2180 return NULL_TREE;
2181
2182 if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)
6ea999da 2183 goto second_stack_restore;
bdd0e199 2184 }
2185
6ea999da 2186 if (!gsi_end_p (i))
bdd0e199 2187 return NULL_TREE;
2188
6ea999da 2189 /* Allow one successor of the exit block, or zero successors. */
2190 switch (EDGE_COUNT (bb->succs))
2191 {
2192 case 0:
2193 break;
2194 case 1:
2195 if (single_succ_edge (bb)->dest != EXIT_BLOCK_PTR)
2196 return NULL_TREE;
2197 break;
2198 default:
2199 return NULL_TREE;
2200 }
2201 second_stack_restore:
bdd0e199 2202
6ea999da 2203 /* If there's exactly one use, then zap the call to __builtin_stack_save.
2204 If there are multiple uses, then the last one should remove the call.
2205 In any case, whether the call to __builtin_stack_save can be removed
2206 or not is irrelevant to removing the call to __builtin_stack_restore. */
2207 if (has_single_use (gimple_call_arg (call, 0)))
2208 {
2209 gimple stack_save = SSA_NAME_DEF_STMT (gimple_call_arg (call, 0));
2210 if (is_gimple_call (stack_save))
2211 {
2212 callee = gimple_call_fndecl (stack_save);
2213 if (callee
2214 && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
2215 && DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_SAVE)
2216 {
2217 gimple_stmt_iterator stack_save_gsi;
2218 tree rhs;
bdd0e199 2219
6ea999da 2220 stack_save_gsi = gsi_for_stmt (stack_save);
2221 rhs = build_int_cst (TREE_TYPE (gimple_call_arg (call, 0)), 0);
2222 update_call_from_tree (&stack_save_gsi, rhs);
2223 }
2224 }
2225 }
bdd0e199 2226
75a70cf9 2227 /* No effect, so the statement will be deleted. */
bdd0e199 2228 return integer_zero_node;
2229}
75a70cf9 2230
8a58ed0a 2231/* If va_list type is a simple pointer and nothing special is needed,
2232 optimize __builtin_va_start (&ap, 0) into ap = __builtin_next_arg (0),
2233 __builtin_va_end (&ap) out as NOP and __builtin_va_copy into a simple
2234 pointer assignment. */
2235
2236static tree
75a70cf9 2237optimize_stdarg_builtin (gimple call)
8a58ed0a 2238{
5f57a8b1 2239 tree callee, lhs, rhs, cfun_va_list;
8a58ed0a 2240 bool va_list_simple_ptr;
389dd41b 2241 location_t loc = gimple_location (call);
8a58ed0a 2242
75a70cf9 2243 if (gimple_code (call) != GIMPLE_CALL)
8a58ed0a 2244 return NULL_TREE;
2245
75a70cf9 2246 callee = gimple_call_fndecl (call);
5f57a8b1 2247
2248 cfun_va_list = targetm.fn_abi_va_list (callee);
2249 va_list_simple_ptr = POINTER_TYPE_P (cfun_va_list)
2250 && (TREE_TYPE (cfun_va_list) == void_type_node
2251 || TREE_TYPE (cfun_va_list) == char_type_node);
2252
8a58ed0a 2253 switch (DECL_FUNCTION_CODE (callee))
2254 {
2255 case BUILT_IN_VA_START:
2256 if (!va_list_simple_ptr
2257 || targetm.expand_builtin_va_start != NULL
e7ed5dd7 2258 || !builtin_decl_explicit_p (BUILT_IN_NEXT_ARG))
8a58ed0a 2259 return NULL_TREE;
2260
75a70cf9 2261 if (gimple_call_num_args (call) != 2)
8a58ed0a 2262 return NULL_TREE;
2263
75a70cf9 2264 lhs = gimple_call_arg (call, 0);
8a58ed0a 2265 if (!POINTER_TYPE_P (TREE_TYPE (lhs))
2266 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
5f57a8b1 2267 != TYPE_MAIN_VARIANT (cfun_va_list))
8a58ed0a 2268 return NULL_TREE;
48e1416a 2269
389dd41b 2270 lhs = build_fold_indirect_ref_loc (loc, lhs);
b9a16870 2271 rhs = build_call_expr_loc (loc, builtin_decl_explicit (BUILT_IN_NEXT_ARG),
75a70cf9 2272 1, integer_zero_node);
389dd41b 2273 rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
8a58ed0a 2274 return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
2275
2276 case BUILT_IN_VA_COPY:
2277 if (!va_list_simple_ptr)
2278 return NULL_TREE;
2279
75a70cf9 2280 if (gimple_call_num_args (call) != 2)
8a58ed0a 2281 return NULL_TREE;
2282
75a70cf9 2283 lhs = gimple_call_arg (call, 0);
8a58ed0a 2284 if (!POINTER_TYPE_P (TREE_TYPE (lhs))
2285 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
5f57a8b1 2286 != TYPE_MAIN_VARIANT (cfun_va_list))
8a58ed0a 2287 return NULL_TREE;
2288
389dd41b 2289 lhs = build_fold_indirect_ref_loc (loc, lhs);
75a70cf9 2290 rhs = gimple_call_arg (call, 1);
8a58ed0a 2291 if (TYPE_MAIN_VARIANT (TREE_TYPE (rhs))
5f57a8b1 2292 != TYPE_MAIN_VARIANT (cfun_va_list))
8a58ed0a 2293 return NULL_TREE;
2294
389dd41b 2295 rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
8a58ed0a 2296 return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
2297
2298 case BUILT_IN_VA_END:
75a70cf9 2299 /* No effect, so the statement will be deleted. */
8a58ed0a 2300 return integer_zero_node;
2301
2302 default:
2303 gcc_unreachable ();
2304 }
2305}
75a70cf9 2306
f87df69a 2307/* Attemp to make the block of __builtin_unreachable I unreachable by changing
2308 the incoming jumps. Return true if at least one jump was changed. */
2309
2310static bool
2311optimize_unreachable (gimple_stmt_iterator i)
2312{
2313 basic_block bb = gsi_bb (i);
2314 gimple_stmt_iterator gsi;
2315 gimple stmt;
2316 edge_iterator ei;
2317 edge e;
2318 bool ret;
2319
2320 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2321 {
2322 stmt = gsi_stmt (gsi);
2323
2324 if (is_gimple_debug (stmt))
2325 continue;
2326
2327 if (gimple_code (stmt) == GIMPLE_LABEL)
2328 {
2329 /* Verify we do not need to preserve the label. */
2330 if (FORCED_LABEL (gimple_label_label (stmt)))
2331 return false;
2332
2333 continue;
2334 }
2335
2336 /* Only handle the case that __builtin_unreachable is the first statement
2337 in the block. We rely on DCE to remove stmts without side-effects
2338 before __builtin_unreachable. */
2339 if (gsi_stmt (gsi) != gsi_stmt (i))
2340 return false;
2341 }
2342
2343 ret = false;
2344 FOR_EACH_EDGE (e, ei, bb->preds)
2345 {
2346 gsi = gsi_last_bb (e->src);
522f73a1 2347 if (gsi_end_p (gsi))
2348 continue;
f87df69a 2349
522f73a1 2350 stmt = gsi_stmt (gsi);
2351 if (gimple_code (stmt) == GIMPLE_COND)
f87df69a 2352 {
2353 if (e->flags & EDGE_TRUE_VALUE)
2354 gimple_cond_make_false (stmt);
2355 else if (e->flags & EDGE_FALSE_VALUE)
2356 gimple_cond_make_true (stmt);
2357 else
2358 gcc_unreachable ();
a03a52b4 2359 update_stmt (stmt);
f87df69a 2360 }
2361 else
2362 {
2363 /* Todo: handle other cases, f.i. switch statement. */
2364 continue;
2365 }
2366
2367 ret = true;
2368 }
2369
2370 return ret;
2371}
2372
4ee9c684 2373/* A simple pass that attempts to fold all builtin functions. This pass
2374 is run after we've propagated as many constants as we can. */
2375
2a1990e9 2376static unsigned int
4ee9c684 2377execute_fold_all_builtins (void)
2378{
b36237eb 2379 bool cfg_changed = false;
4ee9c684 2380 basic_block bb;
b1b7c0c4 2381 unsigned int todoflags = 0;
48e1416a 2382
4ee9c684 2383 FOR_EACH_BB (bb)
2384 {
75a70cf9 2385 gimple_stmt_iterator i;
2386 for (i = gsi_start_bb (bb); !gsi_end_p (i); )
4ee9c684 2387 {
75a70cf9 2388 gimple stmt, old_stmt;
4ee9c684 2389 tree callee, result;
0a39fd54 2390 enum built_in_function fcode;
4ee9c684 2391
75a70cf9 2392 stmt = gsi_stmt (i);
2393
2394 if (gimple_code (stmt) != GIMPLE_CALL)
0a39fd54 2395 {
75a70cf9 2396 gsi_next (&i);
0a39fd54 2397 continue;
2398 }
75a70cf9 2399 callee = gimple_call_fndecl (stmt);
4ee9c684 2400 if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
0a39fd54 2401 {
75a70cf9 2402 gsi_next (&i);
0a39fd54 2403 continue;
2404 }
2405 fcode = DECL_FUNCTION_CODE (callee);
4ee9c684 2406
2d18b16d 2407 result = gimple_fold_builtin (stmt);
5a4b7e1e 2408
2409 if (result)
75a70cf9 2410 gimple_remove_stmt_histograms (cfun, stmt);
5a4b7e1e 2411
4ee9c684 2412 if (!result)
2413 switch (DECL_FUNCTION_CODE (callee))
2414 {
2415 case BUILT_IN_CONSTANT_P:
2416 /* Resolve __builtin_constant_p. If it hasn't been
2417 folded to integer_one_node by now, it's fairly
2418 certain that the value simply isn't constant. */
75a70cf9 2419 result = integer_zero_node;
4ee9c684 2420 break;
2421
fca0886c 2422 case BUILT_IN_ASSUME_ALIGNED:
2423 /* Remove __builtin_assume_aligned. */
2424 result = gimple_call_arg (stmt, 0);
2425 break;
2426
bdd0e199 2427 case BUILT_IN_STACK_RESTORE:
75a70cf9 2428 result = optimize_stack_restore (i);
8a58ed0a 2429 if (result)
2430 break;
75a70cf9 2431 gsi_next (&i);
8a58ed0a 2432 continue;
2433
f87df69a 2434 case BUILT_IN_UNREACHABLE:
2435 if (optimize_unreachable (i))
2436 cfg_changed = true;
2437 break;
2438
8a58ed0a 2439 case BUILT_IN_VA_START:
2440 case BUILT_IN_VA_END:
2441 case BUILT_IN_VA_COPY:
2442 /* These shouldn't be folded before pass_stdarg. */
75a70cf9 2443 result = optimize_stdarg_builtin (stmt);
bdd0e199 2444 if (result)
2445 break;
2446 /* FALLTHRU */
2447
4ee9c684 2448 default:
75a70cf9 2449 gsi_next (&i);
4ee9c684 2450 continue;
2451 }
2452
f87df69a 2453 if (result == NULL_TREE)
2454 break;
2455
4ee9c684 2456 if (dump_file && (dump_flags & TDF_DETAILS))
2457 {
2458 fprintf (dump_file, "Simplified\n ");
75a70cf9 2459 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
4ee9c684 2460 }
2461
75a70cf9 2462 old_stmt = stmt;
75a70cf9 2463 if (!update_call_from_tree (&i, result))
0fefde02 2464 {
2465 gimplify_and_update_call_from_tree (&i, result);
2466 todoflags |= TODO_update_address_taken;
2467 }
de6ed584 2468
75a70cf9 2469 stmt = gsi_stmt (i);
4c5fd53c 2470 update_stmt (stmt);
de6ed584 2471
75a70cf9 2472 if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt)
2473 && gimple_purge_dead_eh_edges (bb))
b36237eb 2474 cfg_changed = true;
4ee9c684 2475
2476 if (dump_file && (dump_flags & TDF_DETAILS))
2477 {
2478 fprintf (dump_file, "to\n ");
75a70cf9 2479 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
4ee9c684 2480 fprintf (dump_file, "\n");
2481 }
0a39fd54 2482
2483 /* Retry the same statement if it changed into another
2484 builtin, there might be new opportunities now. */
75a70cf9 2485 if (gimple_code (stmt) != GIMPLE_CALL)
0a39fd54 2486 {
75a70cf9 2487 gsi_next (&i);
0a39fd54 2488 continue;
2489 }
75a70cf9 2490 callee = gimple_call_fndecl (stmt);
0a39fd54 2491 if (!callee
75a70cf9 2492 || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
0a39fd54 2493 || DECL_FUNCTION_CODE (callee) == fcode)
75a70cf9 2494 gsi_next (&i);
4ee9c684 2495 }
2496 }
48e1416a 2497
b36237eb 2498 /* Delete unreachable blocks. */
b1b7c0c4 2499 if (cfg_changed)
2500 todoflags |= TODO_cleanup_cfg;
48e1416a 2501
b1b7c0c4 2502 return todoflags;
4ee9c684 2503}
2504
41511585 2505
48e1416a 2506struct gimple_opt_pass pass_fold_builtins =
4ee9c684 2507{
20099e35 2508 {
2509 GIMPLE_PASS,
4ee9c684 2510 "fab", /* name */
c7875731 2511 OPTGROUP_NONE, /* optinfo_flags */
4ee9c684 2512 NULL, /* gate */
2513 execute_fold_all_builtins, /* execute */
2514 NULL, /* sub */
2515 NULL, /* next */
2516 0, /* static_pass_number */
0b1615c1 2517 TV_NONE, /* tv_id */
49290934 2518 PROP_cfg | PROP_ssa, /* properties_required */
4ee9c684 2519 0, /* properties_provided */
2520 0, /* properties_destroyed */
2521 0, /* todo_flags_start */
771e2890 2522 TODO_verify_ssa
20099e35 2523 | TODO_update_ssa /* todo_flags_finish */
2524 }
4ee9c684 2525};