xref: /netbsd-src/external/gpl3/gcc/dist/gcc/tree-ssa-ccp.cc (revision 6696db4325bbc521abb4d078b6bead8ba902e6cd)
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