1 /* Conditional constant propagation pass for the GNU compiler.
2 Copyright (C) 2000-2022 Free Software Foundation, Inc.
3 Adapted from original RTL SSA-CCP by Daniel Berlin <dberlin@dberlin.org>
4 Adapted to GIMPLE trees by Diego Novillo <dnovillo@redhat.com>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 3, or (at your option) any
11 later version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 /* Conditional constant propagation (CCP) is based on the SSA
23 propagation engine (tree-ssa-propagate.cc). Constant assignments of
24 the form VAR = CST are propagated from the assignments into uses of
25 VAR, which in turn may generate new constants. The simulation uses
26 a four level lattice to keep track of constant values associated
27 with SSA names. Given an SSA name V_i, it may take one of the
28 following values:
29
30 UNINITIALIZED -> the initial state of the value. This value
31 is replaced with a correct initial value
32 the first time the value is used, so the
33 rest of the pass does not need to care about
34 it. Using this value simplifies initialization
35 of the pass, and prevents us from needlessly
36 scanning statements that are never reached.
37
38 UNDEFINED -> V_i is a local variable whose definition
39 has not been processed yet. Therefore we
40 don't yet know if its value is a constant
41 or not.
42
43 CONSTANT -> V_i has been found to hold a constant
44 value C.
45
46 VARYING -> V_i cannot take a constant value, or if it
47 does, it is not possible to determine it
48 at compile time.
49
50 The core of SSA-CCP is in ccp_visit_stmt and ccp_visit_phi_node:
51
52 1- In ccp_visit_stmt, we are interested in assignments whose RHS
53 evaluates into a constant and conditional jumps whose predicate
54 evaluates into a boolean true or false. When an assignment of
55 the form V_i = CONST is found, V_i's lattice value is set to
56 CONSTANT and CONST is associated with it. This causes the
57 propagation engine to add all the SSA edges coming out the
58 assignment into the worklists, so that statements that use V_i
59 can be visited.
60
61 If the statement is a conditional with a constant predicate, we
62 mark the outgoing edges as executable or not executable
63 depending on the predicate's value. This is then used when
64 visiting PHI nodes to know when a PHI argument can be ignored.
65
66
67 2- In ccp_visit_phi_node, if all the PHI arguments evaluate to the
68 same constant C, then the LHS of the PHI is set to C. This
69 evaluation is known as the "meet operation". Since one of the
70 goals of this evaluation is to optimistically return constant
71 values as often as possible, it uses two main short cuts:
72
73 - If an argument is flowing in through a non-executable edge, it
74 is ignored. This is useful in cases like this:
75
76 if (PRED)
77 a_9 = 3;
78 else
79 a_10 = 100;
80 a_11 = PHI (a_9, a_10)
81
82 If PRED is known to always evaluate to false, then we can
83 assume that a_11 will always take its value from a_10, meaning
84 that instead of consider it VARYING (a_9 and a_10 have
85 different values), we can consider it CONSTANT 100.
86
87 - If an argument has an UNDEFINED value, then it does not affect
88 the outcome of the meet operation. If a variable V_i has an
89 UNDEFINED value, it means that either its defining statement
90 hasn't been visited yet or V_i has no defining statement, in
91 which case the original symbol 'V' is being used
92 uninitialized. Since 'V' is a local variable, the compiler
93 may assume any initial value for it.
94
95
96 After propagation, every variable V_i that ends up with a lattice
97 value of CONSTANT will have the associated constant value in the
98 array CONST_VAL[i].VALUE. That is fed into substitute_and_fold for
99 final substitution and folding.
100
101 This algorithm uses wide-ints at the max precision of the target.
102 This means that, with one uninteresting exception, variables with
103 UNSIGNED types never go to VARYING because the bits above the
104 precision of the type of the variable are always zero. The
105 uninteresting case is a variable of UNSIGNED type that has the
106 maximum precision of the target. Such variables can go to VARYING,
107 but this causes no loss of infomation since these variables will
108 never be extended.
109
110 References:
111
112 Constant propagation with conditional branches,
113 Wegman and Zadeck, ACM TOPLAS 13(2):181-210.
114
115 Building an Optimizing Compiler,
116 Robert Morgan, Butterworth-Heinemann, 1998, Section 8.9.
117
118 Advanced Compiler Design and Implementation,
119 Steven Muchnick, Morgan Kaufmann, 1997, Section 12.6 */
120
121 #include "config.h"
122 #include "system.h"
123 #include "coretypes.h"
124 #include "backend.h"
125 #include "target.h"
126 #include "tree.h"
127 #include "gimple.h"
128 #include "tree-pass.h"
129 #include "ssa.h"
130 #include "gimple-pretty-print.h"
131 #include "fold-const.h"
132 #include "gimple-fold.h"
133 #include "tree-eh.h"
134 #include "gimplify.h"
135 #include "gimple-iterator.h"
136 #include "tree-cfg.h"
137 #include "tree-ssa-propagate.h"
138 #include "dbgcnt.h"
139 #include "builtins.h"
140 #include "cfgloop.h"
141 #include "stor-layout.h"
142 #include "optabs-query.h"
143 #include "tree-ssa-ccp.h"
144 #include "tree-dfa.h"
145 #include "diagnostic-core.h"
146 #include "stringpool.h"
147 #include "attribs.h"
148 #include "tree-vector-builder.h"
149 #include "cgraph.h"
150 #include "alloc-pool.h"
151 #include "symbol-summary.h"
152 #include "ipa-utils.h"
153 #include "ipa-prop.h"
154 #include "internal-fn.h"
155
156 /* Possible lattice values. */
157 typedef enum
158 {
159 UNINITIALIZED,
160 UNDEFINED,
161 CONSTANT,
162 VARYING
163 } ccp_lattice_t;
164
165 class ccp_prop_value_t {
166 public:
167 /* Lattice value. */
168 ccp_lattice_t lattice_val;
169
170 /* Propagated value. */
171 tree value;
172
173 /* Mask that applies to the propagated value during CCP. For X
174 with a CONSTANT lattice value X & ~mask == value & ~mask. The
175 zero bits in the mask cover constant values. The ones mean no
176 information. */
177 widest_int mask;
178 };
179
180 class ccp_propagate : public ssa_propagation_engine
181 {
182 public:
183 enum ssa_prop_result visit_stmt (gimple *, edge *, tree *) FINAL OVERRIDE;
184 enum ssa_prop_result visit_phi (gphi *) FINAL OVERRIDE;
185 };
186
187 /* Array of propagated constant values. After propagation,
188 CONST_VAL[I].VALUE holds the constant value for SSA_NAME(I). If
189 the constant is held in an SSA name representing a memory store
190 (i.e., a VDEF), CONST_VAL[I].MEM_REF will contain the actual
191 memory reference used to store (i.e., the LHS of the assignment
192 doing the store). */
193 static ccp_prop_value_t *const_val;
194 static unsigned n_const_val;
195
196 static void canonicalize_value (ccp_prop_value_t *);
197 static void ccp_lattice_meet (ccp_prop_value_t *, ccp_prop_value_t *);
198
199 /* Dump constant propagation value VAL to file OUTF prefixed by PREFIX. */
200
201 static void
dump_lattice_value(FILE * outf,const char * prefix,ccp_prop_value_t val)202 dump_lattice_value (FILE *outf, const char *prefix, ccp_prop_value_t val)
203 {
204 switch (val.lattice_val)
205 {
206 case UNINITIALIZED:
207 fprintf (outf, "%sUNINITIALIZED", prefix);
208 break;
209 case UNDEFINED:
210 fprintf (outf, "%sUNDEFINED", prefix);
211 break;
212 case VARYING:
213 fprintf (outf, "%sVARYING", prefix);
214 break;
215 case CONSTANT:
216 if (TREE_CODE (val.value) != INTEGER_CST
217 || val.mask == 0)
218 {
219 fprintf (outf, "%sCONSTANT ", prefix);
220 print_generic_expr (outf, val.value, dump_flags);
221 }
222 else
223 {
224 widest_int cval = wi::bit_and_not (wi::to_widest (val.value),
225 val.mask);
226 fprintf (outf, "%sCONSTANT ", prefix);
227 print_hex (cval, outf);
228 fprintf (outf, " (");
229 print_hex (val.mask, outf);
230 fprintf (outf, ")");
231 }
232 break;
233 default:
234 gcc_unreachable ();
235 }
236 }
237
238
239 /* Print lattice value VAL to stderr. */
240
241 void debug_lattice_value (ccp_prop_value_t val);
242
243 DEBUG_FUNCTION void
debug_lattice_value(ccp_prop_value_t val)244 debug_lattice_value (ccp_prop_value_t val)
245 {
246 dump_lattice_value (stderr, "", val);
247 fprintf (stderr, "\n");
248 }
249
250 /* Extend NONZERO_BITS to a full mask, based on sgn. */
251
252 static widest_int
extend_mask(const wide_int & nonzero_bits,signop sgn)253 extend_mask (const wide_int &nonzero_bits, signop sgn)
254 {
255 return widest_int::from (nonzero_bits, sgn);
256 }
257
258 /* Compute a default value for variable VAR and store it in the
259 CONST_VAL array. The following rules are used to get default
260 values:
261
262 1- Global and static variables that are declared constant are
263 considered CONSTANT.
264
265 2- Any other value is considered UNDEFINED. This is useful when
266 considering PHI nodes. PHI arguments that are undefined do not
267 change the constant value of the PHI node, which allows for more
268 constants to be propagated.
269
270 3- Variables defined by statements other than assignments and PHI
271 nodes are considered VARYING.
272
273 4- Initial values of variables that are not GIMPLE registers are
274 considered VARYING. */
275
276 static ccp_prop_value_t
get_default_value(tree var)277 get_default_value (tree var)
278 {
279 ccp_prop_value_t val = { UNINITIALIZED, NULL_TREE, 0 };
280 gimple *stmt;
281
282 stmt = SSA_NAME_DEF_STMT (var);
283
284 if (gimple_nop_p (stmt))
285 {
286 /* Variables defined by an empty statement are those used
287 before being initialized. If VAR is a local variable, we
288 can assume initially that it is UNDEFINED, otherwise we must
289 consider it VARYING. */
290 if (!virtual_operand_p (var)
291 && SSA_NAME_VAR (var)
292 && TREE_CODE (SSA_NAME_VAR (var)) == VAR_DECL)
293 val.lattice_val = UNDEFINED;
294 else
295 {
296 val.lattice_val = VARYING;
297 val.mask = -1;
298 if (flag_tree_bit_ccp)
299 {
300 wide_int nonzero_bits = get_nonzero_bits (var);
301 tree value;
302 widest_int mask;
303
304 if (SSA_NAME_VAR (var)
305 && TREE_CODE (SSA_NAME_VAR (var)) == PARM_DECL
306 && ipcp_get_parm_bits (SSA_NAME_VAR (var), &value, &mask))
307 {
308 val.lattice_val = CONSTANT;
309 val.value = value;
310 widest_int ipa_value = wi::to_widest (value);
311 /* Unknown bits from IPA CP must be equal to zero. */
312 gcc_assert (wi::bit_and (ipa_value, mask) == 0);
313 val.mask = mask;
314 if (nonzero_bits != -1)
315 val.mask &= extend_mask (nonzero_bits,
316 TYPE_SIGN (TREE_TYPE (var)));
317 }
318 else if (nonzero_bits != -1)
319 {
320 val.lattice_val = CONSTANT;
321 val.value = build_zero_cst (TREE_TYPE (var));
322 val.mask = extend_mask (nonzero_bits,
323 TYPE_SIGN (TREE_TYPE (var)));
324 }
325 }
326 }
327 }
328 else if (is_gimple_assign (stmt))
329 {
330 tree cst;
331 if (gimple_assign_single_p (stmt)
332 && DECL_P (gimple_assign_rhs1 (stmt))
333 && (cst = get_symbol_constant_value (gimple_assign_rhs1 (stmt))))
334 {
335 val.lattice_val = CONSTANT;
336 val.value = cst;
337 }
338 else
339 {
340 /* Any other variable defined by an assignment is considered
341 UNDEFINED. */
342 val.lattice_val = UNDEFINED;
343 }
344 }
345 else if ((is_gimple_call (stmt)
346 && gimple_call_lhs (stmt) != NULL_TREE)
347 || gimple_code (stmt) == GIMPLE_PHI)
348 {
349 /* A variable defined by a call or a PHI node is considered
350 UNDEFINED. */
351 val.lattice_val = UNDEFINED;
352 }
353 else
354 {
355 /* Otherwise, VAR will never take on a constant value. */
356 val.lattice_val = VARYING;
357 val.mask = -1;
358 }
359
360 return val;
361 }
362
363
364 /* Get the constant value associated with variable VAR. */
365
366 static inline ccp_prop_value_t *
get_value(tree var)367 get_value (tree var)
368 {
369 ccp_prop_value_t *val;
370
371 if (const_val == NULL
372 || SSA_NAME_VERSION (var) >= n_const_val)
373 return NULL;
374
375 val = &const_val[SSA_NAME_VERSION (var)];
376 if (val->lattice_val == UNINITIALIZED)
377 *val = get_default_value (var);
378
379 canonicalize_value (val);
380
381 return val;
382 }
383
384 /* Return the constant tree value associated with VAR. */
385
386 static inline tree
get_constant_value(tree var)387 get_constant_value (tree var)
388 {
389 ccp_prop_value_t *val;
390 if (TREE_CODE (var) != SSA_NAME)
391 {
392 if (is_gimple_min_invariant (var))
393 return var;
394 return NULL_TREE;
395 }
396 val = get_value (var);
397 if (val
398 && val->lattice_val == CONSTANT
399 && (TREE_CODE (val->value) != INTEGER_CST
400 || val->mask == 0))
401 return val->value;
402 return NULL_TREE;
403 }
404
405 /* Sets the value associated with VAR to VARYING. */
406
407 static inline void
set_value_varying(tree var)408 set_value_varying (tree var)
409 {
410 ccp_prop_value_t *val = &const_val[SSA_NAME_VERSION (var)];
411
412 val->lattice_val = VARYING;
413 val->value = NULL_TREE;
414 val->mask = -1;
415 }
416
417 /* For integer constants, make sure to drop TREE_OVERFLOW. */
418
419 static void
canonicalize_value(ccp_prop_value_t * val)420 canonicalize_value (ccp_prop_value_t *val)
421 {
422 if (val->lattice_val != CONSTANT)
423 return;
424
425 if (TREE_OVERFLOW_P (val->value))
426 val->value = drop_tree_overflow (val->value);
427 }
428
429 /* Return whether the lattice transition is valid. */
430
431 static bool
valid_lattice_transition(ccp_prop_value_t old_val,ccp_prop_value_t new_val)432 valid_lattice_transition (ccp_prop_value_t old_val, ccp_prop_value_t new_val)
433 {
434 /* Lattice transitions must always be monotonically increasing in
435 value. */
436 if (old_val.lattice_val < new_val.lattice_val)
437 return true;
438
439 if (old_val.lattice_val != new_val.lattice_val)
440 return false;
441
442 if (!old_val.value && !new_val.value)
443 return true;
444
445 /* Now both lattice values are CONSTANT. */
446
447 /* Allow arbitrary copy changes as we might look through PHI <a_1, ...>
448 when only a single copy edge is executable. */
449 if (TREE_CODE (old_val.value) == SSA_NAME
450 && TREE_CODE (new_val.value) == SSA_NAME)
451 return true;
452
453 /* Allow transitioning from a constant to a copy. */
454 if (is_gimple_min_invariant (old_val.value)
455 && TREE_CODE (new_val.value) == SSA_NAME)
456 return true;
457
458 /* Allow transitioning from PHI <&x, not executable> == &x
459 to PHI <&x, &y> == common alignment. */
460 if (TREE_CODE (old_val.value) != INTEGER_CST
461 && TREE_CODE (new_val.value) == INTEGER_CST)
462 return true;
463
464 /* Bit-lattices have to agree in the still valid bits. */
465 if (TREE_CODE (old_val.value) == INTEGER_CST
466 && TREE_CODE (new_val.value) == INTEGER_CST)
467 return (wi::bit_and_not (wi::to_widest (old_val.value), new_val.mask)
468 == wi::bit_and_not (wi::to_widest (new_val.value), new_val.mask));
469
470 /* Otherwise constant values have to agree. */
471 if (operand_equal_p (old_val.value, new_val.value, 0))
472 return true;
473
474 /* At least the kinds and types should agree now. */
475 if (TREE_CODE (old_val.value) != TREE_CODE (new_val.value)
476 || !types_compatible_p (TREE_TYPE (old_val.value),
477 TREE_TYPE (new_val.value)))
478 return false;
479
480 /* For floats and !HONOR_NANS allow transitions from (partial) NaN
481 to non-NaN. */
482 tree type = TREE_TYPE (new_val.value);
483 if (SCALAR_FLOAT_TYPE_P (type)
484 && !HONOR_NANS (type))
485 {
486 if (REAL_VALUE_ISNAN (TREE_REAL_CST (old_val.value)))
487 return true;
488 }
489 else if (VECTOR_FLOAT_TYPE_P (type)
490 && !HONOR_NANS (type))
491 {
492 unsigned int count
493 = tree_vector_builder::binary_encoded_nelts (old_val.value,
494 new_val.value);
495 for (unsigned int i = 0; i < count; ++i)
496 if (!REAL_VALUE_ISNAN
497 (TREE_REAL_CST (VECTOR_CST_ENCODED_ELT (old_val.value, i)))
498 && !operand_equal_p (VECTOR_CST_ENCODED_ELT (old_val.value, i),
499 VECTOR_CST_ENCODED_ELT (new_val.value, i), 0))
500 return false;
501 return true;
502 }
503 else if (COMPLEX_FLOAT_TYPE_P (type)
504 && !HONOR_NANS (type))
505 {
506 if (!REAL_VALUE_ISNAN (TREE_REAL_CST (TREE_REALPART (old_val.value)))
507 && !operand_equal_p (TREE_REALPART (old_val.value),
508 TREE_REALPART (new_val.value), 0))
509 return false;
510 if (!REAL_VALUE_ISNAN (TREE_REAL_CST (TREE_IMAGPART (old_val.value)))
511 && !operand_equal_p (TREE_IMAGPART (old_val.value),
512 TREE_IMAGPART (new_val.value), 0))
513 return false;
514 return true;
515 }
516 return false;
517 }
518
519 /* Set the value for variable VAR to NEW_VAL. Return true if the new
520 value is different from VAR's previous value. */
521
522 static bool
set_lattice_value(tree var,ccp_prop_value_t * new_val)523 set_lattice_value (tree var, ccp_prop_value_t *new_val)
524 {
525 /* We can deal with old UNINITIALIZED values just fine here. */
526 ccp_prop_value_t *old_val = &const_val[SSA_NAME_VERSION (var)];
527
528 canonicalize_value (new_val);
529
530 /* We have to be careful to not go up the bitwise lattice
531 represented by the mask. Instead of dropping to VARYING
532 use the meet operator to retain a conservative value.
533 Missed optimizations like PR65851 makes this necessary.
534 It also ensures we converge to a stable lattice solution. */
535 if (old_val->lattice_val != UNINITIALIZED)
536 ccp_lattice_meet (new_val, old_val);
537
538 gcc_checking_assert (valid_lattice_transition (*old_val, *new_val));
539
540 /* If *OLD_VAL and NEW_VAL are the same, return false to inform the
541 caller that this was a non-transition. */
542 if (old_val->lattice_val != new_val->lattice_val
543 || (new_val->lattice_val == CONSTANT
544 && (TREE_CODE (new_val->value) != TREE_CODE (old_val->value)
545 || (TREE_CODE (new_val->value) == INTEGER_CST
546 && (new_val->mask != old_val->mask
547 || (wi::bit_and_not (wi::to_widest (old_val->value),
548 new_val->mask)
549 != wi::bit_and_not (wi::to_widest (new_val->value),
550 new_val->mask))))
551 || (TREE_CODE (new_val->value) != INTEGER_CST
552 && !operand_equal_p (new_val->value, old_val->value, 0)))))
553 {
554 /* ??? We would like to delay creation of INTEGER_CSTs from
555 partially constants here. */
556
557 if (dump_file && (dump_flags & TDF_DETAILS))
558 {
559 dump_lattice_value (dump_file, "Lattice value changed to ", *new_val);
560 fprintf (dump_file, ". Adding SSA edges to worklist.\n");
561 }
562
563 *old_val = *new_val;
564
565 gcc_assert (new_val->lattice_val != UNINITIALIZED);
566 return true;
567 }
568
569 return false;
570 }
571
572 static ccp_prop_value_t get_value_for_expr (tree, bool);
573 static ccp_prop_value_t bit_value_binop (enum tree_code, tree, tree, tree);
574 void bit_value_binop (enum tree_code, signop, int, widest_int *, widest_int *,
575 signop, int, const widest_int &, const widest_int &,
576 signop, int, const widest_int &, const widest_int &);
577
578 /* Return a widest_int that can be used for bitwise simplifications
579 from VAL. */
580
581 static widest_int
value_to_wide_int(ccp_prop_value_t val)582 value_to_wide_int (ccp_prop_value_t val)
583 {
584 if (val.value
585 && TREE_CODE (val.value) == INTEGER_CST)
586 return wi::to_widest (val.value);
587
588 return 0;
589 }
590
591 /* Return the value for the address expression EXPR based on alignment
592 information. */
593
594 static ccp_prop_value_t
get_value_from_alignment(tree expr)595 get_value_from_alignment (tree expr)
596 {
597 tree type = TREE_TYPE (expr);
598 ccp_prop_value_t val;
599 unsigned HOST_WIDE_INT bitpos;
600 unsigned int align;
601
602 gcc_assert (TREE_CODE (expr) == ADDR_EXPR);
603
604 get_pointer_alignment_1 (expr, &align, &bitpos);
605 val.mask = wi::bit_and_not
606 (POINTER_TYPE_P (type) || TYPE_UNSIGNED (type)
607 ? wi::mask <widest_int> (TYPE_PRECISION (type), false)
608 : -1,
609 align / BITS_PER_UNIT - 1);
610 val.lattice_val
611 = wi::sext (val.mask, TYPE_PRECISION (type)) == -1 ? VARYING : CONSTANT;
612 if (val.lattice_val == CONSTANT)
613 val.value = build_int_cstu (type, bitpos / BITS_PER_UNIT);
614 else
615 val.value = NULL_TREE;
616
617 return val;
618 }
619
620 /* Return the value for the tree operand EXPR. If FOR_BITS_P is true
621 return constant bits extracted from alignment information for
622 invariant addresses. */
623
624 static ccp_prop_value_t
get_value_for_expr(tree expr,bool for_bits_p)625 get_value_for_expr (tree expr, bool for_bits_p)
626 {
627 ccp_prop_value_t val;
628
629 if (TREE_CODE (expr) == SSA_NAME)
630 {
631 ccp_prop_value_t *val_ = get_value (expr);
632 if (val_)
633 val = *val_;
634 else
635 {
636 val.lattice_val = VARYING;
637 val.value = NULL_TREE;
638 val.mask = -1;
639 }
640 if (for_bits_p
641 && val.lattice_val == CONSTANT)
642 {
643 if (TREE_CODE (val.value) == ADDR_EXPR)
644 val = get_value_from_alignment (val.value);
645 else if (TREE_CODE (val.value) != INTEGER_CST)
646 {
647 val.lattice_val = VARYING;
648 val.value = NULL_TREE;
649 val.mask = -1;
650 }
651 }
652 /* Fall back to a copy value. */
653 if (!for_bits_p
654 && val.lattice_val == VARYING
655 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (expr))
656 {
657 val.lattice_val = CONSTANT;
658 val.value = expr;
659 val.mask = -1;
660 }
661 }
662 else if (is_gimple_min_invariant (expr)
663 && (!for_bits_p || TREE_CODE (expr) == INTEGER_CST))
664 {
665 val.lattice_val = CONSTANT;
666 val.value = expr;
667 val.mask = 0;
668 canonicalize_value (&val);
669 }
670 else if (TREE_CODE (expr) == ADDR_EXPR)
671 val = get_value_from_alignment (expr);
672 else
673 {
674 val.lattice_val = VARYING;
675 val.mask = -1;
676 val.value = NULL_TREE;
677 }
678
679 if (val.lattice_val == VARYING
680 && TYPE_UNSIGNED (TREE_TYPE (expr)))
681 val.mask = wi::zext (val.mask, TYPE_PRECISION (TREE_TYPE (expr)));
682
683 return val;
684 }
685
686 /* Return the likely CCP lattice value for STMT.
687
688 If STMT has no operands, then return CONSTANT.
689
690 Else if undefinedness of operands of STMT cause its value to be
691 undefined, then return UNDEFINED.
692
693 Else if any operands of STMT are constants, then return CONSTANT.
694
695 Else return VARYING. */
696
697 static ccp_lattice_t
likely_value(gimple * stmt)698 likely_value (gimple *stmt)
699 {
700 bool has_constant_operand, has_undefined_operand, all_undefined_operands;
701 bool has_nsa_operand;
702 tree use;
703 ssa_op_iter iter;
704 unsigned i;
705
706 enum gimple_code code = gimple_code (stmt);
707
708 /* This function appears to be called only for assignments, calls,
709 conditionals, and switches, due to the logic in visit_stmt. */
710 gcc_assert (code == GIMPLE_ASSIGN
711 || code == GIMPLE_CALL
712 || code == GIMPLE_COND
713 || code == GIMPLE_SWITCH);
714
715 /* If the statement has volatile operands, it won't fold to a
716 constant value. */
717 if (gimple_has_volatile_ops (stmt))
718 return VARYING;
719
720 /* Arrive here for more complex cases. */
721 has_constant_operand = false;
722 has_undefined_operand = false;
723 all_undefined_operands = true;
724 has_nsa_operand = false;
725 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
726 {
727 ccp_prop_value_t *val = get_value (use);
728
729 if (val && val->lattice_val == UNDEFINED)
730 has_undefined_operand = true;
731 else
732 all_undefined_operands = false;
733
734 if (val && val->lattice_val == CONSTANT)
735 has_constant_operand = true;
736
737 if (SSA_NAME_IS_DEFAULT_DEF (use)
738 || !prop_simulate_again_p (SSA_NAME_DEF_STMT (use)))
739 has_nsa_operand = true;
740 }
741
742 /* There may be constants in regular rhs operands. For calls we
743 have to ignore lhs, fndecl and static chain, otherwise only
744 the lhs. */
745 for (i = (is_gimple_call (stmt) ? 2 : 0) + gimple_has_lhs (stmt);
746 i < gimple_num_ops (stmt); ++i)
747 {
748 tree op = gimple_op (stmt, i);
749 if (!op || TREE_CODE (op) == SSA_NAME)
750 continue;
751 if (is_gimple_min_invariant (op))
752 has_constant_operand = true;
753 }
754
755 if (has_constant_operand)
756 all_undefined_operands = false;
757
758 if (has_undefined_operand
759 && code == GIMPLE_CALL
760 && gimple_call_internal_p (stmt))
761 switch (gimple_call_internal_fn (stmt))
762 {
763 /* These 3 builtins use the first argument just as a magic
764 way how to find out a decl uid. */
765 case IFN_GOMP_SIMD_LANE:
766 case IFN_GOMP_SIMD_VF:
767 case IFN_GOMP_SIMD_LAST_LANE:
768 has_undefined_operand = false;
769 break;
770 default:
771 break;
772 }
773
774 /* If the operation combines operands like COMPLEX_EXPR make sure to
775 not mark the result UNDEFINED if only one part of the result is
776 undefined. */
777 if (has_undefined_operand && all_undefined_operands)
778 return UNDEFINED;
779 else if (code == GIMPLE_ASSIGN && has_undefined_operand)
780 {
781 switch (gimple_assign_rhs_code (stmt))
782 {
783 /* Unary operators are handled with all_undefined_operands. */
784 case PLUS_EXPR:
785 case MINUS_EXPR:
786 case POINTER_PLUS_EXPR:
787 case BIT_XOR_EXPR:
788 /* Not MIN_EXPR, MAX_EXPR. One VARYING operand may be selected.
789 Not bitwise operators, one VARYING operand may specify the
790 result completely.
791 Not logical operators for the same reason, apart from XOR.
792 Not COMPLEX_EXPR as one VARYING operand makes the result partly
793 not UNDEFINED. Not *DIV_EXPR, comparisons and shifts because
794 the undefined operand may be promoted. */
795 return UNDEFINED;
796
797 case ADDR_EXPR:
798 /* If any part of an address is UNDEFINED, like the index
799 of an ARRAY_EXPR, then treat the result as UNDEFINED. */
800 return UNDEFINED;
801
802 default:
803 ;
804 }
805 }
806 /* If there was an UNDEFINED operand but the result may be not UNDEFINED
807 fall back to CONSTANT. During iteration UNDEFINED may still drop
808 to CONSTANT. */
809 if (has_undefined_operand)
810 return CONSTANT;
811
812 /* We do not consider virtual operands here -- load from read-only
813 memory may have only VARYING virtual operands, but still be
814 constant. Also we can combine the stmt with definitions from
815 operands whose definitions are not simulated again. */
816 if (has_constant_operand
817 || has_nsa_operand
818 || gimple_references_memory_p (stmt))
819 return CONSTANT;
820
821 return VARYING;
822 }
823
824 /* Returns true if STMT cannot be constant. */
825
826 static bool
surely_varying_stmt_p(gimple * stmt)827 surely_varying_stmt_p (gimple *stmt)
828 {
829 /* If the statement has operands that we cannot handle, it cannot be
830 constant. */
831 if (gimple_has_volatile_ops (stmt))
832 return true;
833
834 /* If it is a call and does not return a value or is not a
835 builtin and not an indirect call or a call to function with
836 assume_aligned/alloc_align attribute, it is varying. */
837 if (is_gimple_call (stmt))
838 {
839 tree fndecl, fntype = gimple_call_fntype (stmt);
840 if (!gimple_call_lhs (stmt)
841 || ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
842 && !fndecl_built_in_p (fndecl)
843 && !lookup_attribute ("assume_aligned",
844 TYPE_ATTRIBUTES (fntype))
845 && !lookup_attribute ("alloc_align",
846 TYPE_ATTRIBUTES (fntype))))
847 return true;
848 }
849
850 /* Any other store operation is not interesting. */
851 else if (gimple_vdef (stmt))
852 return true;
853
854 /* Anything other than assignments and conditional jumps are not
855 interesting for CCP. */
856 if (gimple_code (stmt) != GIMPLE_ASSIGN
857 && gimple_code (stmt) != GIMPLE_COND
858 && gimple_code (stmt) != GIMPLE_SWITCH
859 && gimple_code (stmt) != GIMPLE_CALL)
860 return true;
861
862 return false;
863 }
864
865 /* Initialize local data structures for CCP. */
866
867 static void
ccp_initialize(void)868 ccp_initialize (void)
869 {
870 basic_block bb;
871
872 n_const_val = num_ssa_names;
873 const_val = XCNEWVEC (ccp_prop_value_t, n_const_val);
874
875 /* Initialize simulation flags for PHI nodes and statements. */
876 FOR_EACH_BB_FN (bb, cfun)
877 {
878 gimple_stmt_iterator i;
879
880 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
881 {
882 gimple *stmt = gsi_stmt (i);
883 bool is_varying;
884
885 /* If the statement is a control insn, then we do not
886 want to avoid simulating the statement once. Failure
887 to do so means that those edges will never get added. */
888 if (stmt_ends_bb_p (stmt))
889 is_varying = false;
890 else
891 is_varying = surely_varying_stmt_p (stmt);
892
893 if (is_varying)
894 {
895 tree def;
896 ssa_op_iter iter;
897
898 /* If the statement will not produce a constant, mark
899 all its outputs VARYING. */
900 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
901 set_value_varying (def);
902 }
903 prop_set_simulate_again (stmt, !is_varying);
904 }
905 }
906
907 /* Now process PHI nodes. We never clear the simulate_again flag on
908 phi nodes, since we do not know which edges are executable yet,
909 except for phi nodes for virtual operands when we do not do store ccp. */
910 FOR_EACH_BB_FN (bb, cfun)
911 {
912 gphi_iterator i;
913
914 for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
915 {
916 gphi *phi = i.phi ();
917
918 if (virtual_operand_p (gimple_phi_result (phi)))
919 prop_set_simulate_again (phi, false);
920 else
921 prop_set_simulate_again (phi, true);
922 }
923 }
924 }
925
926 /* Debug count support. Reset the values of ssa names
927 VARYING when the total number ssa names analyzed is
928 beyond the debug count specified. */
929
930 static void
do_dbg_cnt(void)931 do_dbg_cnt (void)
932 {
933 unsigned i;
934 for (i = 0; i < num_ssa_names; i++)
935 {
936 if (!dbg_cnt (ccp))
937 {
938 const_val[i].lattice_val = VARYING;
939 const_val[i].mask = -1;
940 const_val[i].value = NULL_TREE;
941 }
942 }
943 }
944
945
946 /* We want to provide our own GET_VALUE and FOLD_STMT virtual methods. */
947 class ccp_folder : public substitute_and_fold_engine
948 {
949 public:
950 tree value_of_expr (tree, gimple *) FINAL OVERRIDE;
951 bool fold_stmt (gimple_stmt_iterator *) FINAL OVERRIDE;
952 };
953
954 /* This method just wraps GET_CONSTANT_VALUE for now. Over time
955 naked calls to GET_CONSTANT_VALUE should be eliminated in favor
956 of calling member functions. */
957
958 tree
value_of_expr(tree op,gimple *)959 ccp_folder::value_of_expr (tree op, gimple *)
960 {
961 return get_constant_value (op);
962 }
963
964 /* Do final substitution of propagated values, cleanup the flowgraph and
965 free allocated storage. If NONZERO_P, record nonzero bits.
966
967 Return TRUE when something was optimized. */
968
969 static bool
ccp_finalize(bool nonzero_p)970 ccp_finalize (bool nonzero_p)
971 {
972 bool something_changed;
973 unsigned i;
974 tree name;
975
976 do_dbg_cnt ();
977
978 /* Derive alignment and misalignment information from partially
979 constant pointers in the lattice or nonzero bits from partially
980 constant integers. */
981 FOR_EACH_SSA_NAME (i, name, cfun)
982 {
983 ccp_prop_value_t *val;
984 unsigned int tem, align;
985
986 if (!POINTER_TYPE_P (TREE_TYPE (name))
987 && (!INTEGRAL_TYPE_P (TREE_TYPE (name))
988 /* Don't record nonzero bits before IPA to avoid
989 using too much memory. */
990 || !nonzero_p))
991 continue;
992
993 val = get_value (name);
994 if (val->lattice_val != CONSTANT
995 || TREE_CODE (val->value) != INTEGER_CST
996 || val->mask == 0)
997 continue;
998
999 if (POINTER_TYPE_P (TREE_TYPE (name)))
1000 {
1001 /* Trailing mask bits specify the alignment, trailing value
1002 bits the misalignment. */
1003 tem = val->mask.to_uhwi ();
1004 align = least_bit_hwi (tem);
1005 if (align > 1)
1006 set_ptr_info_alignment (get_ptr_info (name), align,
1007 (TREE_INT_CST_LOW (val->value)
1008 & (align - 1)));
1009 }
1010 else
1011 {
1012 unsigned int precision = TYPE_PRECISION (TREE_TYPE (val->value));
1013 wide_int nonzero_bits
1014 = (wide_int::from (val->mask, precision, UNSIGNED)
1015 | wi::to_wide (val->value));
1016 nonzero_bits &= get_nonzero_bits (name);
1017 set_nonzero_bits (name, nonzero_bits);
1018 }
1019 }
1020
1021 /* Perform substitutions based on the known constant values. */
1022 class ccp_folder ccp_folder;
1023 something_changed = ccp_folder.substitute_and_fold ();
1024
1025 free (const_val);
1026 const_val = NULL;
1027 return something_changed;
1028 }
1029
1030
1031 /* Compute the meet operator between *VAL1 and *VAL2. Store the result
1032 in VAL1.
1033
1034 any M UNDEFINED = any
1035 any M VARYING = VARYING
1036 Ci M Cj = Ci if (i == j)
1037 Ci M Cj = VARYING if (i != j)
1038 */
1039
1040 static void
ccp_lattice_meet(ccp_prop_value_t * val1,ccp_prop_value_t * val2)1041 ccp_lattice_meet (ccp_prop_value_t *val1, ccp_prop_value_t *val2)
1042 {
1043 if (val1->lattice_val == UNDEFINED
1044 /* For UNDEFINED M SSA we can't always SSA because its definition
1045 may not dominate the PHI node. Doing optimistic copy propagation
1046 also causes a lot of gcc.dg/uninit-pred*.c FAILs. */
1047 && (val2->lattice_val != CONSTANT
1048 || TREE_CODE (val2->value) != SSA_NAME))
1049 {
1050 /* UNDEFINED M any = any */
1051 *val1 = *val2;
1052 }
1053 else if (val2->lattice_val == UNDEFINED
1054 /* See above. */
1055 && (val1->lattice_val != CONSTANT
1056 || TREE_CODE (val1->value) != SSA_NAME))
1057 {
1058 /* any M UNDEFINED = any
1059 Nothing to do. VAL1 already contains the value we want. */
1060 ;
1061 }
1062 else if (val1->lattice_val == VARYING
1063 || val2->lattice_val == VARYING)
1064 {
1065 /* any M VARYING = VARYING. */
1066 val1->lattice_val = VARYING;
1067 val1->mask = -1;
1068 val1->value = NULL_TREE;
1069 }
1070 else if (val1->lattice_val == CONSTANT
1071 && val2->lattice_val == CONSTANT
1072 && TREE_CODE (val1->value) == INTEGER_CST
1073 && TREE_CODE (val2->value) == INTEGER_CST)
1074 {
1075 /* Ci M Cj = Ci if (i == j)
1076 Ci M Cj = VARYING if (i != j)
1077
1078 For INTEGER_CSTs mask unequal bits. If no equal bits remain,
1079 drop to varying. */
1080 val1->mask = (val1->mask | val2->mask
1081 | (wi::to_widest (val1->value)
1082 ^ wi::to_widest (val2->value)));
1083 if (wi::sext (val1->mask, TYPE_PRECISION (TREE_TYPE (val1->value))) == -1)
1084 {
1085 val1->lattice_val = VARYING;
1086 val1->value = NULL_TREE;
1087 }
1088 }
1089 else if (val1->lattice_val == CONSTANT
1090 && val2->lattice_val == CONSTANT
1091 && operand_equal_p (val1->value, val2->value, 0))
1092 {
1093 /* Ci M Cj = Ci if (i == j)
1094 Ci M Cj = VARYING if (i != j)
1095
1096 VAL1 already contains the value we want for equivalent values. */
1097 }
1098 else if (val1->lattice_val == CONSTANT
1099 && val2->lattice_val == CONSTANT
1100 && (TREE_CODE (val1->value) == ADDR_EXPR
1101 || TREE_CODE (val2->value) == ADDR_EXPR))
1102 {
1103 /* When not equal addresses are involved try meeting for
1104 alignment. */
1105 ccp_prop_value_t tem = *val2;
1106 if (TREE_CODE (val1->value) == ADDR_EXPR)
1107 *val1 = get_value_for_expr (val1->value, true);
1108 if (TREE_CODE (val2->value) == ADDR_EXPR)
1109 tem = get_value_for_expr (val2->value, true);
1110 ccp_lattice_meet (val1, &tem);
1111 }
1112 else
1113 {
1114 /* Any other combination is VARYING. */
1115 val1->lattice_val = VARYING;
1116 val1->mask = -1;
1117 val1->value = NULL_TREE;
1118 }
1119 }
1120
1121
1122 /* Loop through the PHI_NODE's parameters for BLOCK and compare their
1123 lattice values to determine PHI_NODE's lattice value. The value of a
1124 PHI node is determined calling ccp_lattice_meet with all the arguments
1125 of the PHI node that are incoming via executable edges. */
1126
1127 enum ssa_prop_result
visit_phi(gphi * phi)1128 ccp_propagate::visit_phi (gphi *phi)
1129 {
1130 unsigned i;
1131 ccp_prop_value_t new_val;
1132
1133 if (dump_file && (dump_flags & TDF_DETAILS))
1134 {
1135 fprintf (dump_file, "\nVisiting PHI node: ");
1136 print_gimple_stmt (dump_file, phi, 0, dump_flags);
1137 }
1138
1139 new_val.lattice_val = UNDEFINED;
1140 new_val.value = NULL_TREE;
1141 new_val.mask = 0;
1142
1143 bool first = true;
1144 bool non_exec_edge = false;
1145 for (i = 0; i < gimple_phi_num_args (phi); i++)
1146 {
1147 /* Compute the meet operator over all the PHI arguments flowing
1148 through executable edges. */
1149 edge e = gimple_phi_arg_edge (phi, i);
1150
1151 if (dump_file && (dump_flags & TDF_DETAILS))
1152 {
1153 fprintf (dump_file,
1154 "\tArgument #%d (%d -> %d %sexecutable)\n",
1155 i, e->src->index, e->dest->index,
1156 (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
1157 }
1158
1159 /* If the incoming edge is executable, Compute the meet operator for
1160 the existing value of the PHI node and the current PHI argument. */
1161 if (e->flags & EDGE_EXECUTABLE)
1162 {
1163 tree arg = gimple_phi_arg (phi, i)->def;
1164 ccp_prop_value_t arg_val = get_value_for_expr (arg, false);
1165
1166 if (first)
1167 {
1168 new_val = arg_val;
1169 first = false;
1170 }
1171 else
1172 ccp_lattice_meet (&new_val, &arg_val);
1173
1174 if (dump_file && (dump_flags & TDF_DETAILS))
1175 {
1176 fprintf (dump_file, "\t");
1177 print_generic_expr (dump_file, arg, dump_flags);
1178 dump_lattice_value (dump_file, "\tValue: ", arg_val);
1179 fprintf (dump_file, "\n");
1180 }
1181
1182 if (new_val.lattice_val == VARYING)
1183 break;
1184 }
1185 else
1186 non_exec_edge = true;
1187 }
1188
1189 /* In case there were non-executable edges and the value is a copy
1190 make sure its definition dominates the PHI node. */
1191 if (non_exec_edge
1192 && new_val.lattice_val == CONSTANT
1193 && TREE_CODE (new_val.value) == SSA_NAME
1194 && ! SSA_NAME_IS_DEFAULT_DEF (new_val.value)
1195 && ! dominated_by_p (CDI_DOMINATORS, gimple_bb (phi),
1196 gimple_bb (SSA_NAME_DEF_STMT (new_val.value))))
1197 {
1198 new_val.lattice_val = VARYING;
1199 new_val.value = NULL_TREE;
1200 new_val.mask = -1;
1201 }
1202
1203 if (dump_file && (dump_flags & TDF_DETAILS))
1204 {
1205 dump_lattice_value (dump_file, "\n PHI node value: ", new_val);
1206 fprintf (dump_file, "\n\n");
1207 }
1208
1209 /* Make the transition to the new value. */
1210 if (set_lattice_value (gimple_phi_result (phi), &new_val))
1211 {
1212 if (new_val.lattice_val == VARYING)
1213 return SSA_PROP_VARYING;
1214 else
1215 return SSA_PROP_INTERESTING;
1216 }
1217 else
1218 return SSA_PROP_NOT_INTERESTING;
1219 }
1220
1221 /* Return the constant value for OP or OP otherwise. */
1222
1223 static tree
valueize_op(tree op)1224 valueize_op (tree op)
1225 {
1226 if (TREE_CODE (op) == SSA_NAME)
1227 {
1228 tree tem = get_constant_value (op);
1229 if (tem)
1230 return tem;
1231 }
1232 return op;
1233 }
1234
1235 /* Return the constant value for OP, but signal to not follow SSA
1236 edges if the definition may be simulated again. */
1237
1238 static tree
valueize_op_1(tree op)1239 valueize_op_1 (tree op)
1240 {
1241 if (TREE_CODE (op) == SSA_NAME)
1242 {
1243 /* If the definition may be simulated again we cannot follow
1244 this SSA edge as the SSA propagator does not necessarily
1245 re-visit the use. */
1246 gimple *def_stmt = SSA_NAME_DEF_STMT (op);
1247 if (!gimple_nop_p (def_stmt)
1248 && prop_simulate_again_p (def_stmt))
1249 return NULL_TREE;
1250 tree tem = get_constant_value (op);
1251 if (tem)
1252 return tem;
1253 }
1254 return op;
1255 }
1256
1257 /* CCP specific front-end to the non-destructive constant folding
1258 routines.
1259
1260 Attempt to simplify the RHS of STMT knowing that one or more
1261 operands are constants.
1262
1263 If simplification is possible, return the simplified RHS,
1264 otherwise return the original RHS or NULL_TREE. */
1265
1266 static tree
ccp_fold(gimple * stmt)1267 ccp_fold (gimple *stmt)
1268 {
1269 location_t loc = gimple_location (stmt);
1270 switch (gimple_code (stmt))
1271 {
1272 case GIMPLE_COND:
1273 {
1274 /* Handle comparison operators that can appear in GIMPLE form. */
1275 tree op0 = valueize_op (gimple_cond_lhs (stmt));
1276 tree op1 = valueize_op (gimple_cond_rhs (stmt));
1277 enum tree_code code = gimple_cond_code (stmt);
1278 return fold_binary_loc (loc, code, boolean_type_node, op0, op1);
1279 }
1280
1281 case GIMPLE_SWITCH:
1282 {
1283 /* Return the constant switch index. */
1284 return valueize_op (gimple_switch_index (as_a <gswitch *> (stmt)));
1285 }
1286
1287 case GIMPLE_ASSIGN:
1288 case GIMPLE_CALL:
1289 return gimple_fold_stmt_to_constant_1 (stmt,
1290 valueize_op, valueize_op_1);
1291
1292 default:
1293 gcc_unreachable ();
1294 }
1295 }
1296
1297 /* Determine the minimum and maximum values, *MIN and *MAX respectively,
1298 represented by the mask pair VAL and MASK with signedness SGN and
1299 precision PRECISION. */
1300
1301 void
value_mask_to_min_max(widest_int * min,widest_int * max,const widest_int & val,const widest_int & mask,signop sgn,int precision)1302 value_mask_to_min_max (widest_int *min, widest_int *max,
1303 const widest_int &val, const widest_int &mask,
1304 signop sgn, int precision)
1305 {
1306 *min = wi::bit_and_not (val, mask);
1307 *max = val | mask;
1308 if (sgn == SIGNED && wi::neg_p (mask))
1309 {
1310 widest_int sign_bit = wi::lshift (1, precision - 1);
1311 *min ^= sign_bit;
1312 *max ^= sign_bit;
1313 /* MAX is zero extended, and MIN is sign extended. */
1314 *min = wi::ext (*min, precision, sgn);
1315 *max = wi::ext (*max, precision, sgn);
1316 }
1317 }
1318
1319 /* Apply the operation CODE in type TYPE to the value, mask pair
1320 RVAL and RMASK representing a value of type RTYPE and set
1321 the value, mask pair *VAL and *MASK to the result. */
1322
1323 void
bit_value_unop(enum tree_code code,signop type_sgn,int type_precision,widest_int * val,widest_int * mask,signop rtype_sgn,int rtype_precision,const widest_int & rval,const widest_int & rmask)1324 bit_value_unop (enum tree_code code, signop type_sgn, int type_precision,
1325 widest_int *val, widest_int *mask,
1326 signop rtype_sgn, int rtype_precision,
1327 const widest_int &rval, const widest_int &rmask)
1328 {
1329 switch (code)
1330 {
1331 case BIT_NOT_EXPR:
1332 *mask = rmask;
1333 *val = ~rval;
1334 break;
1335
1336 case NEGATE_EXPR:
1337 {
1338 widest_int temv, temm;
1339 /* Return ~rval + 1. */
1340 bit_value_unop (BIT_NOT_EXPR, type_sgn, type_precision, &temv, &temm,
1341 type_sgn, type_precision, rval, rmask);
1342 bit_value_binop (PLUS_EXPR, type_sgn, type_precision, val, mask,
1343 type_sgn, type_precision, temv, temm,
1344 type_sgn, type_precision, 1, 0);
1345 break;
1346 }
1347
1348 CASE_CONVERT:
1349 {
1350 /* First extend mask and value according to the original type. */
1351 *mask = wi::ext (rmask, rtype_precision, rtype_sgn);
1352 *val = wi::ext (rval, rtype_precision, rtype_sgn);
1353
1354 /* Then extend mask and value according to the target type. */
1355 *mask = wi::ext (*mask, type_precision, type_sgn);
1356 *val = wi::ext (*val, type_precision, type_sgn);
1357 break;
1358 }
1359
1360 case ABS_EXPR:
1361 case ABSU_EXPR:
1362 if (wi::sext (rmask, rtype_precision) == -1)
1363 *mask = -1;
1364 else if (wi::neg_p (rmask))
1365 {
1366 /* Result is either rval or -rval. */
1367 widest_int temv, temm;
1368 bit_value_unop (NEGATE_EXPR, rtype_sgn, rtype_precision, &temv,
1369 &temm, type_sgn, type_precision, rval, rmask);
1370 temm |= (rmask | (rval ^ temv));
1371 /* Extend the result. */
1372 *mask = wi::ext (temm, type_precision, type_sgn);
1373 *val = wi::ext (temv, type_precision, type_sgn);
1374 }
1375 else if (wi::neg_p (rval))
1376 {
1377 bit_value_unop (NEGATE_EXPR, type_sgn, type_precision, val, mask,
1378 type_sgn, type_precision, rval, rmask);
1379 }
1380 else
1381 {
1382 *mask = rmask;
1383 *val = rval;
1384 }
1385 break;
1386
1387 default:
1388 *mask = -1;
1389 break;
1390 }
1391 }
1392
1393 /* Determine the mask pair *VAL and *MASK from multiplying the
1394 argument mask pair RVAL, RMASK by the unsigned constant C. */
1395 void
bit_value_mult_const(signop sgn,int width,widest_int * val,widest_int * mask,const widest_int & rval,const widest_int & rmask,widest_int c)1396 bit_value_mult_const (signop sgn, int width,
1397 widest_int *val, widest_int *mask,
1398 const widest_int &rval, const widest_int &rmask,
1399 widest_int c)
1400 {
1401 widest_int sum_mask = 0;
1402
1403 /* Ensure rval_lo only contains known bits. */
1404 widest_int rval_lo = wi::bit_and_not (rval, rmask);
1405
1406 if (rval_lo != 0)
1407 {
1408 /* General case (some bits of multiplicand are known set). */
1409 widest_int sum_val = 0;
1410 while (c != 0)
1411 {
1412 /* Determine the lowest bit set in the multiplier. */
1413 int bitpos = wi::ctz (c);
1414 widest_int term_mask = rmask << bitpos;
1415 widest_int term_val = rval_lo << bitpos;
1416
1417 /* sum += term. */
1418 widest_int lo = sum_val + term_val;
1419 widest_int hi = (sum_val | sum_mask) + (term_val | term_mask);
1420 sum_mask |= term_mask | (lo ^ hi);
1421 sum_val = lo;
1422
1423 /* Clear this bit in the multiplier. */
1424 c ^= wi::lshift (1, bitpos);
1425 }
1426 /* Correctly extend the result value. */
1427 *val = wi::ext (sum_val, width, sgn);
1428 }
1429 else
1430 {
1431 /* Special case (no bits of multiplicand are known set). */
1432 while (c != 0)
1433 {
1434 /* Determine the lowest bit set in the multiplier. */
1435 int bitpos = wi::ctz (c);
1436 widest_int term_mask = rmask << bitpos;
1437
1438 /* sum += term. */
1439 widest_int hi = sum_mask + term_mask;
1440 sum_mask |= term_mask | hi;
1441
1442 /* Clear this bit in the multiplier. */
1443 c ^= wi::lshift (1, bitpos);
1444 }
1445 *val = 0;
1446 }
1447
1448 /* Correctly extend the result mask. */
1449 *mask = wi::ext (sum_mask, width, sgn);
1450 }
1451
1452 /* Fill up to MAX values in the BITS array with values representing
1453 each of the non-zero bits in the value X. Returns the number of
1454 bits in X (capped at the maximum value MAX). For example, an X
1455 value 11, places 1, 2 and 8 in BITS and returns the value 3. */
1456
1457 unsigned int
get_individual_bits(widest_int * bits,widest_int x,unsigned int max)1458 get_individual_bits (widest_int *bits, widest_int x, unsigned int max)
1459 {
1460 unsigned int count = 0;
1461 while (count < max && x != 0)
1462 {
1463 int bitpos = wi::ctz (x);
1464 bits[count] = wi::lshift (1, bitpos);
1465 x ^= bits[count];
1466 count++;
1467 }
1468 return count;
1469 }
1470
1471 /* Array of 2^N - 1 values representing the bits flipped between
1472 consecutive Gray codes. This is used to efficiently enumerate
1473 all permutations on N bits using XOR. */
1474 static const unsigned char gray_code_bit_flips[63] = {
1475 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
1476 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5,
1477 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
1478 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
1479 };
1480
1481 /* Apply the operation CODE in type TYPE to the value, mask pairs
1482 R1VAL, R1MASK and R2VAL, R2MASK representing a values of type R1TYPE
1483 and R2TYPE and set the value, mask pair *VAL and *MASK to the result. */
1484
1485 void
bit_value_binop(enum tree_code code,signop sgn,int width,widest_int * val,widest_int * mask,signop r1type_sgn,int r1type_precision,const widest_int & r1val,const widest_int & r1mask,signop r2type_sgn,int r2type_precision ATTRIBUTE_UNUSED,const widest_int & r2val,const widest_int & r2mask)1486 bit_value_binop (enum tree_code code, signop sgn, int width,
1487 widest_int *val, widest_int *mask,
1488 signop r1type_sgn, int r1type_precision,
1489 const widest_int &r1val, const widest_int &r1mask,
1490 signop r2type_sgn, int r2type_precision ATTRIBUTE_UNUSED,
1491 const widest_int &r2val, const widest_int &r2mask)
1492 {
1493 bool swap_p = false;
1494
1495 /* Assume we'll get a constant result. Use an initial non varying
1496 value, we fall back to varying in the end if necessary. */
1497 *mask = -1;
1498 /* Ensure that VAL is initialized (to any value). */
1499 *val = 0;
1500
1501 switch (code)
1502 {
1503 case BIT_AND_EXPR:
1504 /* The mask is constant where there is a known not
1505 set bit, (m1 | m2) & ((v1 | m1) & (v2 | m2)) */
1506 *mask = (r1mask | r2mask) & (r1val | r1mask) & (r2val | r2mask);
1507 *val = r1val & r2val;
1508 break;
1509
1510 case BIT_IOR_EXPR:
1511 /* The mask is constant where there is a known
1512 set bit, (m1 | m2) & ~((v1 & ~m1) | (v2 & ~m2)). */
1513 *mask = wi::bit_and_not (r1mask | r2mask,
1514 wi::bit_and_not (r1val, r1mask)
1515 | wi::bit_and_not (r2val, r2mask));
1516 *val = r1val | r2val;
1517 break;
1518
1519 case BIT_XOR_EXPR:
1520 /* m1 | m2 */
1521 *mask = r1mask | r2mask;
1522 *val = r1val ^ r2val;
1523 break;
1524
1525 case LROTATE_EXPR:
1526 case RROTATE_EXPR:
1527 if (r2mask == 0)
1528 {
1529 widest_int shift = r2val;
1530 if (shift == 0)
1531 {
1532 *mask = r1mask;
1533 *val = r1val;
1534 }
1535 else
1536 {
1537 if (wi::neg_p (shift, r2type_sgn))
1538 {
1539 shift = -shift;
1540 if (code == RROTATE_EXPR)
1541 code = LROTATE_EXPR;
1542 else
1543 code = RROTATE_EXPR;
1544 }
1545 if (code == RROTATE_EXPR)
1546 {
1547 *mask = wi::rrotate (r1mask, shift, width);
1548 *val = wi::rrotate (r1val, shift, width);
1549 }
1550 else
1551 {
1552 *mask = wi::lrotate (r1mask, shift, width);
1553 *val = wi::lrotate (r1val, shift, width);
1554 }
1555 *mask = wi::ext (*mask, width, sgn);
1556 *val = wi::ext (*val, width, sgn);
1557 }
1558 }
1559 else if (wi::ltu_p (r2val | r2mask, width)
1560 && wi::popcount (r2mask) <= 4)
1561 {
1562 widest_int bits[4];
1563 widest_int res_val, res_mask;
1564 widest_int tmp_val, tmp_mask;
1565 widest_int shift = wi::bit_and_not (r2val, r2mask);
1566 unsigned int bit_count = get_individual_bits (bits, r2mask, 4);
1567 unsigned int count = (1 << bit_count) - 1;
1568
1569 /* Initialize result to rotate by smallest value of shift. */
1570 if (code == RROTATE_EXPR)
1571 {
1572 res_mask = wi::rrotate (r1mask, shift, width);
1573 res_val = wi::rrotate (r1val, shift, width);
1574 }
1575 else
1576 {
1577 res_mask = wi::lrotate (r1mask, shift, width);
1578 res_val = wi::lrotate (r1val, shift, width);
1579 }
1580
1581 /* Iterate through the remaining values of shift. */
1582 for (unsigned int i=0; i<count; i++)
1583 {
1584 shift ^= bits[gray_code_bit_flips[i]];
1585 if (code == RROTATE_EXPR)
1586 {
1587 tmp_mask = wi::rrotate (r1mask, shift, width);
1588 tmp_val = wi::rrotate (r1val, shift, width);
1589 }
1590 else
1591 {
1592 tmp_mask = wi::lrotate (r1mask, shift, width);
1593 tmp_val = wi::lrotate (r1val, shift, width);
1594 }
1595 /* Accumulate the result. */
1596 res_mask |= tmp_mask | (res_val ^ tmp_val);
1597 }
1598 *val = wi::ext (wi::bit_and_not (res_val, res_mask), width, sgn);
1599 *mask = wi::ext (res_mask, width, sgn);
1600 }
1601 break;
1602
1603 case LSHIFT_EXPR:
1604 case RSHIFT_EXPR:
1605 /* ??? We can handle partially known shift counts if we know
1606 its sign. That way we can tell that (x << (y | 8)) & 255
1607 is zero. */
1608 if (r2mask == 0)
1609 {
1610 widest_int shift = r2val;
1611 if (shift == 0)
1612 {
1613 *mask = r1mask;
1614 *val = r1val;
1615 }
1616 else
1617 {
1618 if (wi::neg_p (shift, r2type_sgn))
1619 break;
1620 if (code == RSHIFT_EXPR)
1621 {
1622 *mask = wi::rshift (wi::ext (r1mask, width, sgn), shift, sgn);
1623 *val = wi::rshift (wi::ext (r1val, width, sgn), shift, sgn);
1624 }
1625 else
1626 {
1627 *mask = wi::ext (r1mask << shift, width, sgn);
1628 *val = wi::ext (r1val << shift, width, sgn);
1629 }
1630 }
1631 }
1632 else if (wi::ltu_p (r2val | r2mask, width))
1633 {
1634 if (wi::popcount (r2mask) <= 4)
1635 {
1636 widest_int bits[4];
1637 widest_int arg_val, arg_mask;
1638 widest_int res_val, res_mask;
1639 widest_int tmp_val, tmp_mask;
1640 widest_int shift = wi::bit_and_not (r2val, r2mask);
1641 unsigned int bit_count = get_individual_bits (bits, r2mask, 4);
1642 unsigned int count = (1 << bit_count) - 1;
1643
1644 /* Initialize result to shift by smallest value of shift. */
1645 if (code == RSHIFT_EXPR)
1646 {
1647 arg_mask = wi::ext (r1mask, width, sgn);
1648 arg_val = wi::ext (r1val, width, sgn);
1649 res_mask = wi::rshift (arg_mask, shift, sgn);
1650 res_val = wi::rshift (arg_val, shift, sgn);
1651 }
1652 else
1653 {
1654 arg_mask = r1mask;
1655 arg_val = r1val;
1656 res_mask = arg_mask << shift;
1657 res_val = arg_val << shift;
1658 }
1659
1660 /* Iterate through the remaining values of shift. */
1661 for (unsigned int i=0; i<count; i++)
1662 {
1663 shift ^= bits[gray_code_bit_flips[i]];
1664 if (code == RSHIFT_EXPR)
1665 {
1666 tmp_mask = wi::rshift (arg_mask, shift, sgn);
1667 tmp_val = wi::rshift (arg_val, shift, sgn);
1668 }
1669 else
1670 {
1671 tmp_mask = arg_mask << shift;
1672 tmp_val = arg_val << shift;
1673 }
1674 /* Accumulate the result. */
1675 res_mask |= tmp_mask | (res_val ^ tmp_val);
1676 }
1677 res_mask = wi::ext (res_mask, width, sgn);
1678 res_val = wi::ext (res_val, width, sgn);
1679 *val = wi::bit_and_not (res_val, res_mask);
1680 *mask = res_mask;
1681 }
1682 else if ((r1val | r1mask) == 0)
1683 {
1684 /* Handle shifts of zero to avoid undefined wi::ctz below. */
1685 *mask = 0;
1686 *val = 0;
1687 }
1688 else if (code == LSHIFT_EXPR)
1689 {
1690 widest_int tmp = wi::mask <widest_int> (width, false);
1691 tmp <<= wi::ctz (r1val | r1mask);
1692 tmp <<= wi::bit_and_not (r2val, r2mask);
1693 *mask = wi::ext (tmp, width, sgn);
1694 *val = 0;
1695 }
1696 else if (!wi::neg_p (r1val | r1mask, sgn))
1697 {
1698 /* Logical right shift, or zero sign bit. */
1699 widest_int arg = r1val | r1mask;
1700 int lzcount = wi::clz (arg);
1701 if (lzcount)
1702 lzcount -= wi::get_precision (arg) - width;
1703 widest_int tmp = wi::mask <widest_int> (width, false);
1704 tmp = wi::lrshift (tmp, lzcount);
1705 tmp = wi::lrshift (tmp, wi::bit_and_not (r2val, r2mask));
1706 *mask = wi::ext (tmp, width, sgn);
1707 *val = 0;
1708 }
1709 else if (!wi::neg_p (r1mask))
1710 {
1711 /* Arithmetic right shift with set sign bit. */
1712 widest_int arg = wi::bit_and_not (r1val, r1mask);
1713 int sbcount = wi::clrsb (arg);
1714 sbcount -= wi::get_precision (arg) - width;
1715 widest_int tmp = wi::mask <widest_int> (width, false);
1716 tmp = wi::lrshift (tmp, sbcount);
1717 tmp = wi::lrshift (tmp, wi::bit_and_not (r2val, r2mask));
1718 *mask = wi::sext (tmp, width);
1719 tmp = wi::bit_not (tmp);
1720 *val = wi::sext (tmp, width);
1721 }
1722 }
1723 break;
1724
1725 case PLUS_EXPR:
1726 case POINTER_PLUS_EXPR:
1727 {
1728 /* Do the addition with unknown bits set to zero, to give carry-ins of
1729 zero wherever possible. */
1730 widest_int lo = (wi::bit_and_not (r1val, r1mask)
1731 + wi::bit_and_not (r2val, r2mask));
1732 lo = wi::ext (lo, width, sgn);
1733 /* Do the addition with unknown bits set to one, to give carry-ins of
1734 one wherever possible. */
1735 widest_int hi = (r1val | r1mask) + (r2val | r2mask);
1736 hi = wi::ext (hi, width, sgn);
1737 /* Each bit in the result is known if (a) the corresponding bits in
1738 both inputs are known, and (b) the carry-in to that bit position
1739 is known. We can check condition (b) by seeing if we got the same
1740 result with minimised carries as with maximised carries. */
1741 *mask = r1mask | r2mask | (lo ^ hi);
1742 *mask = wi::ext (*mask, width, sgn);
1743 /* It shouldn't matter whether we choose lo or hi here. */
1744 *val = lo;
1745 break;
1746 }
1747
1748 case MINUS_EXPR:
1749 case POINTER_DIFF_EXPR:
1750 {
1751 /* Subtraction is derived from the addition algorithm above. */
1752 widest_int lo = wi::bit_and_not (r1val, r1mask) - (r2val | r2mask);
1753 lo = wi::ext (lo, width, sgn);
1754 widest_int hi = (r1val | r1mask) - wi::bit_and_not (r2val, r2mask);
1755 hi = wi::ext (hi, width, sgn);
1756 *mask = r1mask | r2mask | (lo ^ hi);
1757 *mask = wi::ext (*mask, width, sgn);
1758 *val = lo;
1759 break;
1760 }
1761
1762 case MULT_EXPR:
1763 if (r2mask == 0
1764 && !wi::neg_p (r2val, sgn)
1765 && (flag_expensive_optimizations || wi::popcount (r2val) < 8))
1766 bit_value_mult_const (sgn, width, val, mask, r1val, r1mask, r2val);
1767 else if (r1mask == 0
1768 && !wi::neg_p (r1val, sgn)
1769 && (flag_expensive_optimizations || wi::popcount (r1val) < 8))
1770 bit_value_mult_const (sgn, width, val, mask, r2val, r2mask, r1val);
1771 else
1772 {
1773 /* Just track trailing zeros in both operands and transfer
1774 them to the other. */
1775 int r1tz = wi::ctz (r1val | r1mask);
1776 int r2tz = wi::ctz (r2val | r2mask);
1777 if (r1tz + r2tz >= width)
1778 {
1779 *mask = 0;
1780 *val = 0;
1781 }
1782 else if (r1tz + r2tz > 0)
1783 {
1784 *mask = wi::ext (wi::mask <widest_int> (r1tz + r2tz, true),
1785 width, sgn);
1786 *val = 0;
1787 }
1788 }
1789 break;
1790
1791 case EQ_EXPR:
1792 case NE_EXPR:
1793 {
1794 widest_int m = r1mask | r2mask;
1795 if (wi::bit_and_not (r1val, m) != wi::bit_and_not (r2val, m))
1796 {
1797 *mask = 0;
1798 *val = ((code == EQ_EXPR) ? 0 : 1);
1799 }
1800 else
1801 {
1802 /* We know the result of a comparison is always one or zero. */
1803 *mask = 1;
1804 *val = 0;
1805 }
1806 break;
1807 }
1808
1809 case GE_EXPR:
1810 case GT_EXPR:
1811 swap_p = true;
1812 code = swap_tree_comparison (code);
1813 /* Fall through. */
1814 case LT_EXPR:
1815 case LE_EXPR:
1816 {
1817 widest_int min1, max1, min2, max2;
1818 int minmax, maxmin;
1819
1820 const widest_int &o1val = swap_p ? r2val : r1val;
1821 const widest_int &o1mask = swap_p ? r2mask : r1mask;
1822 const widest_int &o2val = swap_p ? r1val : r2val;
1823 const widest_int &o2mask = swap_p ? r1mask : r2mask;
1824
1825 value_mask_to_min_max (&min1, &max1, o1val, o1mask,
1826 r1type_sgn, r1type_precision);
1827 value_mask_to_min_max (&min2, &max2, o2val, o2mask,
1828 r1type_sgn, r1type_precision);
1829
1830 /* For comparisons the signedness is in the comparison operands. */
1831 /* Do a cross comparison of the max/min pairs. */
1832 maxmin = wi::cmp (max1, min2, r1type_sgn);
1833 minmax = wi::cmp (min1, max2, r1type_sgn);
1834 if (maxmin < (code == LE_EXPR ? 1: 0)) /* o1 < or <= o2. */
1835 {
1836 *mask = 0;
1837 *val = 1;
1838 }
1839 else if (minmax > (code == LT_EXPR ? -1 : 0)) /* o1 >= or > o2. */
1840 {
1841 *mask = 0;
1842 *val = 0;
1843 }
1844 else if (maxmin == minmax) /* o1 and o2 are equal. */
1845 {
1846 /* This probably should never happen as we'd have
1847 folded the thing during fully constant value folding. */
1848 *mask = 0;
1849 *val = (code == LE_EXPR ? 1 : 0);
1850 }
1851 else
1852 {
1853 /* We know the result of a comparison is always one or zero. */
1854 *mask = 1;
1855 *val = 0;
1856 }
1857 break;
1858 }
1859
1860 case MIN_EXPR:
1861 case MAX_EXPR:
1862 {
1863 widest_int min1, max1, min2, max2;
1864
1865 value_mask_to_min_max (&min1, &max1, r1val, r1mask, sgn, width);
1866 value_mask_to_min_max (&min2, &max2, r2val, r2mask, sgn, width);
1867
1868 if (wi::cmp (max1, min2, sgn) <= 0) /* r1 is less than r2. */
1869 {
1870 if (code == MIN_EXPR)
1871 {
1872 *mask = r1mask;
1873 *val = r1val;
1874 }
1875 else
1876 {
1877 *mask = r2mask;
1878 *val = r2val;
1879 }
1880 }
1881 else if (wi::cmp (min1, max2, sgn) >= 0) /* r2 is less than r1. */
1882 {
1883 if (code == MIN_EXPR)
1884 {
1885 *mask = r2mask;
1886 *val = r2val;
1887 }
1888 else
1889 {
1890 *mask = r1mask;
1891 *val = r1val;
1892 }
1893 }
1894 else
1895 {
1896 /* The result is either r1 or r2. */
1897 *mask = r1mask | r2mask | (r1val ^ r2val);
1898 *val = r1val;
1899 }
1900 break;
1901 }
1902
1903 case TRUNC_MOD_EXPR:
1904 {
1905 widest_int r1max = r1val | r1mask;
1906 widest_int r2max = r2val | r2mask;
1907 if (sgn == UNSIGNED
1908 || (!wi::neg_p (r1max) && !wi::neg_p (r2max)))
1909 {
1910 /* Confirm R2 has some bits set, to avoid division by zero. */
1911 widest_int r2min = wi::bit_and_not (r2val, r2mask);
1912 if (r2min != 0)
1913 {
1914 /* R1 % R2 is R1 if R1 is always less than R2. */
1915 if (wi::ltu_p (r1max, r2min))
1916 {
1917 *mask = r1mask;
1918 *val = r1val;
1919 }
1920 else
1921 {
1922 /* R1 % R2 is always less than the maximum of R2. */
1923 unsigned int lzcount = wi::clz (r2max);
1924 unsigned int bits = wi::get_precision (r2max) - lzcount;
1925 if (r2max == wi::lshift (1, bits))
1926 bits--;
1927 *mask = wi::mask <widest_int> (bits, false);
1928 *val = 0;
1929 }
1930 }
1931 }
1932 }
1933 break;
1934
1935 case TRUNC_DIV_EXPR:
1936 {
1937 widest_int r1max = r1val | r1mask;
1938 widest_int r2max = r2val | r2mask;
1939 if (sgn == UNSIGNED
1940 || (!wi::neg_p (r1max) && !wi::neg_p (r2max)))
1941 {
1942 /* Confirm R2 has some bits set, to avoid division by zero. */
1943 widest_int r2min = wi::bit_and_not (r2val, r2mask);
1944 if (r2min != 0)
1945 {
1946 /* R1 / R2 is zero if R1 is always less than R2. */
1947 if (wi::ltu_p (r1max, r2min))
1948 {
1949 *mask = 0;
1950 *val = 0;
1951 }
1952 else
1953 {
1954 widest_int upper = wi::udiv_trunc (r1max, r2min);
1955 unsigned int lzcount = wi::clz (upper);
1956 unsigned int bits = wi::get_precision (upper) - lzcount;
1957 *mask = wi::mask <widest_int> (bits, false);
1958 *val = 0;
1959 }
1960 }
1961 }
1962 }
1963 break;
1964
1965 default:;
1966 }
1967 }
1968
1969 /* Return the propagation value when applying the operation CODE to
1970 the value RHS yielding type TYPE. */
1971
1972 static ccp_prop_value_t
bit_value_unop(enum tree_code code,tree type,tree rhs)1973 bit_value_unop (enum tree_code code, tree type, tree rhs)
1974 {
1975 ccp_prop_value_t rval = get_value_for_expr (rhs, true);
1976 widest_int value, mask;
1977 ccp_prop_value_t val;
1978
1979 if (rval.lattice_val == UNDEFINED)
1980 return rval;
1981
1982 gcc_assert ((rval.lattice_val == CONSTANT
1983 && TREE_CODE (rval.value) == INTEGER_CST)
1984 || wi::sext (rval.mask, TYPE_PRECISION (TREE_TYPE (rhs))) == -1);
1985 bit_value_unop (code, TYPE_SIGN (type), TYPE_PRECISION (type), &value, &mask,
1986 TYPE_SIGN (TREE_TYPE (rhs)), TYPE_PRECISION (TREE_TYPE (rhs)),
1987 value_to_wide_int (rval), rval.mask);
1988 if (wi::sext (mask, TYPE_PRECISION (type)) != -1)
1989 {
1990 val.lattice_val = CONSTANT;
1991 val.mask = mask;
1992 /* ??? Delay building trees here. */
1993 val.value = wide_int_to_tree (type, value);
1994 }
1995 else
1996 {
1997 val.lattice_val = VARYING;
1998 val.value = NULL_TREE;
1999 val.mask = -1;
2000 }
2001 return val;
2002 }
2003
2004 /* Return the propagation value when applying the operation CODE to
2005 the values RHS1 and RHS2 yielding type TYPE. */
2006
2007 static ccp_prop_value_t
bit_value_binop(enum tree_code code,tree type,tree rhs1,tree rhs2)2008 bit_value_binop (enum tree_code code, tree type, tree rhs1, tree rhs2)
2009 {
2010 ccp_prop_value_t r1val = get_value_for_expr (rhs1, true);
2011 ccp_prop_value_t r2val = get_value_for_expr (rhs2, true);
2012 widest_int value, mask;
2013 ccp_prop_value_t val;
2014
2015 if (r1val.lattice_val == UNDEFINED
2016 || r2val.lattice_val == UNDEFINED)
2017 {
2018 val.lattice_val = VARYING;
2019 val.value = NULL_TREE;
2020 val.mask = -1;
2021 return val;
2022 }
2023
2024 gcc_assert ((r1val.lattice_val == CONSTANT
2025 && TREE_CODE (r1val.value) == INTEGER_CST)
2026 || wi::sext (r1val.mask,
2027 TYPE_PRECISION (TREE_TYPE (rhs1))) == -1);
2028 gcc_assert ((r2val.lattice_val == CONSTANT
2029 && TREE_CODE (r2val.value) == INTEGER_CST)
2030 || wi::sext (r2val.mask,
2031 TYPE_PRECISION (TREE_TYPE (rhs2))) == -1);
2032 bit_value_binop (code, TYPE_SIGN (type), TYPE_PRECISION (type), &value, &mask,
2033 TYPE_SIGN (TREE_TYPE (rhs1)), TYPE_PRECISION (TREE_TYPE (rhs1)),
2034 value_to_wide_int (r1val), r1val.mask,
2035 TYPE_SIGN (TREE_TYPE (rhs2)), TYPE_PRECISION (TREE_TYPE (rhs2)),
2036 value_to_wide_int (r2val), r2val.mask);
2037
2038 /* (x * x) & 2 == 0. */
2039 if (code == MULT_EXPR && rhs1 == rhs2 && TYPE_PRECISION (type) > 1)
2040 {
2041 widest_int m = 2;
2042 if (wi::sext (mask, TYPE_PRECISION (type)) != -1)
2043 value = wi::bit_and_not (value, m);
2044 else
2045 value = 0;
2046 mask = wi::bit_and_not (mask, m);
2047 }
2048
2049 if (wi::sext (mask, TYPE_PRECISION (type)) != -1)
2050 {
2051 val.lattice_val = CONSTANT;
2052 val.mask = mask;
2053 /* ??? Delay building trees here. */
2054 val.value = wide_int_to_tree (type, value);
2055 }
2056 else
2057 {
2058 val.lattice_val = VARYING;
2059 val.value = NULL_TREE;
2060 val.mask = -1;
2061 }
2062 return val;
2063 }
2064
2065 /* Return the propagation value for __builtin_assume_aligned
2066 and functions with assume_aligned or alloc_aligned attribute.
2067 For __builtin_assume_aligned, ATTR is NULL_TREE,
2068 for assume_aligned attribute ATTR is non-NULL and ALLOC_ALIGNED
2069 is false, for alloc_aligned attribute ATTR is non-NULL and
2070 ALLOC_ALIGNED is true. */
2071
2072 static ccp_prop_value_t
bit_value_assume_aligned(gimple * stmt,tree attr,ccp_prop_value_t ptrval,bool alloc_aligned)2073 bit_value_assume_aligned (gimple *stmt, tree attr, ccp_prop_value_t ptrval,
2074 bool alloc_aligned)
2075 {
2076 tree align, misalign = NULL_TREE, type;
2077 unsigned HOST_WIDE_INT aligni, misaligni = 0;
2078 ccp_prop_value_t alignval;
2079 widest_int value, mask;
2080 ccp_prop_value_t val;
2081
2082 if (attr == NULL_TREE)
2083 {
2084 tree ptr = gimple_call_arg (stmt, 0);
2085 type = TREE_TYPE (ptr);
2086 ptrval = get_value_for_expr (ptr, true);
2087 }
2088 else
2089 {
2090 tree lhs = gimple_call_lhs (stmt);
2091 type = TREE_TYPE (lhs);
2092 }
2093
2094 if (ptrval.lattice_val == UNDEFINED)
2095 return ptrval;
2096 gcc_assert ((ptrval.lattice_val == CONSTANT
2097 && TREE_CODE (ptrval.value) == INTEGER_CST)
2098 || wi::sext (ptrval.mask, TYPE_PRECISION (type)) == -1);
2099 if (attr == NULL_TREE)
2100 {
2101 /* Get aligni and misaligni from __builtin_assume_aligned. */
2102 align = gimple_call_arg (stmt, 1);
2103 if (!tree_fits_uhwi_p (align))
2104 return ptrval;
2105 aligni = tree_to_uhwi (align);
2106 if (gimple_call_num_args (stmt) > 2)
2107 {
2108 misalign = gimple_call_arg (stmt, 2);
2109 if (!tree_fits_uhwi_p (misalign))
2110 return ptrval;
2111 misaligni = tree_to_uhwi (misalign);
2112 }
2113 }
2114 else
2115 {
2116 /* Get aligni and misaligni from assume_aligned or
2117 alloc_align attributes. */
2118 if (TREE_VALUE (attr) == NULL_TREE)
2119 return ptrval;
2120 attr = TREE_VALUE (attr);
2121 align = TREE_VALUE (attr);
2122 if (!tree_fits_uhwi_p (align))
2123 return ptrval;
2124 aligni = tree_to_uhwi (align);
2125 if (alloc_aligned)
2126 {
2127 if (aligni == 0 || aligni > gimple_call_num_args (stmt))
2128 return ptrval;
2129 align = gimple_call_arg (stmt, aligni - 1);
2130 if (!tree_fits_uhwi_p (align))
2131 return ptrval;
2132 aligni = tree_to_uhwi (align);
2133 }
2134 else if (TREE_CHAIN (attr) && TREE_VALUE (TREE_CHAIN (attr)))
2135 {
2136 misalign = TREE_VALUE (TREE_CHAIN (attr));
2137 if (!tree_fits_uhwi_p (misalign))
2138 return ptrval;
2139 misaligni = tree_to_uhwi (misalign);
2140 }
2141 }
2142 if (aligni <= 1 || (aligni & (aligni - 1)) != 0 || misaligni >= aligni)
2143 return ptrval;
2144
2145 align = build_int_cst_type (type, -aligni);
2146 alignval = get_value_for_expr (align, true);
2147 bit_value_binop (BIT_AND_EXPR, TYPE_SIGN (type), TYPE_PRECISION (type), &value, &mask,
2148 TYPE_SIGN (type), TYPE_PRECISION (type), value_to_wide_int (ptrval), ptrval.mask,
2149 TYPE_SIGN (type), TYPE_PRECISION (type), value_to_wide_int (alignval), alignval.mask);
2150
2151 if (wi::sext (mask, TYPE_PRECISION (type)) != -1)
2152 {
2153 val.lattice_val = CONSTANT;
2154 val.mask = mask;
2155 gcc_assert ((mask.to_uhwi () & (aligni - 1)) == 0);
2156 gcc_assert ((value.to_uhwi () & (aligni - 1)) == 0);
2157 value |= misaligni;
2158 /* ??? Delay building trees here. */
2159 val.value = wide_int_to_tree (type, value);
2160 }
2161 else
2162 {
2163 val.lattice_val = VARYING;
2164 val.value = NULL_TREE;
2165 val.mask = -1;
2166 }
2167 return val;
2168 }
2169
2170 /* Evaluate statement STMT.
2171 Valid only for assignments, calls, conditionals, and switches. */
2172
2173 static ccp_prop_value_t
evaluate_stmt(gimple * stmt)2174 evaluate_stmt (gimple *stmt)
2175 {
2176 ccp_prop_value_t val;
2177 tree simplified = NULL_TREE;
2178 ccp_lattice_t likelyvalue = likely_value (stmt);
2179 bool is_constant = false;
2180 unsigned int align;
2181 bool ignore_return_flags = false;
2182
2183 if (dump_file && (dump_flags & TDF_DETAILS))
2184 {
2185 fprintf (dump_file, "which is likely ");
2186 switch (likelyvalue)
2187 {
2188 case CONSTANT:
2189 fprintf (dump_file, "CONSTANT");
2190 break;
2191 case UNDEFINED:
2192 fprintf (dump_file, "UNDEFINED");
2193 break;
2194 case VARYING:
2195 fprintf (dump_file, "VARYING");
2196 break;
2197 default:;
2198 }
2199 fprintf (dump_file, "\n");
2200 }
2201
2202 /* If the statement is likely to have a CONSTANT result, then try
2203 to fold the statement to determine the constant value. */
2204 /* FIXME. This is the only place that we call ccp_fold.
2205 Since likely_value never returns CONSTANT for calls, we will
2206 not attempt to fold them, including builtins that may profit. */
2207 if (likelyvalue == CONSTANT)
2208 {
2209 fold_defer_overflow_warnings ();
2210 simplified = ccp_fold (stmt);
2211 if (simplified
2212 && TREE_CODE (simplified) == SSA_NAME)
2213 {
2214 /* We may not use values of something that may be simulated again,
2215 see valueize_op_1. */
2216 if (SSA_NAME_IS_DEFAULT_DEF (simplified)
2217 || ! prop_simulate_again_p (SSA_NAME_DEF_STMT (simplified)))
2218 {
2219 ccp_prop_value_t *val = get_value (simplified);
2220 if (val && val->lattice_val != VARYING)
2221 {
2222 fold_undefer_overflow_warnings (true, stmt, 0);
2223 return *val;
2224 }
2225 }
2226 else
2227 /* We may also not place a non-valueized copy in the lattice
2228 as that might become stale if we never re-visit this stmt. */
2229 simplified = NULL_TREE;
2230 }
2231 is_constant = simplified && is_gimple_min_invariant (simplified);
2232 fold_undefer_overflow_warnings (is_constant, stmt, 0);
2233 if (is_constant)
2234 {
2235 /* The statement produced a constant value. */
2236 val.lattice_val = CONSTANT;
2237 val.value = simplified;
2238 val.mask = 0;
2239 return val;
2240 }
2241 }
2242 /* If the statement is likely to have a VARYING result, then do not
2243 bother folding the statement. */
2244 else if (likelyvalue == VARYING)
2245 {
2246 enum gimple_code code = gimple_code (stmt);
2247 if (code == GIMPLE_ASSIGN)
2248 {
2249 enum tree_code subcode = gimple_assign_rhs_code (stmt);
2250
2251 /* Other cases cannot satisfy is_gimple_min_invariant
2252 without folding. */
2253 if (get_gimple_rhs_class (subcode) == GIMPLE_SINGLE_RHS)
2254 simplified = gimple_assign_rhs1 (stmt);
2255 }
2256 else if (code == GIMPLE_SWITCH)
2257 simplified = gimple_switch_index (as_a <gswitch *> (stmt));
2258 else
2259 /* These cannot satisfy is_gimple_min_invariant without folding. */
2260 gcc_assert (code == GIMPLE_CALL || code == GIMPLE_COND);
2261 is_constant = simplified && is_gimple_min_invariant (simplified);
2262 if (is_constant)
2263 {
2264 /* The statement produced a constant value. */
2265 val.lattice_val = CONSTANT;
2266 val.value = simplified;
2267 val.mask = 0;
2268 }
2269 }
2270 /* If the statement result is likely UNDEFINED, make it so. */
2271 else if (likelyvalue == UNDEFINED)
2272 {
2273 val.lattice_val = UNDEFINED;
2274 val.value = NULL_TREE;
2275 val.mask = 0;
2276 return val;
2277 }
2278
2279 /* Resort to simplification for bitwise tracking. */
2280 if (flag_tree_bit_ccp
2281 && (likelyvalue == CONSTANT || is_gimple_call (stmt)
2282 || (gimple_assign_single_p (stmt)
2283 && gimple_assign_rhs_code (stmt) == ADDR_EXPR))
2284 && !is_constant)
2285 {
2286 enum gimple_code code = gimple_code (stmt);
2287 val.lattice_val = VARYING;
2288 val.value = NULL_TREE;
2289 val.mask = -1;
2290 if (code == GIMPLE_ASSIGN)
2291 {
2292 enum tree_code subcode = gimple_assign_rhs_code (stmt);
2293 tree rhs1 = gimple_assign_rhs1 (stmt);
2294 tree lhs = gimple_assign_lhs (stmt);
2295 if ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
2296 || POINTER_TYPE_P (TREE_TYPE (lhs)))
2297 && (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
2298 || POINTER_TYPE_P (TREE_TYPE (rhs1))))
2299 switch (get_gimple_rhs_class (subcode))
2300 {
2301 case GIMPLE_SINGLE_RHS:
2302 val = get_value_for_expr (rhs1, true);
2303 break;
2304
2305 case GIMPLE_UNARY_RHS:
2306 val = bit_value_unop (subcode, TREE_TYPE (lhs), rhs1);
2307 break;
2308
2309 case GIMPLE_BINARY_RHS:
2310 val = bit_value_binop (subcode, TREE_TYPE (lhs), rhs1,
2311 gimple_assign_rhs2 (stmt));
2312 break;
2313
2314 default:;
2315 }
2316 }
2317 else if (code == GIMPLE_COND)
2318 {
2319 enum tree_code code = gimple_cond_code (stmt);
2320 tree rhs1 = gimple_cond_lhs (stmt);
2321 tree rhs2 = gimple_cond_rhs (stmt);
2322 if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
2323 || POINTER_TYPE_P (TREE_TYPE (rhs1)))
2324 val = bit_value_binop (code, TREE_TYPE (rhs1), rhs1, rhs2);
2325 }
2326 else if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
2327 {
2328 tree fndecl = gimple_call_fndecl (stmt);
2329 switch (DECL_FUNCTION_CODE (fndecl))
2330 {
2331 case BUILT_IN_MALLOC:
2332 case BUILT_IN_REALLOC:
2333 case BUILT_IN_CALLOC:
2334 case BUILT_IN_STRDUP:
2335 case BUILT_IN_STRNDUP:
2336 val.lattice_val = CONSTANT;
2337 val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0);
2338 val.mask = ~((HOST_WIDE_INT) MALLOC_ABI_ALIGNMENT
2339 / BITS_PER_UNIT - 1);
2340 break;
2341
2342 CASE_BUILT_IN_ALLOCA:
2343 align = (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_ALLOCA
2344 ? BIGGEST_ALIGNMENT
2345 : TREE_INT_CST_LOW (gimple_call_arg (stmt, 1)));
2346 val.lattice_val = CONSTANT;
2347 val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0);
2348 val.mask = ~((HOST_WIDE_INT) align / BITS_PER_UNIT - 1);
2349 break;
2350
2351 case BUILT_IN_ASSUME_ALIGNED:
2352 val = bit_value_assume_aligned (stmt, NULL_TREE, val, false);
2353 ignore_return_flags = true;
2354 break;
2355
2356 case BUILT_IN_ALIGNED_ALLOC:
2357 case BUILT_IN_GOMP_ALLOC:
2358 {
2359 tree align = get_constant_value (gimple_call_arg (stmt, 0));
2360 if (align
2361 && tree_fits_uhwi_p (align))
2362 {
2363 unsigned HOST_WIDE_INT aligni = tree_to_uhwi (align);
2364 if (aligni > 1
2365 /* align must be power-of-two */
2366 && (aligni & (aligni - 1)) == 0)
2367 {
2368 val.lattice_val = CONSTANT;
2369 val.value = build_int_cst (ptr_type_node, 0);
2370 val.mask = -aligni;
2371 }
2372 }
2373 break;
2374 }
2375
2376 case BUILT_IN_BSWAP16:
2377 case BUILT_IN_BSWAP32:
2378 case BUILT_IN_BSWAP64:
2379 case BUILT_IN_BSWAP128:
2380 val = get_value_for_expr (gimple_call_arg (stmt, 0), true);
2381 if (val.lattice_val == UNDEFINED)
2382 break;
2383 else if (val.lattice_val == CONSTANT
2384 && val.value
2385 && TREE_CODE (val.value) == INTEGER_CST)
2386 {
2387 tree type = TREE_TYPE (gimple_call_lhs (stmt));
2388 int prec = TYPE_PRECISION (type);
2389 wide_int wval = wi::to_wide (val.value);
2390 val.value
2391 = wide_int_to_tree (type,
2392 wide_int::from (wval, prec,
2393 UNSIGNED).bswap ());
2394 val.mask
2395 = widest_int::from (wide_int::from (val.mask, prec,
2396 UNSIGNED).bswap (),
2397 UNSIGNED);
2398 if (wi::sext (val.mask, prec) != -1)
2399 break;
2400 }
2401 val.lattice_val = VARYING;
2402 val.value = NULL_TREE;
2403 val.mask = -1;
2404 break;
2405
2406 default:;
2407 }
2408 }
2409 if (is_gimple_call (stmt) && gimple_call_lhs (stmt))
2410 {
2411 tree fntype = gimple_call_fntype (stmt);
2412 if (fntype)
2413 {
2414 tree attrs = lookup_attribute ("assume_aligned",
2415 TYPE_ATTRIBUTES (fntype));
2416 if (attrs)
2417 val = bit_value_assume_aligned (stmt, attrs, val, false);
2418 attrs = lookup_attribute ("alloc_align",
2419 TYPE_ATTRIBUTES (fntype));
2420 if (attrs)
2421 val = bit_value_assume_aligned (stmt, attrs, val, true);
2422 }
2423 int flags = ignore_return_flags
2424 ? 0 : gimple_call_return_flags (as_a <gcall *> (stmt));
2425 if (flags & ERF_RETURNS_ARG
2426 && (flags & ERF_RETURN_ARG_MASK) < gimple_call_num_args (stmt))
2427 {
2428 val = get_value_for_expr
2429 (gimple_call_arg (stmt,
2430 flags & ERF_RETURN_ARG_MASK), true);
2431 }
2432 }
2433 is_constant = (val.lattice_val == CONSTANT);
2434 }
2435
2436 if (flag_tree_bit_ccp
2437 && ((is_constant && TREE_CODE (val.value) == INTEGER_CST)
2438 || !is_constant)
2439 && gimple_get_lhs (stmt)
2440 && TREE_CODE (gimple_get_lhs (stmt)) == SSA_NAME)
2441 {
2442 tree lhs = gimple_get_lhs (stmt);
2443 wide_int nonzero_bits = get_nonzero_bits (lhs);
2444 if (nonzero_bits != -1)
2445 {
2446 if (!is_constant)
2447 {
2448 val.lattice_val = CONSTANT;
2449 val.value = build_zero_cst (TREE_TYPE (lhs));
2450 val.mask = extend_mask (nonzero_bits, TYPE_SIGN (TREE_TYPE (lhs)));
2451 is_constant = true;
2452 }
2453 else
2454 {
2455 if (wi::bit_and_not (wi::to_wide (val.value), nonzero_bits) != 0)
2456 val.value = wide_int_to_tree (TREE_TYPE (lhs),
2457 nonzero_bits
2458 & wi::to_wide (val.value));
2459 if (nonzero_bits == 0)
2460 val.mask = 0;
2461 else
2462 val.mask = val.mask & extend_mask (nonzero_bits,
2463 TYPE_SIGN (TREE_TYPE (lhs)));
2464 }
2465 }
2466 }
2467
2468 /* The statement produced a nonconstant value. */
2469 if (!is_constant)
2470 {
2471 /* The statement produced a copy. */
2472 if (simplified && TREE_CODE (simplified) == SSA_NAME
2473 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (simplified))
2474 {
2475 val.lattice_val = CONSTANT;
2476 val.value = simplified;
2477 val.mask = -1;
2478 }
2479 /* The statement is VARYING. */
2480 else
2481 {
2482 val.lattice_val = VARYING;
2483 val.value = NULL_TREE;
2484 val.mask = -1;
2485 }
2486 }
2487
2488 return val;
2489 }
2490
2491 typedef hash_table<nofree_ptr_hash<gimple> > gimple_htab;
2492
2493 /* Given a BUILT_IN_STACK_SAVE value SAVED_VAL, insert a clobber of VAR before
2494 each matching BUILT_IN_STACK_RESTORE. Mark visited phis in VISITED. */
2495
2496 static void
insert_clobber_before_stack_restore(tree saved_val,tree var,gimple_htab ** visited)2497 insert_clobber_before_stack_restore (tree saved_val, tree var,
2498 gimple_htab **visited)
2499 {
2500 gimple *stmt;
2501 gassign *clobber_stmt;
2502 tree clobber;
2503 imm_use_iterator iter;
2504 gimple_stmt_iterator i;
2505 gimple **slot;
2506
2507 FOR_EACH_IMM_USE_STMT (stmt, iter, saved_val)
2508 if (gimple_call_builtin_p (stmt, BUILT_IN_STACK_RESTORE))
2509 {
2510 clobber = build_clobber (TREE_TYPE (var), CLOBBER_EOL);
2511 clobber_stmt = gimple_build_assign (var, clobber);
2512
2513 i = gsi_for_stmt (stmt);
2514 gsi_insert_before (&i, clobber_stmt, GSI_SAME_STMT);
2515 }
2516 else if (gimple_code (stmt) == GIMPLE_PHI)
2517 {
2518 if (!*visited)
2519 *visited = new gimple_htab (10);
2520
2521 slot = (*visited)->find_slot (stmt, INSERT);
2522 if (*slot != NULL)
2523 continue;
2524
2525 *slot = stmt;
2526 insert_clobber_before_stack_restore (gimple_phi_result (stmt), var,
2527 visited);
2528 }
2529 else if (gimple_assign_ssa_name_copy_p (stmt))
2530 insert_clobber_before_stack_restore (gimple_assign_lhs (stmt), var,
2531 visited);
2532 }
2533
2534 /* Advance the iterator to the previous non-debug gimple statement in the same
2535 or dominating basic block. */
2536
2537 static inline void
gsi_prev_dom_bb_nondebug(gimple_stmt_iterator * i)2538 gsi_prev_dom_bb_nondebug (gimple_stmt_iterator *i)
2539 {
2540 basic_block dom;
2541
2542 gsi_prev_nondebug (i);
2543 while (gsi_end_p (*i))
2544 {
2545 dom = get_immediate_dominator (CDI_DOMINATORS, gsi_bb (*i));
2546 if (dom == NULL || dom == ENTRY_BLOCK_PTR_FOR_FN (cfun))
2547 return;
2548
2549 *i = gsi_last_bb (dom);
2550 }
2551 }
2552
2553 /* Find a BUILT_IN_STACK_SAVE dominating gsi_stmt (I), and insert
2554 a clobber of VAR before each matching BUILT_IN_STACK_RESTORE.
2555
2556 It is possible that BUILT_IN_STACK_SAVE cannot be found in a dominator when
2557 a previous pass (such as DOM) duplicated it along multiple paths to a BB.
2558 In that case the function gives up without inserting the clobbers. */
2559
2560 static void
insert_clobbers_for_var(gimple_stmt_iterator i,tree var)2561 insert_clobbers_for_var (gimple_stmt_iterator i, tree var)
2562 {
2563 gimple *stmt;
2564 tree saved_val;
2565 gimple_htab *visited = NULL;
2566
2567 for (; !gsi_end_p (i); gsi_prev_dom_bb_nondebug (&i))
2568 {
2569 stmt = gsi_stmt (i);
2570
2571 if (!gimple_call_builtin_p (stmt, BUILT_IN_STACK_SAVE))
2572 continue;
2573
2574 saved_val = gimple_call_lhs (stmt);
2575 if (saved_val == NULL_TREE)
2576 continue;
2577
2578 insert_clobber_before_stack_restore (saved_val, var, &visited);
2579 break;
2580 }
2581
2582 delete visited;
2583 }
2584
2585 /* Detects a __builtin_alloca_with_align with constant size argument. Declares
2586 fixed-size array and returns the address, if found, otherwise returns
2587 NULL_TREE. */
2588
2589 static tree
fold_builtin_alloca_with_align(gimple * stmt)2590 fold_builtin_alloca_with_align (gimple *stmt)
2591 {
2592 unsigned HOST_WIDE_INT size, threshold, n_elem;
2593 tree lhs, arg, block, var, elem_type, array_type;
2594
2595 /* Get lhs. */
2596 lhs = gimple_call_lhs (stmt);
2597 if (lhs == NULL_TREE)
2598 return NULL_TREE;
2599
2600 /* Detect constant argument. */
2601 arg = get_constant_value (gimple_call_arg (stmt, 0));
2602 if (arg == NULL_TREE
2603 || TREE_CODE (arg) != INTEGER_CST
2604 || !tree_fits_uhwi_p (arg))
2605 return NULL_TREE;
2606
2607 size = tree_to_uhwi (arg);
2608
2609 /* Heuristic: don't fold large allocas. */
2610 threshold = (unsigned HOST_WIDE_INT)param_large_stack_frame;
2611 /* In case the alloca is located at function entry, it has the same lifetime
2612 as a declared array, so we allow a larger size. */
2613 block = gimple_block (stmt);
2614 if (!(cfun->after_inlining
2615 && block
2616 && TREE_CODE (BLOCK_SUPERCONTEXT (block)) == FUNCTION_DECL))
2617 threshold /= 10;
2618 if (size > threshold)
2619 return NULL_TREE;
2620
2621 /* We have to be able to move points-to info. We used to assert
2622 that we can but IPA PTA might end up with two UIDs here
2623 as it might need to handle more than one instance being
2624 live at the same time. Instead of trying to detect this case
2625 (using the first UID would be OK) just give up for now. */
2626 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (lhs);
2627 unsigned uid = 0;
2628 if (pi != NULL
2629 && !pi->pt.anything
2630 && !pt_solution_singleton_or_null_p (&pi->pt, &uid))
2631 return NULL_TREE;
2632
2633 /* Declare array. */
2634 elem_type = build_nonstandard_integer_type (BITS_PER_UNIT, 1);
2635 n_elem = size * 8 / BITS_PER_UNIT;
2636 array_type = build_array_type_nelts (elem_type, n_elem);
2637
2638 if (tree ssa_name = SSA_NAME_IDENTIFIER (lhs))
2639 {
2640 /* Give the temporary a name derived from the name of the VLA
2641 declaration so it can be referenced in diagnostics. */
2642 const char *name = IDENTIFIER_POINTER (ssa_name);
2643 var = create_tmp_var (array_type, name);
2644 }
2645 else
2646 var = create_tmp_var (array_type);
2647
2648 if (gimple *lhsdef = SSA_NAME_DEF_STMT (lhs))
2649 {
2650 /* Set the temporary's location to that of the VLA declaration
2651 so it can be pointed to in diagnostics. */
2652 location_t loc = gimple_location (lhsdef);
2653 DECL_SOURCE_LOCATION (var) = loc;
2654 }
2655
2656 SET_DECL_ALIGN (var, TREE_INT_CST_LOW (gimple_call_arg (stmt, 1)));
2657 if (uid != 0)
2658 SET_DECL_PT_UID (var, uid);
2659
2660 /* Fold alloca to the address of the array. */
2661 return fold_convert (TREE_TYPE (lhs), build_fold_addr_expr (var));
2662 }
2663
2664 /* Fold the stmt at *GSI with CCP specific information that propagating
2665 and regular folding does not catch. */
2666
2667 bool
fold_stmt(gimple_stmt_iterator * gsi)2668 ccp_folder::fold_stmt (gimple_stmt_iterator *gsi)
2669 {
2670 gimple *stmt = gsi_stmt (*gsi);
2671
2672 switch (gimple_code (stmt))
2673 {
2674 case GIMPLE_COND:
2675 {
2676 gcond *cond_stmt = as_a <gcond *> (stmt);
2677 ccp_prop_value_t val;
2678 /* Statement evaluation will handle type mismatches in constants
2679 more gracefully than the final propagation. This allows us to
2680 fold more conditionals here. */
2681 val = evaluate_stmt (stmt);
2682 if (val.lattice_val != CONSTANT
2683 || val.mask != 0)
2684 return false;
2685
2686 if (dump_file)
2687 {
2688 fprintf (dump_file, "Folding predicate ");
2689 print_gimple_expr (dump_file, stmt, 0);
2690 fprintf (dump_file, " to ");
2691 print_generic_expr (dump_file, val.value);
2692 fprintf (dump_file, "\n");
2693 }
2694
2695 if (integer_zerop (val.value))
2696 gimple_cond_make_false (cond_stmt);
2697 else
2698 gimple_cond_make_true (cond_stmt);
2699
2700 return true;
2701 }
2702
2703 case GIMPLE_CALL:
2704 {
2705 tree lhs = gimple_call_lhs (stmt);
2706 int flags = gimple_call_flags (stmt);
2707 tree val;
2708 tree argt;
2709 bool changed = false;
2710 unsigned i;
2711
2712 /* If the call was folded into a constant make sure it goes
2713 away even if we cannot propagate into all uses because of
2714 type issues. */
2715 if (lhs
2716 && TREE_CODE (lhs) == SSA_NAME
2717 && (val = get_constant_value (lhs))
2718 /* Don't optimize away calls that have side-effects. */
2719 && (flags & (ECF_CONST|ECF_PURE)) != 0
2720 && (flags & ECF_LOOPING_CONST_OR_PURE) == 0)
2721 {
2722 tree new_rhs = unshare_expr (val);
2723 if (!useless_type_conversion_p (TREE_TYPE (lhs),
2724 TREE_TYPE (new_rhs)))
2725 new_rhs = fold_convert (TREE_TYPE (lhs), new_rhs);
2726 gimplify_and_update_call_from_tree (gsi, new_rhs);
2727 return true;
2728 }
2729
2730 /* Internal calls provide no argument types, so the extra laxity
2731 for normal calls does not apply. */
2732 if (gimple_call_internal_p (stmt))
2733 return false;
2734
2735 /* The heuristic of fold_builtin_alloca_with_align differs before and
2736 after inlining, so we don't require the arg to be changed into a
2737 constant for folding, but just to be constant. */
2738 if (gimple_call_builtin_p (stmt, BUILT_IN_ALLOCA_WITH_ALIGN)
2739 || gimple_call_builtin_p (stmt, BUILT_IN_ALLOCA_WITH_ALIGN_AND_MAX))
2740 {
2741 tree new_rhs = fold_builtin_alloca_with_align (stmt);
2742 if (new_rhs)
2743 {
2744 gimplify_and_update_call_from_tree (gsi, new_rhs);
2745 tree var = TREE_OPERAND (TREE_OPERAND (new_rhs, 0),0);
2746 insert_clobbers_for_var (*gsi, var);
2747 return true;
2748 }
2749 }
2750
2751 /* If there's no extra info from an assume_aligned call,
2752 drop it so it doesn't act as otherwise useless dataflow
2753 barrier. */
2754 if (gimple_call_builtin_p (stmt, BUILT_IN_ASSUME_ALIGNED))
2755 {
2756 tree ptr = gimple_call_arg (stmt, 0);
2757 ccp_prop_value_t ptrval = get_value_for_expr (ptr, true);
2758 if (ptrval.lattice_val == CONSTANT
2759 && TREE_CODE (ptrval.value) == INTEGER_CST
2760 && ptrval.mask != 0)
2761 {
2762 ccp_prop_value_t val
2763 = bit_value_assume_aligned (stmt, NULL_TREE, ptrval, false);
2764 unsigned int ptralign = least_bit_hwi (ptrval.mask.to_uhwi ());
2765 unsigned int align = least_bit_hwi (val.mask.to_uhwi ());
2766 if (ptralign == align
2767 && ((TREE_INT_CST_LOW (ptrval.value) & (align - 1))
2768 == (TREE_INT_CST_LOW (val.value) & (align - 1))))
2769 {
2770 replace_call_with_value (gsi, ptr);
2771 return true;
2772 }
2773 }
2774 }
2775
2776 /* Propagate into the call arguments. Compared to replace_uses_in
2777 this can use the argument slot types for type verification
2778 instead of the current argument type. We also can safely
2779 drop qualifiers here as we are dealing with constants anyway. */
2780 argt = TYPE_ARG_TYPES (gimple_call_fntype (stmt));
2781 for (i = 0; i < gimple_call_num_args (stmt) && argt;
2782 ++i, argt = TREE_CHAIN (argt))
2783 {
2784 tree arg = gimple_call_arg (stmt, i);
2785 if (TREE_CODE (arg) == SSA_NAME
2786 && (val = get_constant_value (arg))
2787 && useless_type_conversion_p
2788 (TYPE_MAIN_VARIANT (TREE_VALUE (argt)),
2789 TYPE_MAIN_VARIANT (TREE_TYPE (val))))
2790 {
2791 gimple_call_set_arg (stmt, i, unshare_expr (val));
2792 changed = true;
2793 }
2794 }
2795
2796 return changed;
2797 }
2798
2799 case GIMPLE_ASSIGN:
2800 {
2801 tree lhs = gimple_assign_lhs (stmt);
2802 tree val;
2803
2804 /* If we have a load that turned out to be constant replace it
2805 as we cannot propagate into all uses in all cases. */
2806 if (gimple_assign_single_p (stmt)
2807 && TREE_CODE (lhs) == SSA_NAME
2808 && (val = get_constant_value (lhs)))
2809 {
2810 tree rhs = unshare_expr (val);
2811 if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
2812 rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lhs), rhs);
2813 gimple_assign_set_rhs_from_tree (gsi, rhs);
2814 return true;
2815 }
2816
2817 return false;
2818 }
2819
2820 default:
2821 return false;
2822 }
2823 }
2824
2825 /* Visit the assignment statement STMT. Set the value of its LHS to the
2826 value computed by the RHS and store LHS in *OUTPUT_P. If STMT
2827 creates virtual definitions, set the value of each new name to that
2828 of the RHS (if we can derive a constant out of the RHS).
2829 Value-returning call statements also perform an assignment, and
2830 are handled here. */
2831
2832 static enum ssa_prop_result
visit_assignment(gimple * stmt,tree * output_p)2833 visit_assignment (gimple *stmt, tree *output_p)
2834 {
2835 ccp_prop_value_t val;
2836 enum ssa_prop_result retval = SSA_PROP_NOT_INTERESTING;
2837
2838 tree lhs = gimple_get_lhs (stmt);
2839 if (TREE_CODE (lhs) == SSA_NAME)
2840 {
2841 /* Evaluate the statement, which could be
2842 either a GIMPLE_ASSIGN or a GIMPLE_CALL. */
2843 val = evaluate_stmt (stmt);
2844
2845 /* If STMT is an assignment to an SSA_NAME, we only have one
2846 value to set. */
2847 if (set_lattice_value (lhs, &val))
2848 {
2849 *output_p = lhs;
2850 if (val.lattice_val == VARYING)
2851 retval = SSA_PROP_VARYING;
2852 else
2853 retval = SSA_PROP_INTERESTING;
2854 }
2855 }
2856
2857 return retval;
2858 }
2859
2860
2861 /* Visit the conditional statement STMT. Return SSA_PROP_INTERESTING
2862 if it can determine which edge will be taken. Otherwise, return
2863 SSA_PROP_VARYING. */
2864
2865 static enum ssa_prop_result
visit_cond_stmt(gimple * stmt,edge * taken_edge_p)2866 visit_cond_stmt (gimple *stmt, edge *taken_edge_p)
2867 {
2868 ccp_prop_value_t val;
2869 basic_block block;
2870
2871 block = gimple_bb (stmt);
2872 val = evaluate_stmt (stmt);
2873 if (val.lattice_val != CONSTANT
2874 || val.mask != 0)
2875 return SSA_PROP_VARYING;
2876
2877 /* Find which edge out of the conditional block will be taken and add it
2878 to the worklist. If no single edge can be determined statically,
2879 return SSA_PROP_VARYING to feed all the outgoing edges to the
2880 propagation engine. */
2881 *taken_edge_p = find_taken_edge (block, val.value);
2882 if (*taken_edge_p)
2883 return SSA_PROP_INTERESTING;
2884 else
2885 return SSA_PROP_VARYING;
2886 }
2887
2888
2889 /* Evaluate statement STMT. If the statement produces an output value and
2890 its evaluation changes the lattice value of its output, return
2891 SSA_PROP_INTERESTING and set *OUTPUT_P to the SSA_NAME holding the
2892 output value.
2893
2894 If STMT is a conditional branch and we can determine its truth
2895 value, set *TAKEN_EDGE_P accordingly. If STMT produces a varying
2896 value, return SSA_PROP_VARYING. */
2897
2898 enum ssa_prop_result
visit_stmt(gimple * stmt,edge * taken_edge_p,tree * output_p)2899 ccp_propagate::visit_stmt (gimple *stmt, edge *taken_edge_p, tree *output_p)
2900 {
2901 tree def;
2902 ssa_op_iter iter;
2903
2904 if (dump_file && (dump_flags & TDF_DETAILS))
2905 {
2906 fprintf (dump_file, "\nVisiting statement:\n");
2907 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2908 }
2909
2910 switch (gimple_code (stmt))
2911 {
2912 case GIMPLE_ASSIGN:
2913 /* If the statement is an assignment that produces a single
2914 output value, evaluate its RHS to see if the lattice value of
2915 its output has changed. */
2916 return visit_assignment (stmt, output_p);
2917
2918 case GIMPLE_CALL:
2919 /* A value-returning call also performs an assignment. */
2920 if (gimple_call_lhs (stmt) != NULL_TREE)
2921 return visit_assignment (stmt, output_p);
2922 break;
2923
2924 case GIMPLE_COND:
2925 case GIMPLE_SWITCH:
2926 /* If STMT is a conditional branch, see if we can determine
2927 which branch will be taken. */
2928 /* FIXME. It appears that we should be able to optimize
2929 computed GOTOs here as well. */
2930 return visit_cond_stmt (stmt, taken_edge_p);
2931
2932 default:
2933 break;
2934 }
2935
2936 /* Any other kind of statement is not interesting for constant
2937 propagation and, therefore, not worth simulating. */
2938 if (dump_file && (dump_flags & TDF_DETAILS))
2939 fprintf (dump_file, "No interesting values produced. Marked VARYING.\n");
2940
2941 /* Definitions made by statements other than assignments to
2942 SSA_NAMEs represent unknown modifications to their outputs.
2943 Mark them VARYING. */
2944 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
2945 set_value_varying (def);
2946
2947 return SSA_PROP_VARYING;
2948 }
2949
2950
2951 /* Main entry point for SSA Conditional Constant Propagation. If NONZERO_P,
2952 record nonzero bits. */
2953
2954 static unsigned int
do_ssa_ccp(bool nonzero_p)2955 do_ssa_ccp (bool nonzero_p)
2956 {
2957 unsigned int todo = 0;
2958 calculate_dominance_info (CDI_DOMINATORS);
2959
2960 ccp_initialize ();
2961 class ccp_propagate ccp_propagate;
2962 ccp_propagate.ssa_propagate ();
2963 if (ccp_finalize (nonzero_p || flag_ipa_bit_cp))
2964 {
2965 todo = (TODO_cleanup_cfg | TODO_update_ssa);
2966
2967 /* ccp_finalize does not preserve loop-closed ssa. */
2968 loops_state_clear (LOOP_CLOSED_SSA);
2969 }
2970
2971 free_dominance_info (CDI_DOMINATORS);
2972 return todo;
2973 }
2974
2975
2976 namespace {
2977
2978 const pass_data pass_data_ccp =
2979 {
2980 GIMPLE_PASS, /* type */
2981 "ccp", /* name */
2982 OPTGROUP_NONE, /* optinfo_flags */
2983 TV_TREE_CCP, /* tv_id */
2984 ( PROP_cfg | PROP_ssa ), /* properties_required */
2985 0, /* properties_provided */
2986 0, /* properties_destroyed */
2987 0, /* todo_flags_start */
2988 TODO_update_address_taken, /* todo_flags_finish */
2989 };
2990
2991 class pass_ccp : public gimple_opt_pass
2992 {
2993 public:
pass_ccp(gcc::context * ctxt)2994 pass_ccp (gcc::context *ctxt)
2995 : gimple_opt_pass (pass_data_ccp, ctxt), nonzero_p (false)
2996 {}
2997
2998 /* opt_pass methods: */
clone()2999 opt_pass * clone () { return new pass_ccp (m_ctxt); }
set_pass_param(unsigned int n,bool param)3000 void set_pass_param (unsigned int n, bool param)
3001 {
3002 gcc_assert (n == 0);
3003 nonzero_p = param;
3004 }
gate(function *)3005 virtual bool gate (function *) { return flag_tree_ccp != 0; }
execute(function *)3006 virtual unsigned int execute (function *) { return do_ssa_ccp (nonzero_p); }
3007
3008 private:
3009 /* Determines whether the pass instance records nonzero bits. */
3010 bool nonzero_p;
3011 }; // class pass_ccp
3012
3013 } // anon namespace
3014
3015 gimple_opt_pass *
make_pass_ccp(gcc::context * ctxt)3016 make_pass_ccp (gcc::context *ctxt)
3017 {
3018 return new pass_ccp (ctxt);
3019 }
3020
3021
3022
3023 /* Try to optimize out __builtin_stack_restore. Optimize it out
3024 if there is another __builtin_stack_restore in the same basic
3025 block and no calls or ASM_EXPRs are in between, or if this block's
3026 only outgoing edge is to EXIT_BLOCK and there are no calls or
3027 ASM_EXPRs after this __builtin_stack_restore. */
3028
3029 static tree
optimize_stack_restore(gimple_stmt_iterator i)3030 optimize_stack_restore (gimple_stmt_iterator i)
3031 {
3032 tree callee;
3033 gimple *stmt;
3034
3035 basic_block bb = gsi_bb (i);
3036 gimple *call = gsi_stmt (i);
3037
3038 if (gimple_code (call) != GIMPLE_CALL
3039 || gimple_call_num_args (call) != 1
3040 || TREE_CODE (gimple_call_arg (call, 0)) != SSA_NAME
3041 || !POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (call, 0))))
3042 return NULL_TREE;
3043
3044 for (gsi_next (&i); !gsi_end_p (i); gsi_next (&i))
3045 {
3046 stmt = gsi_stmt (i);
3047 if (gimple_code (stmt) == GIMPLE_ASM)
3048 return NULL_TREE;
3049 if (gimple_code (stmt) != GIMPLE_CALL)
3050 continue;
3051
3052 callee = gimple_call_fndecl (stmt);
3053 if (!callee
3054 || !fndecl_built_in_p (callee, BUILT_IN_NORMAL)
3055 /* All regular builtins are ok, just obviously not alloca. */
3056 || ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (callee)))
3057 return NULL_TREE;
3058
3059 if (fndecl_built_in_p (callee, BUILT_IN_STACK_RESTORE))
3060 goto second_stack_restore;
3061 }
3062
3063 if (!gsi_end_p (i))
3064 return NULL_TREE;
3065
3066 /* Allow one successor of the exit block, or zero successors. */
3067 switch (EDGE_COUNT (bb->succs))
3068 {
3069 case 0:
3070 break;
3071 case 1:
3072 if (single_succ_edge (bb)->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
3073 return NULL_TREE;
3074 break;
3075 default:
3076 return NULL_TREE;
3077 }
3078 second_stack_restore:
3079
3080 /* If there's exactly one use, then zap the call to __builtin_stack_save.
3081 If there are multiple uses, then the last one should remove the call.
3082 In any case, whether the call to __builtin_stack_save can be removed
3083 or not is irrelevant to removing the call to __builtin_stack_restore. */
3084 if (has_single_use (gimple_call_arg (call, 0)))
3085 {
3086 gimple *stack_save = SSA_NAME_DEF_STMT (gimple_call_arg (call, 0));
3087 if (is_gimple_call (stack_save))
3088 {
3089 callee = gimple_call_fndecl (stack_save);
3090 if (callee && fndecl_built_in_p (callee, BUILT_IN_STACK_SAVE))
3091 {
3092 gimple_stmt_iterator stack_save_gsi;
3093 tree rhs;
3094
3095 stack_save_gsi = gsi_for_stmt (stack_save);
3096 rhs = build_int_cst (TREE_TYPE (gimple_call_arg (call, 0)), 0);
3097 replace_call_with_value (&stack_save_gsi, rhs);
3098 }
3099 }
3100 }
3101
3102 /* No effect, so the statement will be deleted. */
3103 return integer_zero_node;
3104 }
3105
3106 /* If va_list type is a simple pointer and nothing special is needed,
3107 optimize __builtin_va_start (&ap, 0) into ap = __builtin_next_arg (0),
3108 __builtin_va_end (&ap) out as NOP and __builtin_va_copy into a simple
3109 pointer assignment. */
3110
3111 static tree
optimize_stdarg_builtin(gimple * call)3112 optimize_stdarg_builtin (gimple *call)
3113 {
3114 tree callee, lhs, rhs, cfun_va_list;
3115 bool va_list_simple_ptr;
3116 location_t loc = gimple_location (call);
3117
3118 callee = gimple_call_fndecl (call);
3119
3120 cfun_va_list = targetm.fn_abi_va_list (callee);
3121 va_list_simple_ptr = POINTER_TYPE_P (cfun_va_list)
3122 && (TREE_TYPE (cfun_va_list) == void_type_node
3123 || TREE_TYPE (cfun_va_list) == char_type_node);
3124
3125 switch (DECL_FUNCTION_CODE (callee))
3126 {
3127 case BUILT_IN_VA_START:
3128 if (!va_list_simple_ptr
3129 || targetm.expand_builtin_va_start != NULL
3130 || !builtin_decl_explicit_p (BUILT_IN_NEXT_ARG))
3131 return NULL_TREE;
3132
3133 if (gimple_call_num_args (call) != 2)
3134 return NULL_TREE;
3135
3136 lhs = gimple_call_arg (call, 0);
3137 if (!POINTER_TYPE_P (TREE_TYPE (lhs))
3138 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
3139 != TYPE_MAIN_VARIANT (cfun_va_list))
3140 return NULL_TREE;
3141
3142 lhs = build_fold_indirect_ref_loc (loc, lhs);
3143 rhs = build_call_expr_loc (loc, builtin_decl_explicit (BUILT_IN_NEXT_ARG),
3144 1, integer_zero_node);
3145 rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
3146 return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
3147
3148 case BUILT_IN_VA_COPY:
3149 if (!va_list_simple_ptr)
3150 return NULL_TREE;
3151
3152 if (gimple_call_num_args (call) != 2)
3153 return NULL_TREE;
3154
3155 lhs = gimple_call_arg (call, 0);
3156 if (!POINTER_TYPE_P (TREE_TYPE (lhs))
3157 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs)))
3158 != TYPE_MAIN_VARIANT (cfun_va_list))
3159 return NULL_TREE;
3160
3161 lhs = build_fold_indirect_ref_loc (loc, lhs);
3162 rhs = gimple_call_arg (call, 1);
3163 if (TYPE_MAIN_VARIANT (TREE_TYPE (rhs))
3164 != TYPE_MAIN_VARIANT (cfun_va_list))
3165 return NULL_TREE;
3166
3167 rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs);
3168 return build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, rhs);
3169
3170 case BUILT_IN_VA_END:
3171 /* No effect, so the statement will be deleted. */
3172 return integer_zero_node;
3173
3174 default:
3175 gcc_unreachable ();
3176 }
3177 }
3178
3179 /* Attemp to make the block of __builtin_unreachable I unreachable by changing
3180 the incoming jumps. Return true if at least one jump was changed. */
3181
3182 static bool
optimize_unreachable(gimple_stmt_iterator i)3183 optimize_unreachable (gimple_stmt_iterator i)
3184 {
3185 basic_block bb = gsi_bb (i);
3186 gimple_stmt_iterator gsi;
3187 gimple *stmt;
3188 edge_iterator ei;
3189 edge e;
3190 bool ret;
3191
3192 if (flag_sanitize & SANITIZE_UNREACHABLE)
3193 return false;
3194
3195 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
3196 {
3197 stmt = gsi_stmt (gsi);
3198
3199 if (is_gimple_debug (stmt))
3200 continue;
3201
3202 if (glabel *label_stmt = dyn_cast <glabel *> (stmt))
3203 {
3204 /* Verify we do not need to preserve the label. */
3205 if (FORCED_LABEL (gimple_label_label (label_stmt)))
3206 return false;
3207
3208 continue;
3209 }
3210
3211 /* Only handle the case that __builtin_unreachable is the first statement
3212 in the block. We rely on DCE to remove stmts without side-effects
3213 before __builtin_unreachable. */
3214 if (gsi_stmt (gsi) != gsi_stmt (i))
3215 return false;
3216 }
3217
3218 ret = false;
3219 FOR_EACH_EDGE (e, ei, bb->preds)
3220 {
3221 gsi = gsi_last_bb (e->src);
3222 if (gsi_end_p (gsi))
3223 continue;
3224
3225 stmt = gsi_stmt (gsi);
3226 if (gcond *cond_stmt = dyn_cast <gcond *> (stmt))
3227 {
3228 if (e->flags & EDGE_TRUE_VALUE)
3229 gimple_cond_make_false (cond_stmt);
3230 else if (e->flags & EDGE_FALSE_VALUE)
3231 gimple_cond_make_true (cond_stmt);
3232 else
3233 gcc_unreachable ();
3234 update_stmt (cond_stmt);
3235 }
3236 else
3237 {
3238 /* Todo: handle other cases. Note that unreachable switch case
3239 statements have already been removed. */
3240 continue;
3241 }
3242
3243 ret = true;
3244 }
3245
3246 return ret;
3247 }
3248
3249 /* Convert
3250 _1 = __atomic_fetch_or_* (ptr_6, 1, _3);
3251 _7 = ~_1;
3252 _5 = (_Bool) _7;
3253 to
3254 _1 = __atomic_fetch_or_* (ptr_6, 1, _3);
3255 _8 = _1 & 1;
3256 _5 = _8 == 0;
3257 and convert
3258 _1 = __atomic_fetch_and_* (ptr_6, ~1, _3);
3259 _7 = ~_1;
3260 _4 = (_Bool) _7;
3261 to
3262 _1 = __atomic_fetch_and_* (ptr_6, ~1, _3);
3263 _8 = _1 & 1;
3264 _4 = (_Bool) _8;
3265
3266 USE_STMT is the gimplt statement which uses the return value of
3267 __atomic_fetch_or_*. LHS is the return value of __atomic_fetch_or_*.
3268 MASK is the mask passed to __atomic_fetch_or_*.
3269 */
3270
3271 static gimple *
convert_atomic_bit_not(enum internal_fn fn,gimple * use_stmt,tree lhs,tree mask)3272 convert_atomic_bit_not (enum internal_fn fn, gimple *use_stmt,
3273 tree lhs, tree mask)
3274 {
3275 tree and_mask;
3276 if (fn == IFN_ATOMIC_BIT_TEST_AND_RESET)
3277 {
3278 /* MASK must be ~1. */
3279 if (!operand_equal_p (build_int_cst (TREE_TYPE (lhs),
3280 ~HOST_WIDE_INT_1), mask, 0))
3281 return nullptr;
3282 and_mask = build_int_cst (TREE_TYPE (lhs), 1);
3283 }
3284 else
3285 {
3286 /* MASK must be 1. */
3287 if (!operand_equal_p (build_int_cst (TREE_TYPE (lhs), 1), mask, 0))
3288 return nullptr;
3289 and_mask = mask;
3290 }
3291
3292 tree use_lhs = gimple_assign_lhs (use_stmt);
3293
3294 use_operand_p use_p;
3295 gimple *use_not_stmt;
3296
3297 if (!single_imm_use (use_lhs, &use_p, &use_not_stmt)
3298 || !is_gimple_assign (use_not_stmt))
3299 return nullptr;
3300
3301 if (!CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (use_not_stmt)))
3302 return nullptr;
3303
3304 tree use_not_lhs = gimple_assign_lhs (use_not_stmt);
3305 if (TREE_CODE (TREE_TYPE (use_not_lhs)) != BOOLEAN_TYPE)
3306 return nullptr;
3307
3308 gimple_stmt_iterator gsi;
3309 gsi = gsi_for_stmt (use_stmt);
3310 gsi_remove (&gsi, true);
3311 tree var = make_ssa_name (TREE_TYPE (lhs));
3312 use_stmt = gimple_build_assign (var, BIT_AND_EXPR, lhs, and_mask);
3313 gsi = gsi_for_stmt (use_not_stmt);
3314 gsi_insert_before (&gsi, use_stmt, GSI_NEW_STMT);
3315 lhs = gimple_assign_lhs (use_not_stmt);
3316 gimple *g = gimple_build_assign (lhs, EQ_EXPR, var,
3317 build_zero_cst (TREE_TYPE (mask)));
3318 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
3319 gsi = gsi_for_stmt (use_not_stmt);
3320 gsi_remove (&gsi, true);
3321 return use_stmt;
3322 }
3323
3324 /* match.pd function to match atomic_bit_test_and pattern which
3325 has nop_convert:
3326 _1 = __atomic_fetch_or_4 (&v, 1, 0);
3327 _2 = (int) _1;
3328 _5 = _2 & 1;
3329 */
3330 extern bool gimple_nop_atomic_bit_test_and_p (tree, tree *,
3331 tree (*) (tree));
3332 extern bool gimple_nop_convert (tree, tree*, tree (*) (tree));
3333
3334 /* Optimize
3335 mask_2 = 1 << cnt_1;
3336 _4 = __atomic_fetch_or_* (ptr_6, mask_2, _3);
3337 _5 = _4 & mask_2;
3338 to
3339 _4 = .ATOMIC_BIT_TEST_AND_SET (ptr_6, cnt_1, 0, _3);
3340 _5 = _4;
3341 If _5 is only used in _5 != 0 or _5 == 0 comparisons, 1
3342 is passed instead of 0, and the builtin just returns a zero
3343 or 1 value instead of the actual bit.
3344 Similarly for __sync_fetch_and_or_* (without the ", _3" part
3345 in there), and/or if mask_2 is a power of 2 constant.
3346 Similarly for xor instead of or, use ATOMIC_BIT_TEST_AND_COMPLEMENT
3347 in that case. And similarly for and instead of or, except that
3348 the second argument to the builtin needs to be one's complement
3349 of the mask instead of mask. */
3350
3351 static bool
optimize_atomic_bit_test_and(gimple_stmt_iterator * gsip,enum internal_fn fn,bool has_model_arg,bool after)3352 optimize_atomic_bit_test_and (gimple_stmt_iterator *gsip,
3353 enum internal_fn fn, bool has_model_arg,
3354 bool after)
3355 {
3356 gimple *call = gsi_stmt (*gsip);
3357 tree lhs = gimple_call_lhs (call);
3358 use_operand_p use_p;
3359 gimple *use_stmt;
3360 tree mask;
3361 optab optab;
3362
3363 if (!flag_inline_atomics
3364 || optimize_debug
3365 || !gimple_call_builtin_p (call, BUILT_IN_NORMAL)
3366 || !lhs
3367 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs)
3368 || !single_imm_use (lhs, &use_p, &use_stmt)
3369 || !is_gimple_assign (use_stmt)
3370 || !gimple_vdef (call))
3371 return false;
3372
3373 switch (fn)
3374 {
3375 case IFN_ATOMIC_BIT_TEST_AND_SET:
3376 optab = atomic_bit_test_and_set_optab;
3377 break;
3378 case IFN_ATOMIC_BIT_TEST_AND_COMPLEMENT:
3379 optab = atomic_bit_test_and_complement_optab;
3380 break;
3381 case IFN_ATOMIC_BIT_TEST_AND_RESET:
3382 optab = atomic_bit_test_and_reset_optab;
3383 break;
3384 default:
3385 return false;
3386 }
3387
3388 tree bit = nullptr;
3389
3390 mask = gimple_call_arg (call, 1);
3391 tree_code rhs_code = gimple_assign_rhs_code (use_stmt);
3392 if (rhs_code != BIT_AND_EXPR)
3393 {
3394 if (rhs_code != NOP_EXPR && rhs_code != BIT_NOT_EXPR)
3395 return false;
3396
3397 tree use_lhs = gimple_assign_lhs (use_stmt);
3398 if (TREE_CODE (use_lhs) == SSA_NAME
3399 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use_lhs))
3400 return false;
3401
3402 tree use_rhs = gimple_assign_rhs1 (use_stmt);
3403 if (lhs != use_rhs)
3404 return false;
3405
3406 if (optab_handler (optab, TYPE_MODE (TREE_TYPE (lhs)))
3407 == CODE_FOR_nothing)
3408 return false;
3409
3410 gimple *g;
3411 gimple_stmt_iterator gsi;
3412 tree var;
3413 int ibit = -1;
3414
3415 if (rhs_code == BIT_NOT_EXPR)
3416 {
3417 g = convert_atomic_bit_not (fn, use_stmt, lhs, mask);
3418 if (!g)
3419 return false;
3420 use_stmt = g;
3421 ibit = 0;
3422 }
3423 else if (TREE_CODE (TREE_TYPE (use_lhs)) == BOOLEAN_TYPE)
3424 {
3425 tree and_mask;
3426 if (fn == IFN_ATOMIC_BIT_TEST_AND_RESET)
3427 {
3428 /* MASK must be ~1. */
3429 if (!operand_equal_p (build_int_cst (TREE_TYPE (lhs),
3430 ~HOST_WIDE_INT_1),
3431 mask, 0))
3432 return false;
3433
3434 /* Convert
3435 _1 = __atomic_fetch_and_* (ptr_6, ~1, _3);
3436 _4 = (_Bool) _1;
3437 to
3438 _1 = __atomic_fetch_and_* (ptr_6, ~1, _3);
3439 _5 = _1 & 1;
3440 _4 = (_Bool) _5;
3441 */
3442 and_mask = build_int_cst (TREE_TYPE (lhs), 1);
3443 }
3444 else
3445 {
3446 and_mask = build_int_cst (TREE_TYPE (lhs), 1);
3447 if (!operand_equal_p (and_mask, mask, 0))
3448 return false;
3449
3450 /* Convert
3451 _1 = __atomic_fetch_or_* (ptr_6, 1, _3);
3452 _4 = (_Bool) _1;
3453 to
3454 _1 = __atomic_fetch_or_* (ptr_6, 1, _3);
3455 _5 = _1 & 1;
3456 _4 = (_Bool) _5;
3457 */
3458 }
3459 var = make_ssa_name (TREE_TYPE (use_rhs));
3460 replace_uses_by (use_rhs, var);
3461 g = gimple_build_assign (var, BIT_AND_EXPR, use_rhs,
3462 and_mask);
3463 gsi = gsi_for_stmt (use_stmt);
3464 gsi_insert_before (&gsi, g, GSI_NEW_STMT);
3465 use_stmt = g;
3466 ibit = 0;
3467 }
3468 else if (TYPE_PRECISION (TREE_TYPE (use_lhs))
3469 <= TYPE_PRECISION (TREE_TYPE (use_rhs)))
3470 {
3471 gimple *use_nop_stmt;
3472 if (!single_imm_use (use_lhs, &use_p, &use_nop_stmt)
3473 || !is_gimple_assign (use_nop_stmt))
3474 return false;
3475 tree use_nop_lhs = gimple_assign_lhs (use_nop_stmt);
3476 rhs_code = gimple_assign_rhs_code (use_nop_stmt);
3477 if (rhs_code != BIT_AND_EXPR)
3478 {
3479 if (TREE_CODE (use_nop_lhs) == SSA_NAME
3480 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use_nop_lhs))
3481 return false;
3482 if (rhs_code == BIT_NOT_EXPR)
3483 {
3484 g = convert_atomic_bit_not (fn, use_nop_stmt, lhs,
3485 mask);
3486 if (!g)
3487 return false;
3488 /* Convert
3489 _1 = __atomic_fetch_or_4 (ptr_6, 1, _3);
3490 _2 = (int) _1;
3491 _7 = ~_2;
3492 _5 = (_Bool) _7;
3493 to
3494 _1 = __atomic_fetch_or_4 (ptr_6, ~1, _3);
3495 _8 = _1 & 1;
3496 _5 = _8 == 0;
3497 and convert
3498 _1 = __atomic_fetch_and_4 (ptr_6, ~1, _3);
3499 _2 = (int) _1;
3500 _7 = ~_2;
3501 _5 = (_Bool) _7;
3502 to
3503 _1 = __atomic_fetch_and_4 (ptr_6, 1, _3);
3504 _8 = _1 & 1;
3505 _5 = _8 == 0;
3506 */
3507 gsi = gsi_for_stmt (use_stmt);
3508 gsi_remove (&gsi, true);
3509 use_stmt = g;
3510 ibit = 0;
3511 }
3512 else
3513 {
3514 if (TREE_CODE (TREE_TYPE (use_nop_lhs)) != BOOLEAN_TYPE)
3515 return false;
3516 if (rhs_code != GE_EXPR && rhs_code != LT_EXPR)
3517 return false;
3518 tree cmp_rhs1 = gimple_assign_rhs1 (use_nop_stmt);
3519 if (use_lhs != cmp_rhs1)
3520 return false;
3521 tree cmp_rhs2 = gimple_assign_rhs2 (use_nop_stmt);
3522 if (!integer_zerop (cmp_rhs2))
3523 return false;
3524
3525 tree and_mask;
3526
3527 unsigned HOST_WIDE_INT bytes
3528 = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (use_rhs)));
3529 ibit = bytes * BITS_PER_UNIT - 1;
3530 unsigned HOST_WIDE_INT highest
3531 = HOST_WIDE_INT_1U << ibit;
3532
3533 if (fn == IFN_ATOMIC_BIT_TEST_AND_RESET)
3534 {
3535 /* Get the signed maximum of the USE_RHS type. */
3536 and_mask = build_int_cst (TREE_TYPE (use_rhs),
3537 highest - 1);
3538 if (!operand_equal_p (and_mask, mask, 0))
3539 return false;
3540
3541 /* Convert
3542 _1 = __atomic_fetch_and_4 (ptr_6, 0x7fffffff, _3);
3543 _5 = (signed int) _1;
3544 _4 = _5 < 0 or _5 >= 0;
3545 to
3546 _1 = __atomic_fetch_and_4 (ptr_6, 0x7fffffff, _3);
3547 _6 = _1 & 0x80000000;
3548 _4 = _6 != 0 or _6 == 0;
3549 */
3550 and_mask = build_int_cst (TREE_TYPE (use_rhs),
3551 highest);
3552 }
3553 else
3554 {
3555 /* Get the signed minimum of the USE_RHS type. */
3556 and_mask = build_int_cst (TREE_TYPE (use_rhs),
3557 highest);
3558 if (!operand_equal_p (and_mask, mask, 0))
3559 return false;
3560
3561 /* Convert
3562 _1 = __atomic_fetch_or_4 (ptr_6, 0x80000000, _3);
3563 _5 = (signed int) _1;
3564 _4 = _5 < 0 or _5 >= 0;
3565 to
3566 _1 = __atomic_fetch_or_4 (ptr_6, 0x80000000, _3);
3567 _6 = _1 & 0x80000000;
3568 _4 = _6 != 0 or _6 == 0;
3569 */
3570 }
3571 var = make_ssa_name (TREE_TYPE (use_rhs));
3572 gsi = gsi_for_stmt (use_stmt);
3573 gsi_remove (&gsi, true);
3574 g = gimple_build_assign (var, BIT_AND_EXPR, use_rhs,
3575 and_mask);
3576 gsi = gsi_for_stmt (use_nop_stmt);
3577 gsi_insert_before (&gsi, g, GSI_NEW_STMT);
3578 use_stmt = g;
3579 g = gimple_build_assign (use_nop_lhs,
3580 (rhs_code == GE_EXPR
3581 ? EQ_EXPR : NE_EXPR),
3582 var,
3583 build_zero_cst (TREE_TYPE (use_rhs)));
3584 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
3585 gsi = gsi_for_stmt (use_nop_stmt);
3586 gsi_remove (&gsi, true);
3587 }
3588 }
3589 else
3590 {
3591 tree match_op[3];
3592 gimple *g;
3593 if (!gimple_nop_atomic_bit_test_and_p (use_nop_lhs,
3594 &match_op[0], NULL)
3595 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (match_op[2])
3596 || !single_imm_use (match_op[2], &use_p, &g)
3597 || !is_gimple_assign (g))
3598 return false;
3599 mask = match_op[0];
3600 if (TREE_CODE (match_op[1]) == INTEGER_CST)
3601 {
3602 ibit = tree_log2 (match_op[1]);
3603 gcc_assert (ibit >= 0);
3604 }
3605 else
3606 {
3607 g = SSA_NAME_DEF_STMT (match_op[1]);
3608 gcc_assert (is_gimple_assign (g));
3609 bit = gimple_assign_rhs2 (g);
3610 }
3611 /* Convert
3612 _1 = __atomic_fetch_or_4 (ptr_6, mask, _3);
3613 _2 = (int) _1;
3614 _5 = _2 & mask;
3615 to
3616 _1 = __atomic_fetch_or_4 (ptr_6, mask, _3);
3617 _6 = _1 & mask;
3618 _5 = (int) _6;
3619 and convert
3620 _1 = ~mask_7;
3621 _2 = (unsigned int) _1;
3622 _3 = __atomic_fetch_and_4 (ptr_6, _2, 0);
3623 _4 = (int) _3;
3624 _5 = _4 & mask_7;
3625 to
3626 _1 = __atomic_fetch_and_* (ptr_6, ~mask_7, _3);
3627 _12 = _3 & mask_7;
3628 _5 = (int) _12;
3629
3630 and Convert
3631 _1 = __atomic_fetch_and_4 (ptr_6, ~mask, _3);
3632 _2 = (short int) _1;
3633 _5 = _2 & mask;
3634 to
3635 _1 = __atomic_fetch_and_4 (ptr_6, ~mask, _3);
3636 _8 = _1 & mask;
3637 _5 = (short int) _8;
3638 */
3639 gimple_seq stmts = NULL;
3640 match_op[1] = gimple_convert (&stmts,
3641 TREE_TYPE (use_rhs),
3642 match_op[1]);
3643 var = gimple_build (&stmts, BIT_AND_EXPR,
3644 TREE_TYPE (use_rhs), use_rhs, match_op[1]);
3645 gsi = gsi_for_stmt (use_stmt);
3646 gsi_remove (&gsi, true);
3647 release_defs (use_stmt);
3648 use_stmt = gimple_seq_last_stmt (stmts);
3649 gsi = gsi_for_stmt (use_nop_stmt);
3650 gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT);
3651 gimple_assign_set_rhs_with_ops (&gsi, CONVERT_EXPR, var);
3652 update_stmt (use_nop_stmt);
3653 }
3654 }
3655 else
3656 return false;
3657
3658 if (!bit)
3659 {
3660 if (ibit < 0)
3661 gcc_unreachable ();
3662 bit = build_int_cst (TREE_TYPE (lhs), ibit);
3663 }
3664 }
3665 else if (optab_handler (optab, TYPE_MODE (TREE_TYPE (lhs)))
3666 == CODE_FOR_nothing)
3667 return false;
3668
3669 tree use_lhs = gimple_assign_lhs (use_stmt);
3670 if (!use_lhs)
3671 return false;
3672
3673 if (!bit)
3674 {
3675 if (TREE_CODE (mask) == INTEGER_CST)
3676 {
3677 if (fn == IFN_ATOMIC_BIT_TEST_AND_RESET)
3678 mask = const_unop (BIT_NOT_EXPR, TREE_TYPE (mask), mask);
3679 mask = fold_convert (TREE_TYPE (lhs), mask);
3680 int ibit = tree_log2 (mask);
3681 if (ibit < 0)
3682 return false;
3683 bit = build_int_cst (TREE_TYPE (lhs), ibit);
3684 }
3685 else if (TREE_CODE (mask) == SSA_NAME)
3686 {
3687 gimple *g = SSA_NAME_DEF_STMT (mask);
3688 tree match_op;
3689 if (gimple_nop_convert (mask, &match_op, NULL))
3690 {
3691 mask = match_op;
3692 if (TREE_CODE (mask) != SSA_NAME)
3693 return false;
3694 g = SSA_NAME_DEF_STMT (mask);
3695 }
3696 if (!is_gimple_assign (g))
3697 return false;
3698
3699 if (fn == IFN_ATOMIC_BIT_TEST_AND_RESET)
3700 {
3701 if (gimple_assign_rhs_code (g) != BIT_NOT_EXPR)
3702 return false;
3703 mask = gimple_assign_rhs1 (g);
3704 if (TREE_CODE (mask) != SSA_NAME)
3705 return false;
3706 g = SSA_NAME_DEF_STMT (mask);
3707 }
3708
3709 if (!is_gimple_assign (g)
3710 || gimple_assign_rhs_code (g) != LSHIFT_EXPR
3711 || !integer_onep (gimple_assign_rhs1 (g)))
3712 return false;
3713 bit = gimple_assign_rhs2 (g);
3714 }
3715 else
3716 return false;
3717
3718 tree cmp_mask;
3719 if (gimple_assign_rhs1 (use_stmt) == lhs)
3720 cmp_mask = gimple_assign_rhs2 (use_stmt);
3721 else
3722 cmp_mask = gimple_assign_rhs1 (use_stmt);
3723
3724 tree match_op;
3725 if (gimple_nop_convert (cmp_mask, &match_op, NULL))
3726 cmp_mask = match_op;
3727
3728 if (!operand_equal_p (cmp_mask, mask, 0))
3729 return false;
3730 }
3731
3732 bool use_bool = true;
3733 bool has_debug_uses = false;
3734 imm_use_iterator iter;
3735 gimple *g;
3736
3737 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use_lhs))
3738 use_bool = false;
3739 FOR_EACH_IMM_USE_STMT (g, iter, use_lhs)
3740 {
3741 enum tree_code code = ERROR_MARK;
3742 tree op0 = NULL_TREE, op1 = NULL_TREE;
3743 if (is_gimple_debug (g))
3744 {
3745 has_debug_uses = true;
3746 continue;
3747 }
3748 else if (is_gimple_assign (g))
3749 switch (gimple_assign_rhs_code (g))
3750 {
3751 case COND_EXPR:
3752 op1 = gimple_assign_rhs1 (g);
3753 code = TREE_CODE (op1);
3754 if (TREE_CODE_CLASS (code) != tcc_comparison)
3755 break;
3756 op0 = TREE_OPERAND (op1, 0);
3757 op1 = TREE_OPERAND (op1, 1);
3758 break;
3759 case EQ_EXPR:
3760 case NE_EXPR:
3761 code = gimple_assign_rhs_code (g);
3762 op0 = gimple_assign_rhs1 (g);
3763 op1 = gimple_assign_rhs2 (g);
3764 break;
3765 default:
3766 break;
3767 }
3768 else if (gimple_code (g) == GIMPLE_COND)
3769 {
3770 code = gimple_cond_code (g);
3771 op0 = gimple_cond_lhs (g);
3772 op1 = gimple_cond_rhs (g);
3773 }
3774
3775 if ((code == EQ_EXPR || code == NE_EXPR)
3776 && op0 == use_lhs
3777 && integer_zerop (op1))
3778 {
3779 use_operand_p use_p;
3780 int n = 0;
3781 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
3782 n++;
3783 if (n == 1)
3784 continue;
3785 }
3786
3787 use_bool = false;
3788 break;
3789 }
3790
3791 tree new_lhs = make_ssa_name (TREE_TYPE (lhs));
3792 tree flag = build_int_cst (TREE_TYPE (lhs), use_bool);
3793 if (has_model_arg)
3794 g = gimple_build_call_internal (fn, 5, gimple_call_arg (call, 0),
3795 bit, flag, gimple_call_arg (call, 2),
3796 gimple_call_fn (call));
3797 else
3798 g = gimple_build_call_internal (fn, 4, gimple_call_arg (call, 0),
3799 bit, flag, gimple_call_fn (call));
3800 gimple_call_set_lhs (g, new_lhs);
3801 gimple_set_location (g, gimple_location (call));
3802 gimple_move_vops (g, call);
3803 bool throws = stmt_can_throw_internal (cfun, call);
3804 gimple_call_set_nothrow (as_a <gcall *> (g),
3805 gimple_call_nothrow_p (as_a <gcall *> (call)));
3806 gimple_stmt_iterator gsi = *gsip;
3807 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
3808 edge e = NULL;
3809 if (throws)
3810 {
3811 maybe_clean_or_replace_eh_stmt (call, g);
3812 if (after || (use_bool && has_debug_uses))
3813 e = find_fallthru_edge (gsi_bb (gsi)->succs);
3814 }
3815 if (after)
3816 {
3817 /* The internal function returns the value of the specified bit
3818 before the atomic operation. If we are interested in the value
3819 of the specified bit after the atomic operation (makes only sense
3820 for xor, otherwise the bit content is compile time known),
3821 we need to invert the bit. */
3822 tree mask_convert = mask;
3823 gimple_seq stmts = NULL;
3824 if (!use_bool)
3825 mask_convert = gimple_convert (&stmts, TREE_TYPE (lhs), mask);
3826 new_lhs = gimple_build (&stmts, BIT_XOR_EXPR, TREE_TYPE (lhs), new_lhs,
3827 use_bool ? build_int_cst (TREE_TYPE (lhs), 1)
3828 : mask_convert);
3829 if (throws)
3830 {
3831 gsi_insert_seq_on_edge_immediate (e, stmts);
3832 gsi = gsi_for_stmt (gimple_seq_last (stmts));
3833 }
3834 else
3835 gsi_insert_seq_after (&gsi, stmts, GSI_NEW_STMT);
3836 }
3837 if (use_bool && has_debug_uses)
3838 {
3839 tree temp = NULL_TREE;
3840 if (!throws || after || single_pred_p (e->dest))
3841 {
3842 temp = build_debug_expr_decl (TREE_TYPE (lhs));
3843 tree t = build2 (LSHIFT_EXPR, TREE_TYPE (lhs), new_lhs, bit);
3844 g = gimple_build_debug_bind (temp, t, g);
3845 if (throws && !after)
3846 {
3847 gsi = gsi_after_labels (e->dest);
3848 gsi_insert_before (&gsi, g, GSI_SAME_STMT);
3849 }
3850 else
3851 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
3852 }
3853 FOR_EACH_IMM_USE_STMT (g, iter, use_lhs)
3854 if (is_gimple_debug (g))
3855 {
3856 use_operand_p use_p;
3857 if (temp == NULL_TREE)
3858 gimple_debug_bind_reset_value (g);
3859 else
3860 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
3861 SET_USE (use_p, temp);
3862 update_stmt (g);
3863 }
3864 }
3865 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_lhs)
3866 = SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use_lhs);
3867 replace_uses_by (use_lhs, new_lhs);
3868 gsi = gsi_for_stmt (use_stmt);
3869 gsi_remove (&gsi, true);
3870 release_defs (use_stmt);
3871 gsi_remove (gsip, true);
3872 release_ssa_name (lhs);
3873 return true;
3874 }
3875
3876 /* Optimize
3877 _4 = __atomic_add_fetch_* (ptr_6, arg_2, _3);
3878 _5 = _4 == 0;
3879 to
3880 _4 = .ATOMIC_ADD_FETCH_CMP_0 (EQ_EXPR, ptr_6, arg_2, _3);
3881 _5 = _4;
3882 Similarly for __sync_add_and_fetch_* (without the ", _3" part
3883 in there). */
3884
3885 static bool
optimize_atomic_op_fetch_cmp_0(gimple_stmt_iterator * gsip,enum internal_fn fn,bool has_model_arg)3886 optimize_atomic_op_fetch_cmp_0 (gimple_stmt_iterator *gsip,
3887 enum internal_fn fn, bool has_model_arg)
3888 {
3889 gimple *call = gsi_stmt (*gsip);
3890 tree lhs = gimple_call_lhs (call);
3891 use_operand_p use_p;
3892 gimple *use_stmt;
3893
3894 if (!flag_inline_atomics
3895 || optimize_debug
3896 || !gimple_call_builtin_p (call, BUILT_IN_NORMAL)
3897 || !lhs
3898 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs)
3899 || !single_imm_use (lhs, &use_p, &use_stmt)
3900 || !gimple_vdef (call))
3901 return false;
3902
3903 optab optab;
3904 switch (fn)
3905 {
3906 case IFN_ATOMIC_ADD_FETCH_CMP_0:
3907 optab = atomic_add_fetch_cmp_0_optab;
3908 break;
3909 case IFN_ATOMIC_SUB_FETCH_CMP_0:
3910 optab = atomic_sub_fetch_cmp_0_optab;
3911 break;
3912 case IFN_ATOMIC_AND_FETCH_CMP_0:
3913 optab = atomic_and_fetch_cmp_0_optab;
3914 break;
3915 case IFN_ATOMIC_OR_FETCH_CMP_0:
3916 optab = atomic_or_fetch_cmp_0_optab;
3917 break;
3918 case IFN_ATOMIC_XOR_FETCH_CMP_0:
3919 optab = atomic_xor_fetch_cmp_0_optab;
3920 break;
3921 default:
3922 return false;
3923 }
3924
3925 if (optab_handler (optab, TYPE_MODE (TREE_TYPE (lhs)))
3926 == CODE_FOR_nothing)
3927 return false;
3928
3929 tree use_lhs = lhs;
3930 if (gimple_assign_cast_p (use_stmt))
3931 {
3932 use_lhs = gimple_assign_lhs (use_stmt);
3933 if (!tree_nop_conversion_p (TREE_TYPE (use_lhs), TREE_TYPE (lhs))
3934 || (!INTEGRAL_TYPE_P (TREE_TYPE (use_lhs))
3935 && !POINTER_TYPE_P (TREE_TYPE (use_lhs)))
3936 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use_lhs)
3937 || !single_imm_use (use_lhs, &use_p, &use_stmt))
3938 return false;
3939 }
3940 enum tree_code code = ERROR_MARK;
3941 tree op0 = NULL_TREE, op1 = NULL_TREE;
3942 if (is_gimple_assign (use_stmt))
3943 switch (gimple_assign_rhs_code (use_stmt))
3944 {
3945 case COND_EXPR:
3946 op1 = gimple_assign_rhs1 (use_stmt);
3947 code = TREE_CODE (op1);
3948 if (TREE_CODE_CLASS (code) == tcc_comparison)
3949 {
3950 op0 = TREE_OPERAND (op1, 0);
3951 op1 = TREE_OPERAND (op1, 1);
3952 }
3953 break;
3954 default:
3955 code = gimple_assign_rhs_code (use_stmt);
3956 if (TREE_CODE_CLASS (code) == tcc_comparison)
3957 {
3958 op0 = gimple_assign_rhs1 (use_stmt);
3959 op1 = gimple_assign_rhs2 (use_stmt);
3960 }
3961 break;
3962 }
3963 else if (gimple_code (use_stmt) == GIMPLE_COND)
3964 {
3965 code = gimple_cond_code (use_stmt);
3966 op0 = gimple_cond_lhs (use_stmt);
3967 op1 = gimple_cond_rhs (use_stmt);
3968 }
3969
3970 switch (code)
3971 {
3972 case LT_EXPR:
3973 case LE_EXPR:
3974 case GT_EXPR:
3975 case GE_EXPR:
3976 if (!INTEGRAL_TYPE_P (TREE_TYPE (use_lhs))
3977 || TREE_CODE (TREE_TYPE (use_lhs)) == BOOLEAN_TYPE
3978 || TYPE_UNSIGNED (TREE_TYPE (use_lhs)))
3979 return false;
3980 /* FALLTHRU */
3981 case EQ_EXPR:
3982 case NE_EXPR:
3983 if (op0 == use_lhs && integer_zerop (op1))
3984 break;
3985 return false;
3986 default:
3987 return false;
3988 }
3989
3990 int encoded;
3991 switch (code)
3992 {
3993 /* Use special encoding of the operation. We want to also
3994 encode the mode in the first argument and for neither EQ_EXPR
3995 etc. nor EQ etc. we can rely it will fit into QImode. */
3996 case EQ_EXPR: encoded = ATOMIC_OP_FETCH_CMP_0_EQ; break;
3997 case NE_EXPR: encoded = ATOMIC_OP_FETCH_CMP_0_NE; break;
3998 case LT_EXPR: encoded = ATOMIC_OP_FETCH_CMP_0_LT; break;
3999 case LE_EXPR: encoded = ATOMIC_OP_FETCH_CMP_0_LE; break;
4000 case GT_EXPR: encoded = ATOMIC_OP_FETCH_CMP_0_GT; break;
4001 case GE_EXPR: encoded = ATOMIC_OP_FETCH_CMP_0_GE; break;
4002 default: gcc_unreachable ();
4003 }
4004
4005 tree new_lhs = make_ssa_name (boolean_type_node);
4006 gimple *g;
4007 tree flag = build_int_cst (TREE_TYPE (lhs), encoded);
4008 if (has_model_arg)
4009 g = gimple_build_call_internal (fn, 5, flag,
4010 gimple_call_arg (call, 0),
4011 gimple_call_arg (call, 1),
4012 gimple_call_arg (call, 2),
4013 gimple_call_fn (call));
4014 else
4015 g = gimple_build_call_internal (fn, 4, flag,
4016 gimple_call_arg (call, 0),
4017 gimple_call_arg (call, 1),
4018 gimple_call_fn (call));
4019 gimple_call_set_lhs (g, new_lhs);
4020 gimple_set_location (g, gimple_location (call));
4021 gimple_move_vops (g, call);
4022 bool throws = stmt_can_throw_internal (cfun, call);
4023 gimple_call_set_nothrow (as_a <gcall *> (g),
4024 gimple_call_nothrow_p (as_a <gcall *> (call)));
4025 gimple_stmt_iterator gsi = *gsip;
4026 gsi_insert_after (&gsi, g, GSI_SAME_STMT);
4027 if (throws)
4028 maybe_clean_or_replace_eh_stmt (call, g);
4029 if (is_gimple_assign (use_stmt))
4030 switch (gimple_assign_rhs_code (use_stmt))
4031 {
4032 case COND_EXPR:
4033 gimple_assign_set_rhs1 (use_stmt, new_lhs);
4034 break;
4035 default:
4036 gsi = gsi_for_stmt (use_stmt);
4037 if (tree ulhs = gimple_assign_lhs (use_stmt))
4038 if (useless_type_conversion_p (TREE_TYPE (ulhs),
4039 boolean_type_node))
4040 {
4041 gimple_assign_set_rhs_with_ops (&gsi, SSA_NAME, new_lhs);
4042 break;
4043 }
4044 gimple_assign_set_rhs_with_ops (&gsi, NOP_EXPR, new_lhs);
4045 break;
4046 }
4047 else if (gimple_code (use_stmt) == GIMPLE_COND)
4048 {
4049 gcond *use_cond = as_a <gcond *> (use_stmt);
4050 gimple_cond_set_code (use_cond, NE_EXPR);
4051 gimple_cond_set_lhs (use_cond, new_lhs);
4052 gimple_cond_set_rhs (use_cond, boolean_false_node);
4053 }
4054
4055 update_stmt (use_stmt);
4056 if (use_lhs != lhs)
4057 {
4058 gsi = gsi_for_stmt (SSA_NAME_DEF_STMT (use_lhs));
4059 gsi_remove (&gsi, true);
4060 release_ssa_name (use_lhs);
4061 }
4062 gsi_remove (gsip, true);
4063 release_ssa_name (lhs);
4064 return true;
4065 }
4066
4067 /* Optimize
4068 a = {};
4069 b = a;
4070 into
4071 a = {};
4072 b = {};
4073 Similarly for memset (&a, ..., sizeof (a)); instead of a = {};
4074 and/or memcpy (&b, &a, sizeof (a)); instead of b = a; */
4075
4076 static void
optimize_memcpy(gimple_stmt_iterator * gsip,tree dest,tree src,tree len)4077 optimize_memcpy (gimple_stmt_iterator *gsip, tree dest, tree src, tree len)
4078 {
4079 gimple *stmt = gsi_stmt (*gsip);
4080 if (gimple_has_volatile_ops (stmt))
4081 return;
4082
4083 tree vuse = gimple_vuse (stmt);
4084 if (vuse == NULL)
4085 return;
4086
4087 gimple *defstmt = SSA_NAME_DEF_STMT (vuse);
4088 tree src2 = NULL_TREE, len2 = NULL_TREE;
4089 poly_int64 offset, offset2;
4090 tree val = integer_zero_node;
4091 if (gimple_store_p (defstmt)
4092 && gimple_assign_single_p (defstmt)
4093 && TREE_CODE (gimple_assign_rhs1 (defstmt)) == CONSTRUCTOR
4094 && !gimple_clobber_p (defstmt))
4095 src2 = gimple_assign_lhs (defstmt);
4096 else if (gimple_call_builtin_p (defstmt, BUILT_IN_MEMSET)
4097 && TREE_CODE (gimple_call_arg (defstmt, 0)) == ADDR_EXPR
4098 && TREE_CODE (gimple_call_arg (defstmt, 1)) == INTEGER_CST)
4099 {
4100 src2 = TREE_OPERAND (gimple_call_arg (defstmt, 0), 0);
4101 len2 = gimple_call_arg (defstmt, 2);
4102 val = gimple_call_arg (defstmt, 1);
4103 /* For non-0 val, we'd have to transform stmt from assignment
4104 into memset (only if dest is addressable). */
4105 if (!integer_zerop (val) && is_gimple_assign (stmt))
4106 src2 = NULL_TREE;
4107 }
4108
4109 if (src2 == NULL_TREE)
4110 return;
4111
4112 if (len == NULL_TREE)
4113 len = (TREE_CODE (src) == COMPONENT_REF
4114 ? DECL_SIZE_UNIT (TREE_OPERAND (src, 1))
4115 : TYPE_SIZE_UNIT (TREE_TYPE (src)));
4116 if (len2 == NULL_TREE)
4117 len2 = (TREE_CODE (src2) == COMPONENT_REF
4118 ? DECL_SIZE_UNIT (TREE_OPERAND (src2, 1))
4119 : TYPE_SIZE_UNIT (TREE_TYPE (src2)));
4120 if (len == NULL_TREE
4121 || !poly_int_tree_p (len)
4122 || len2 == NULL_TREE
4123 || !poly_int_tree_p (len2))
4124 return;
4125
4126 src = get_addr_base_and_unit_offset (src, &offset);
4127 src2 = get_addr_base_and_unit_offset (src2, &offset2);
4128 if (src == NULL_TREE
4129 || src2 == NULL_TREE
4130 || maybe_lt (offset, offset2))
4131 return;
4132
4133 if (!operand_equal_p (src, src2, 0))
4134 return;
4135
4136 /* [ src + offset2, src + offset2 + len2 - 1 ] is set to val.
4137 Make sure that
4138 [ src + offset, src + offset + len - 1 ] is a subset of that. */
4139 if (maybe_gt (wi::to_poly_offset (len) + (offset - offset2),
4140 wi::to_poly_offset (len2)))
4141 return;
4142
4143 if (dump_file && (dump_flags & TDF_DETAILS))
4144 {
4145 fprintf (dump_file, "Simplified\n ");
4146 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
4147 fprintf (dump_file, "after previous\n ");
4148 print_gimple_stmt (dump_file, defstmt, 0, dump_flags);
4149 }
4150
4151 /* For simplicity, don't change the kind of the stmt,
4152 turn dest = src; into dest = {}; and memcpy (&dest, &src, len);
4153 into memset (&dest, val, len);
4154 In theory we could change dest = src into memset if dest
4155 is addressable (maybe beneficial if val is not 0), or
4156 memcpy (&dest, &src, len) into dest = {} if len is the size
4157 of dest, dest isn't volatile. */
4158 if (is_gimple_assign (stmt))
4159 {
4160 tree ctor = build_constructor (TREE_TYPE (dest), NULL);
4161 gimple_assign_set_rhs_from_tree (gsip, ctor);
4162 update_stmt (stmt);
4163 }
4164 else /* If stmt is memcpy, transform it into memset. */
4165 {
4166 gcall *call = as_a <gcall *> (stmt);
4167 tree fndecl = builtin_decl_implicit (BUILT_IN_MEMSET);
4168 gimple_call_set_fndecl (call, fndecl);
4169 gimple_call_set_fntype (call, TREE_TYPE (fndecl));
4170 gimple_call_set_arg (call, 1, val);
4171 update_stmt (stmt);
4172 }
4173
4174 if (dump_file && (dump_flags & TDF_DETAILS))
4175 {
4176 fprintf (dump_file, "into\n ");
4177 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
4178 }
4179 }
4180
4181 /* A simple pass that attempts to fold all builtin functions. This pass
4182 is run after we've propagated as many constants as we can. */
4183
4184 namespace {
4185
4186 const pass_data pass_data_fold_builtins =
4187 {
4188 GIMPLE_PASS, /* type */
4189 "fab", /* name */
4190 OPTGROUP_NONE, /* optinfo_flags */
4191 TV_NONE, /* tv_id */
4192 ( PROP_cfg | PROP_ssa ), /* properties_required */
4193 0, /* properties_provided */
4194 0, /* properties_destroyed */
4195 0, /* todo_flags_start */
4196 TODO_update_ssa, /* todo_flags_finish */
4197 };
4198
4199 class pass_fold_builtins : public gimple_opt_pass
4200 {
4201 public:
pass_fold_builtins(gcc::context * ctxt)4202 pass_fold_builtins (gcc::context *ctxt)
4203 : gimple_opt_pass (pass_data_fold_builtins, ctxt)
4204 {}
4205
4206 /* opt_pass methods: */
clone()4207 opt_pass * clone () { return new pass_fold_builtins (m_ctxt); }
4208 virtual unsigned int execute (function *);
4209
4210 }; // class pass_fold_builtins
4211
4212 unsigned int
execute(function * fun)4213 pass_fold_builtins::execute (function *fun)
4214 {
4215 bool cfg_changed = false;
4216 basic_block bb;
4217 unsigned int todoflags = 0;
4218
4219 FOR_EACH_BB_FN (bb, fun)
4220 {
4221 gimple_stmt_iterator i;
4222 for (i = gsi_start_bb (bb); !gsi_end_p (i); )
4223 {
4224 gimple *stmt, *old_stmt;
4225 tree callee;
4226 enum built_in_function fcode;
4227
4228 stmt = gsi_stmt (i);
4229
4230 if (gimple_code (stmt) != GIMPLE_CALL)
4231 {
4232 /* Remove all *ssaname_N ={v} {CLOBBER}; stmts,
4233 after the last GIMPLE DSE they aren't needed and might
4234 unnecessarily keep the SSA_NAMEs live. */
4235 if (gimple_clobber_p (stmt))
4236 {
4237 tree lhs = gimple_assign_lhs (stmt);
4238 if (TREE_CODE (lhs) == MEM_REF
4239 && TREE_CODE (TREE_OPERAND (lhs, 0)) == SSA_NAME)
4240 {
4241 unlink_stmt_vdef (stmt);
4242 gsi_remove (&i, true);
4243 release_defs (stmt);
4244 continue;
4245 }
4246 }
4247 else if (gimple_assign_load_p (stmt) && gimple_store_p (stmt))
4248 optimize_memcpy (&i, gimple_assign_lhs (stmt),
4249 gimple_assign_rhs1 (stmt), NULL_TREE);
4250 gsi_next (&i);
4251 continue;
4252 }
4253
4254 callee = gimple_call_fndecl (stmt);
4255 if (!callee || !fndecl_built_in_p (callee, BUILT_IN_NORMAL))
4256 {
4257 gsi_next (&i);
4258 continue;
4259 }
4260
4261 fcode = DECL_FUNCTION_CODE (callee);
4262 if (fold_stmt (&i))
4263 ;
4264 else
4265 {
4266 tree result = NULL_TREE;
4267 switch (DECL_FUNCTION_CODE (callee))
4268 {
4269 case BUILT_IN_CONSTANT_P:
4270 /* Resolve __builtin_constant_p. If it hasn't been
4271 folded to integer_one_node by now, it's fairly
4272 certain that the value simply isn't constant. */
4273 result = integer_zero_node;
4274 break;
4275
4276 case BUILT_IN_ASSUME_ALIGNED:
4277 /* Remove __builtin_assume_aligned. */
4278 result = gimple_call_arg (stmt, 0);
4279 break;
4280
4281 case BUILT_IN_STACK_RESTORE:
4282 result = optimize_stack_restore (i);
4283 if (result)
4284 break;
4285 gsi_next (&i);
4286 continue;
4287
4288 case BUILT_IN_UNREACHABLE:
4289 if (optimize_unreachable (i))
4290 cfg_changed = true;
4291 break;
4292
4293 case BUILT_IN_ATOMIC_ADD_FETCH_1:
4294 case BUILT_IN_ATOMIC_ADD_FETCH_2:
4295 case BUILT_IN_ATOMIC_ADD_FETCH_4:
4296 case BUILT_IN_ATOMIC_ADD_FETCH_8:
4297 case BUILT_IN_ATOMIC_ADD_FETCH_16:
4298 optimize_atomic_op_fetch_cmp_0 (&i,
4299 IFN_ATOMIC_ADD_FETCH_CMP_0,
4300 true);
4301 break;
4302 case BUILT_IN_SYNC_ADD_AND_FETCH_1:
4303 case BUILT_IN_SYNC_ADD_AND_FETCH_2:
4304 case BUILT_IN_SYNC_ADD_AND_FETCH_4:
4305 case BUILT_IN_SYNC_ADD_AND_FETCH_8:
4306 case BUILT_IN_SYNC_ADD_AND_FETCH_16:
4307 optimize_atomic_op_fetch_cmp_0 (&i,
4308 IFN_ATOMIC_ADD_FETCH_CMP_0,
4309 false);
4310 break;
4311
4312 case BUILT_IN_ATOMIC_SUB_FETCH_1:
4313 case BUILT_IN_ATOMIC_SUB_FETCH_2:
4314 case BUILT_IN_ATOMIC_SUB_FETCH_4:
4315 case BUILT_IN_ATOMIC_SUB_FETCH_8:
4316 case BUILT_IN_ATOMIC_SUB_FETCH_16:
4317 optimize_atomic_op_fetch_cmp_0 (&i,
4318 IFN_ATOMIC_SUB_FETCH_CMP_0,
4319 true);
4320 break;
4321 case BUILT_IN_SYNC_SUB_AND_FETCH_1:
4322 case BUILT_IN_SYNC_SUB_AND_FETCH_2:
4323 case BUILT_IN_SYNC_SUB_AND_FETCH_4:
4324 case BUILT_IN_SYNC_SUB_AND_FETCH_8:
4325 case BUILT_IN_SYNC_SUB_AND_FETCH_16:
4326 optimize_atomic_op_fetch_cmp_0 (&i,
4327 IFN_ATOMIC_SUB_FETCH_CMP_0,
4328 false);
4329 break;
4330
4331 case BUILT_IN_ATOMIC_FETCH_OR_1:
4332 case BUILT_IN_ATOMIC_FETCH_OR_2:
4333 case BUILT_IN_ATOMIC_FETCH_OR_4:
4334 case BUILT_IN_ATOMIC_FETCH_OR_8:
4335 case BUILT_IN_ATOMIC_FETCH_OR_16:
4336 optimize_atomic_bit_test_and (&i,
4337 IFN_ATOMIC_BIT_TEST_AND_SET,
4338 true, false);
4339 break;
4340 case BUILT_IN_SYNC_FETCH_AND_OR_1:
4341 case BUILT_IN_SYNC_FETCH_AND_OR_2:
4342 case BUILT_IN_SYNC_FETCH_AND_OR_4:
4343 case BUILT_IN_SYNC_FETCH_AND_OR_8:
4344 case BUILT_IN_SYNC_FETCH_AND_OR_16:
4345 optimize_atomic_bit_test_and (&i,
4346 IFN_ATOMIC_BIT_TEST_AND_SET,
4347 false, false);
4348 break;
4349
4350 case BUILT_IN_ATOMIC_FETCH_XOR_1:
4351 case BUILT_IN_ATOMIC_FETCH_XOR_2:
4352 case BUILT_IN_ATOMIC_FETCH_XOR_4:
4353 case BUILT_IN_ATOMIC_FETCH_XOR_8:
4354 case BUILT_IN_ATOMIC_FETCH_XOR_16:
4355 optimize_atomic_bit_test_and
4356 (&i, IFN_ATOMIC_BIT_TEST_AND_COMPLEMENT, true, false);
4357 break;
4358 case BUILT_IN_SYNC_FETCH_AND_XOR_1:
4359 case BUILT_IN_SYNC_FETCH_AND_XOR_2:
4360 case BUILT_IN_SYNC_FETCH_AND_XOR_4:
4361 case BUILT_IN_SYNC_FETCH_AND_XOR_8:
4362 case BUILT_IN_SYNC_FETCH_AND_XOR_16:
4363 optimize_atomic_bit_test_and
4364 (&i, IFN_ATOMIC_BIT_TEST_AND_COMPLEMENT, false, false);
4365 break;
4366
4367 case BUILT_IN_ATOMIC_XOR_FETCH_1:
4368 case BUILT_IN_ATOMIC_XOR_FETCH_2:
4369 case BUILT_IN_ATOMIC_XOR_FETCH_4:
4370 case BUILT_IN_ATOMIC_XOR_FETCH_8:
4371 case BUILT_IN_ATOMIC_XOR_FETCH_16:
4372 if (optimize_atomic_bit_test_and
4373 (&i, IFN_ATOMIC_BIT_TEST_AND_COMPLEMENT, true, true))
4374 break;
4375 optimize_atomic_op_fetch_cmp_0 (&i,
4376 IFN_ATOMIC_XOR_FETCH_CMP_0,
4377 true);
4378 break;
4379 case BUILT_IN_SYNC_XOR_AND_FETCH_1:
4380 case BUILT_IN_SYNC_XOR_AND_FETCH_2:
4381 case BUILT_IN_SYNC_XOR_AND_FETCH_4:
4382 case BUILT_IN_SYNC_XOR_AND_FETCH_8:
4383 case BUILT_IN_SYNC_XOR_AND_FETCH_16:
4384 if (optimize_atomic_bit_test_and
4385 (&i, IFN_ATOMIC_BIT_TEST_AND_COMPLEMENT, false, true))
4386 break;
4387 optimize_atomic_op_fetch_cmp_0 (&i,
4388 IFN_ATOMIC_XOR_FETCH_CMP_0,
4389 false);
4390 break;
4391
4392 case BUILT_IN_ATOMIC_FETCH_AND_1:
4393 case BUILT_IN_ATOMIC_FETCH_AND_2:
4394 case BUILT_IN_ATOMIC_FETCH_AND_4:
4395 case BUILT_IN_ATOMIC_FETCH_AND_8:
4396 case BUILT_IN_ATOMIC_FETCH_AND_16:
4397 optimize_atomic_bit_test_and (&i,
4398 IFN_ATOMIC_BIT_TEST_AND_RESET,
4399 true, false);
4400 break;
4401 case BUILT_IN_SYNC_FETCH_AND_AND_1:
4402 case BUILT_IN_SYNC_FETCH_AND_AND_2:
4403 case BUILT_IN_SYNC_FETCH_AND_AND_4:
4404 case BUILT_IN_SYNC_FETCH_AND_AND_8:
4405 case BUILT_IN_SYNC_FETCH_AND_AND_16:
4406 optimize_atomic_bit_test_and (&i,
4407 IFN_ATOMIC_BIT_TEST_AND_RESET,
4408 false, false);
4409 break;
4410
4411 case BUILT_IN_ATOMIC_AND_FETCH_1:
4412 case BUILT_IN_ATOMIC_AND_FETCH_2:
4413 case BUILT_IN_ATOMIC_AND_FETCH_4:
4414 case BUILT_IN_ATOMIC_AND_FETCH_8:
4415 case BUILT_IN_ATOMIC_AND_FETCH_16:
4416 optimize_atomic_op_fetch_cmp_0 (&i,
4417 IFN_ATOMIC_AND_FETCH_CMP_0,
4418 true);
4419 break;
4420 case BUILT_IN_SYNC_AND_AND_FETCH_1:
4421 case BUILT_IN_SYNC_AND_AND_FETCH_2:
4422 case BUILT_IN_SYNC_AND_AND_FETCH_4:
4423 case BUILT_IN_SYNC_AND_AND_FETCH_8:
4424 case BUILT_IN_SYNC_AND_AND_FETCH_16:
4425 optimize_atomic_op_fetch_cmp_0 (&i,
4426 IFN_ATOMIC_AND_FETCH_CMP_0,
4427 false);
4428 break;
4429
4430 case BUILT_IN_ATOMIC_OR_FETCH_1:
4431 case BUILT_IN_ATOMIC_OR_FETCH_2:
4432 case BUILT_IN_ATOMIC_OR_FETCH_4:
4433 case BUILT_IN_ATOMIC_OR_FETCH_8:
4434 case BUILT_IN_ATOMIC_OR_FETCH_16:
4435 optimize_atomic_op_fetch_cmp_0 (&i,
4436 IFN_ATOMIC_OR_FETCH_CMP_0,
4437 true);
4438 break;
4439 case BUILT_IN_SYNC_OR_AND_FETCH_1:
4440 case BUILT_IN_SYNC_OR_AND_FETCH_2:
4441 case BUILT_IN_SYNC_OR_AND_FETCH_4:
4442 case BUILT_IN_SYNC_OR_AND_FETCH_8:
4443 case BUILT_IN_SYNC_OR_AND_FETCH_16:
4444 optimize_atomic_op_fetch_cmp_0 (&i,
4445 IFN_ATOMIC_OR_FETCH_CMP_0,
4446 false);
4447 break;
4448
4449 case BUILT_IN_MEMCPY:
4450 if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL)
4451 && TREE_CODE (gimple_call_arg (stmt, 0)) == ADDR_EXPR
4452 && TREE_CODE (gimple_call_arg (stmt, 1)) == ADDR_EXPR
4453 && TREE_CODE (gimple_call_arg (stmt, 2)) == INTEGER_CST)
4454 {
4455 tree dest = TREE_OPERAND (gimple_call_arg (stmt, 0), 0);
4456 tree src = TREE_OPERAND (gimple_call_arg (stmt, 1), 0);
4457 tree len = gimple_call_arg (stmt, 2);
4458 optimize_memcpy (&i, dest, src, len);
4459 }
4460 break;
4461
4462 case BUILT_IN_VA_START:
4463 case BUILT_IN_VA_END:
4464 case BUILT_IN_VA_COPY:
4465 /* These shouldn't be folded before pass_stdarg. */
4466 result = optimize_stdarg_builtin (stmt);
4467 break;
4468
4469 default:;
4470 }
4471
4472 if (!result)
4473 {
4474 gsi_next (&i);
4475 continue;
4476 }
4477
4478 gimplify_and_update_call_from_tree (&i, result);
4479 }
4480
4481 todoflags |= TODO_update_address_taken;
4482
4483 if (dump_file && (dump_flags & TDF_DETAILS))
4484 {
4485 fprintf (dump_file, "Simplified\n ");
4486 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
4487 }
4488
4489 old_stmt = stmt;
4490 stmt = gsi_stmt (i);
4491 update_stmt (stmt);
4492
4493 if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt)
4494 && gimple_purge_dead_eh_edges (bb))
4495 cfg_changed = true;
4496
4497 if (dump_file && (dump_flags & TDF_DETAILS))
4498 {
4499 fprintf (dump_file, "to\n ");
4500 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
4501 fprintf (dump_file, "\n");
4502 }
4503
4504 /* Retry the same statement if it changed into another
4505 builtin, there might be new opportunities now. */
4506 if (gimple_code (stmt) != GIMPLE_CALL)
4507 {
4508 gsi_next (&i);
4509 continue;
4510 }
4511 callee = gimple_call_fndecl (stmt);
4512 if (!callee
4513 || !fndecl_built_in_p (callee, fcode))
4514 gsi_next (&i);
4515 }
4516 }
4517
4518 /* Delete unreachable blocks. */
4519 if (cfg_changed)
4520 todoflags |= TODO_cleanup_cfg;
4521
4522 return todoflags;
4523 }
4524
4525 } // anon namespace
4526
4527 gimple_opt_pass *
make_pass_fold_builtins(gcc::context * ctxt)4528 make_pass_fold_builtins (gcc::context *ctxt)
4529 {
4530 return new pass_fold_builtins (ctxt);
4531 }
4532
4533 /* A simple pass that emits some warnings post IPA. */
4534
4535 namespace {
4536
4537 const pass_data pass_data_post_ipa_warn =
4538 {
4539 GIMPLE_PASS, /* type */
4540 "post_ipa_warn", /* name */
4541 OPTGROUP_NONE, /* optinfo_flags */
4542 TV_NONE, /* tv_id */
4543 ( PROP_cfg | PROP_ssa ), /* properties_required */
4544 0, /* properties_provided */
4545 0, /* properties_destroyed */
4546 0, /* todo_flags_start */
4547 0, /* todo_flags_finish */
4548 };
4549
4550 class pass_post_ipa_warn : public gimple_opt_pass
4551 {
4552 public:
pass_post_ipa_warn(gcc::context * ctxt)4553 pass_post_ipa_warn (gcc::context *ctxt)
4554 : gimple_opt_pass (pass_data_post_ipa_warn, ctxt)
4555 {}
4556
4557 /* opt_pass methods: */
clone()4558 opt_pass * clone () { return new pass_post_ipa_warn (m_ctxt); }
gate(function *)4559 virtual bool gate (function *) { return warn_nonnull != 0; }
4560 virtual unsigned int execute (function *);
4561
4562 }; // class pass_fold_builtins
4563
4564 unsigned int
execute(function * fun)4565 pass_post_ipa_warn::execute (function *fun)
4566 {
4567 basic_block bb;
4568
4569 FOR_EACH_BB_FN (bb, fun)
4570 {
4571 gimple_stmt_iterator gsi;
4572 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4573 {
4574 gimple *stmt = gsi_stmt (gsi);
4575 if (!is_gimple_call (stmt) || warning_suppressed_p (stmt, OPT_Wnonnull))
4576 continue;
4577
4578 tree fntype = gimple_call_fntype (stmt);
4579 bitmap nonnullargs = get_nonnull_args (fntype);
4580 if (!nonnullargs)
4581 continue;
4582
4583 tree fndecl = gimple_call_fndecl (stmt);
4584 const bool closure = fndecl && DECL_LAMBDA_FUNCTION_P (fndecl);
4585
4586 for (unsigned i = 0; i < gimple_call_num_args (stmt); i++)
4587 {
4588 tree arg = gimple_call_arg (stmt, i);
4589 if (TREE_CODE (TREE_TYPE (arg)) != POINTER_TYPE)
4590 continue;
4591 if (!integer_zerop (arg))
4592 continue;
4593 if (i == 0 && closure)
4594 /* Avoid warning for the first argument to lambda functions. */
4595 continue;
4596 if (!bitmap_empty_p (nonnullargs)
4597 && !bitmap_bit_p (nonnullargs, i))
4598 continue;
4599
4600 /* In C++ non-static member functions argument 0 refers
4601 to the implicit this pointer. Use the same one-based
4602 numbering for ordinary arguments. */
4603 unsigned argno = TREE_CODE (fntype) == METHOD_TYPE ? i : i + 1;
4604 location_t loc = (EXPR_HAS_LOCATION (arg)
4605 ? EXPR_LOCATION (arg)
4606 : gimple_location (stmt));
4607 auto_diagnostic_group d;
4608 if (argno == 0)
4609 {
4610 if (warning_at (loc, OPT_Wnonnull,
4611 "%qs pointer is null", "this")
4612 && fndecl)
4613 inform (DECL_SOURCE_LOCATION (fndecl),
4614 "in a call to non-static member function %qD",
4615 fndecl);
4616 continue;
4617 }
4618
4619 if (!warning_at (loc, OPT_Wnonnull,
4620 "argument %u null where non-null "
4621 "expected", argno))
4622 continue;
4623
4624 tree fndecl = gimple_call_fndecl (stmt);
4625 if (fndecl && DECL_IS_UNDECLARED_BUILTIN (fndecl))
4626 inform (loc, "in a call to built-in function %qD",
4627 fndecl);
4628 else if (fndecl)
4629 inform (DECL_SOURCE_LOCATION (fndecl),
4630 "in a call to function %qD declared %qs",
4631 fndecl, "nonnull");
4632 }
4633 BITMAP_FREE (nonnullargs);
4634 }
4635 }
4636 return 0;
4637 }
4638
4639 } // anon namespace
4640
4641 gimple_opt_pass *
make_pass_post_ipa_warn(gcc::context * ctxt)4642 make_pass_post_ipa_warn (gcc::context *ctxt)
4643 {
4644 return new pass_post_ipa_warn (ctxt);
4645 }
4646
4647 #if defined(__NetBSD__) && defined(NETBSD_NATIVE)
4648 /*
4649 * This is a big, ugly, temporary hack:
4650 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59958
4651 * To make sure we have configured all our targets correctly, mimic the
4652 * #ifdef cascade from src/lib/libc/stdlib/jemalloc.c here and compile
4653 * time assert that the value matches gcc's MALLOC_ABI_ALIGNMENT here.
4654 */
4655
4656 #if defined(__hppa__)
4657 #define JEMALLOC_TINY_MIN_2POW 4
4658 #elif defined(__alpha__) || defined(__amd64__) || defined(__sparc64__) \
4659 || (defined(__arm__) && defined(__ARM_EABI__)) \
4660 || defined(__ia64__) || defined(__powerpc__) \
4661 || defined(__aarch64__) \
4662 || ((defined(__mips__) || defined(__riscv__)) && defined(_LP64))
4663 #define JEMALLOC_TINY_MIN_2POW 3
4664 #endif
4665
4666 #ifndef JEMALLOC_TINY_MIN_2POW
4667 #define JEMALLOC_TINY_MIN_2POW 2
4668 #endif
4669
4670 /* make sure we test the (native) 64bit variant for targets supporting -m32 */
4671 #undef TARGET_64BIT
4672 #ifdef _LP64
4673 #define TARGET_64BIT 1
4674 #else
4675 #define TARGET_64BIT 0
4676 #endif
4677
4678 /* ARM has a non-constant MALLOC_ABI_ALIGNMENT since GCC 5. */
4679 #if !defined(__arm__)
4680 #ifdef __CTASSERT
4681 __CTASSERT((8<<JEMALLOC_TINY_MIN_2POW) == MALLOC_ABI_ALIGNMENT);
4682 #else
4683 #error compiling on an older NetBSD version?
4684 #endif
4685 #endif
4686
4687 #endif
4688