1 /* Statement simplification on GIMPLE.
2 Copyright (C) 2010-2018 Free Software Foundation, Inc.
3 Split out from tree-ssa-ccp.c.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3, or (at your option) any
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
32 #include "gimple-pretty-print.h"
33 #include "gimple-ssa-warn-restrict.h"
34 #include "fold-const.h"
37 #include "stor-layout.h"
39 #include "gimple-fold.h"
41 #include "gimple-iterator.h"
42 #include "tree-into-ssa.h"
44 #include "tree-object-size.h"
46 #include "tree-ssa-propagate.h"
47 #include "ipa-utils.h"
48 #include "tree-ssa-address.h"
49 #include "langhooks.h"
50 #include "gimplify-me.h"
54 #include "gimple-match.h"
55 #include "gomp-constants.h"
56 #include "optabs-query.h"
57 #include "omp-general.h"
59 #include "fold-const-call.h"
60 #include "stringpool.h"
63 #include "diagnostic-core.h"
66 #include "tree-vector-builder.h"
67 #include "tree-ssa-strlen.h"
69 /* Return true when DECL can be referenced from current unit.
70 FROM_DECL (if non-null) specify constructor of variable DECL was taken from.
71 We can get declarations that are not possible to reference for various
74 1) When analyzing C++ virtual tables.
75 C++ virtual tables do have known constructors even
76 when they are keyed to other compilation unit.
77 Those tables can contain pointers to methods and vars
78 in other units. Those methods have both STATIC and EXTERNAL
80 2) In WHOPR mode devirtualization might lead to reference
81 to method that was partitioned elsehwere.
82 In this case we have static VAR_DECL or FUNCTION_DECL
83 that has no corresponding callgraph/varpool node
85 3) COMDAT functions referred by external vtables that
86 we devirtualize only during final compilation stage.
87 At this time we already decided that we will not output
88 the function body and thus we can't reference the symbol
92 can_refer_decl_in_current_unit_p (tree decl
, tree from_decl
)
95 struct cgraph_node
*node
;
98 if (DECL_ABSTRACT_P (decl
))
101 /* We are concerned only about static/external vars and functions. */
102 if ((!TREE_STATIC (decl
) && !DECL_EXTERNAL (decl
))
103 || !VAR_OR_FUNCTION_DECL_P (decl
))
106 /* Static objects can be referred only if they was not optimized out yet. */
107 if (!TREE_PUBLIC (decl
) && !DECL_EXTERNAL (decl
))
109 /* Before we start optimizing unreachable code we can be sure all
110 static objects are defined. */
111 if (symtab
->function_flags_ready
)
113 snode
= symtab_node::get (decl
);
114 if (!snode
|| !snode
->definition
)
116 node
= dyn_cast
<cgraph_node
*> (snode
);
117 return !node
|| !node
->global
.inlined_to
;
120 /* We will later output the initializer, so we can refer to it.
121 So we are concerned only when DECL comes from initializer of
122 external var or var that has been optimized out. */
124 || !VAR_P (from_decl
)
125 || (!DECL_EXTERNAL (from_decl
)
126 && (vnode
= varpool_node::get (from_decl
)) != NULL
127 && vnode
->definition
)
129 && (vnode
= varpool_node::get (from_decl
)) != NULL
130 && vnode
->in_other_partition
))
132 /* We are folding reference from external vtable. The vtable may reffer
133 to a symbol keyed to other compilation unit. The other compilation
134 unit may be in separate DSO and the symbol may be hidden. */
135 if (DECL_VISIBILITY_SPECIFIED (decl
)
136 && DECL_EXTERNAL (decl
)
137 && DECL_VISIBILITY (decl
) != VISIBILITY_DEFAULT
138 && (!(snode
= symtab_node::get (decl
)) || !snode
->in_other_partition
))
140 /* When function is public, we always can introduce new reference.
141 Exception are the COMDAT functions where introducing a direct
142 reference imply need to include function body in the curren tunit. */
143 if (TREE_PUBLIC (decl
) && !DECL_COMDAT (decl
))
145 /* We have COMDAT. We are going to check if we still have definition
146 or if the definition is going to be output in other partition.
147 Bypass this when gimplifying; all needed functions will be produced.
149 As observed in PR20991 for already optimized out comdat virtual functions
150 it may be tempting to not necessarily give up because the copy will be
151 output elsewhere when corresponding vtable is output.
152 This is however not possible - ABI specify that COMDATs are output in
153 units where they are used and when the other unit was compiled with LTO
154 it is possible that vtable was kept public while the function itself
156 if (!symtab
->function_flags_ready
)
159 snode
= symtab_node::get (decl
);
161 || ((!snode
->definition
|| DECL_EXTERNAL (decl
))
162 && (!snode
->in_other_partition
163 || (!snode
->forced_by_abi
&& !snode
->force_output
))))
165 node
= dyn_cast
<cgraph_node
*> (snode
);
166 return !node
|| !node
->global
.inlined_to
;
169 /* Create a temporary for TYPE for a statement STMT. If the current function
170 is in SSA form, a SSA name is created. Otherwise a temporary register
174 create_tmp_reg_or_ssa_name (tree type
, gimple
*stmt
)
176 if (gimple_in_ssa_p (cfun
))
177 return make_ssa_name (type
, stmt
);
179 return create_tmp_reg (type
);
182 /* CVAL is value taken from DECL_INITIAL of variable. Try to transform it into
183 acceptable form for is_gimple_min_invariant.
184 FROM_DECL (if non-NULL) specify variable whose constructor contains CVAL. */
187 canonicalize_constructor_val (tree cval
, tree from_decl
)
189 tree orig_cval
= cval
;
191 if (TREE_CODE (cval
) == POINTER_PLUS_EXPR
192 && TREE_CODE (TREE_OPERAND (cval
, 1)) == INTEGER_CST
)
194 tree ptr
= TREE_OPERAND (cval
, 0);
195 if (is_gimple_min_invariant (ptr
))
196 cval
= build1_loc (EXPR_LOCATION (cval
),
197 ADDR_EXPR
, TREE_TYPE (ptr
),
198 fold_build2 (MEM_REF
, TREE_TYPE (TREE_TYPE (ptr
)),
200 fold_convert (ptr_type_node
,
201 TREE_OPERAND (cval
, 1))));
203 if (TREE_CODE (cval
) == ADDR_EXPR
)
205 tree base
= NULL_TREE
;
206 if (TREE_CODE (TREE_OPERAND (cval
, 0)) == COMPOUND_LITERAL_EXPR
)
208 base
= COMPOUND_LITERAL_EXPR_DECL (TREE_OPERAND (cval
, 0));
210 TREE_OPERAND (cval
, 0) = base
;
213 base
= get_base_address (TREE_OPERAND (cval
, 0));
217 if (VAR_OR_FUNCTION_DECL_P (base
)
218 && !can_refer_decl_in_current_unit_p (base
, from_decl
))
220 if (TREE_TYPE (base
) == error_mark_node
)
223 TREE_ADDRESSABLE (base
) = 1;
224 else if (TREE_CODE (base
) == FUNCTION_DECL
)
226 /* Make sure we create a cgraph node for functions we'll reference.
227 They can be non-existent if the reference comes from an entry
228 of an external vtable for example. */
229 cgraph_node::get_create (base
);
231 /* Fixup types in global initializers. */
232 if (TREE_TYPE (TREE_TYPE (cval
)) != TREE_TYPE (TREE_OPERAND (cval
, 0)))
233 cval
= build_fold_addr_expr (TREE_OPERAND (cval
, 0));
235 if (!useless_type_conversion_p (TREE_TYPE (orig_cval
), TREE_TYPE (cval
)))
236 cval
= fold_convert (TREE_TYPE (orig_cval
), cval
);
239 if (TREE_OVERFLOW_P (cval
))
240 return drop_tree_overflow (cval
);
244 /* If SYM is a constant variable with known value, return the value.
245 NULL_TREE is returned otherwise. */
248 get_symbol_constant_value (tree sym
)
250 tree val
= ctor_for_folding (sym
);
251 if (val
!= error_mark_node
)
255 val
= canonicalize_constructor_val (unshare_expr (val
), sym
);
256 if (val
&& is_gimple_min_invariant (val
))
261 /* Variables declared 'const' without an initializer
262 have zero as the initializer if they may not be
263 overridden at link or run time. */
265 && is_gimple_reg_type (TREE_TYPE (sym
)))
266 return build_zero_cst (TREE_TYPE (sym
));
274 /* Subroutine of fold_stmt. We perform several simplifications of the
275 memory reference tree EXPR and make sure to re-gimplify them properly
276 after propagation of constant addresses. IS_LHS is true if the
277 reference is supposed to be an lvalue. */
280 maybe_fold_reference (tree expr
, bool is_lhs
)
284 if ((TREE_CODE (expr
) == VIEW_CONVERT_EXPR
285 || TREE_CODE (expr
) == REALPART_EXPR
286 || TREE_CODE (expr
) == IMAGPART_EXPR
)
287 && CONSTANT_CLASS_P (TREE_OPERAND (expr
, 0)))
288 return fold_unary_loc (EXPR_LOCATION (expr
),
291 TREE_OPERAND (expr
, 0));
292 else if (TREE_CODE (expr
) == BIT_FIELD_REF
293 && CONSTANT_CLASS_P (TREE_OPERAND (expr
, 0)))
294 return fold_ternary_loc (EXPR_LOCATION (expr
),
297 TREE_OPERAND (expr
, 0),
298 TREE_OPERAND (expr
, 1),
299 TREE_OPERAND (expr
, 2));
302 && (result
= fold_const_aggregate_ref (expr
))
303 && is_gimple_min_invariant (result
))
310 /* Attempt to fold an assignment statement pointed-to by SI. Returns a
311 replacement rhs for the statement or NULL_TREE if no simplification
312 could be made. It is assumed that the operands have been previously
316 fold_gimple_assign (gimple_stmt_iterator
*si
)
318 gimple
*stmt
= gsi_stmt (*si
);
319 enum tree_code subcode
= gimple_assign_rhs_code (stmt
);
320 location_t loc
= gimple_location (stmt
);
322 tree result
= NULL_TREE
;
324 switch (get_gimple_rhs_class (subcode
))
326 case GIMPLE_SINGLE_RHS
:
328 tree rhs
= gimple_assign_rhs1 (stmt
);
330 if (TREE_CLOBBER_P (rhs
))
333 if (REFERENCE_CLASS_P (rhs
))
334 return maybe_fold_reference (rhs
, false);
336 else if (TREE_CODE (rhs
) == OBJ_TYPE_REF
)
338 tree val
= OBJ_TYPE_REF_EXPR (rhs
);
339 if (is_gimple_min_invariant (val
))
341 else if (flag_devirtualize
&& virtual_method_call_p (rhs
))
344 vec
<cgraph_node
*>targets
345 = possible_polymorphic_call_targets (rhs
, stmt
, &final
);
346 if (final
&& targets
.length () <= 1 && dbg_cnt (devirt
))
348 if (dump_enabled_p ())
350 location_t loc
= gimple_location_safe (stmt
);
351 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS
, loc
,
352 "resolving virtual function address "
353 "reference to function %s\n",
354 targets
.length () == 1
355 ? targets
[0]->name ()
358 if (targets
.length () == 1)
360 val
= fold_convert (TREE_TYPE (val
),
361 build_fold_addr_expr_loc
362 (loc
, targets
[0]->decl
));
363 STRIP_USELESS_TYPE_CONVERSION (val
);
366 /* We can not use __builtin_unreachable here because it
367 can not have address taken. */
368 val
= build_int_cst (TREE_TYPE (val
), 0);
374 else if (TREE_CODE (rhs
) == ADDR_EXPR
)
376 tree ref
= TREE_OPERAND (rhs
, 0);
377 tree tem
= maybe_fold_reference (ref
, true);
379 && TREE_CODE (tem
) == MEM_REF
380 && integer_zerop (TREE_OPERAND (tem
, 1)))
381 result
= fold_convert (TREE_TYPE (rhs
), TREE_OPERAND (tem
, 0));
383 result
= fold_convert (TREE_TYPE (rhs
),
384 build_fold_addr_expr_loc (loc
, tem
));
385 else if (TREE_CODE (ref
) == MEM_REF
386 && integer_zerop (TREE_OPERAND (ref
, 1)))
387 result
= fold_convert (TREE_TYPE (rhs
), TREE_OPERAND (ref
, 0));
391 /* Strip away useless type conversions. Both the
392 NON_LVALUE_EXPR that may have been added by fold, and
393 "useless" type conversions that might now be apparent
394 due to propagation. */
395 STRIP_USELESS_TYPE_CONVERSION (result
);
397 if (result
!= rhs
&& valid_gimple_rhs_p (result
))
402 else if (TREE_CODE (rhs
) == CONSTRUCTOR
403 && TREE_CODE (TREE_TYPE (rhs
)) == VECTOR_TYPE
)
405 /* Fold a constant vector CONSTRUCTOR to VECTOR_CST. */
409 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs
), i
, val
)
410 if (! CONSTANT_CLASS_P (val
))
413 return build_vector_from_ctor (TREE_TYPE (rhs
),
414 CONSTRUCTOR_ELTS (rhs
));
417 else if (DECL_P (rhs
))
418 return get_symbol_constant_value (rhs
);
422 case GIMPLE_UNARY_RHS
:
425 case GIMPLE_BINARY_RHS
:
428 case GIMPLE_TERNARY_RHS
:
429 result
= fold_ternary_loc (loc
, subcode
,
430 TREE_TYPE (gimple_assign_lhs (stmt
)),
431 gimple_assign_rhs1 (stmt
),
432 gimple_assign_rhs2 (stmt
),
433 gimple_assign_rhs3 (stmt
));
437 STRIP_USELESS_TYPE_CONVERSION (result
);
438 if (valid_gimple_rhs_p (result
))
443 case GIMPLE_INVALID_RHS
:
451 /* Replace a statement at *SI_P with a sequence of statements in STMTS,
452 adjusting the replacement stmts location and virtual operands.
453 If the statement has a lhs the last stmt in the sequence is expected
454 to assign to that lhs. */
457 gsi_replace_with_seq_vops (gimple_stmt_iterator
*si_p
, gimple_seq stmts
)
459 gimple
*stmt
= gsi_stmt (*si_p
);
461 if (gimple_has_location (stmt
))
462 annotate_all_with_location (stmts
, gimple_location (stmt
));
464 /* First iterate over the replacement statements backward, assigning
465 virtual operands to their defining statements. */
466 gimple
*laststore
= NULL
;
467 for (gimple_stmt_iterator i
= gsi_last (stmts
);
468 !gsi_end_p (i
); gsi_prev (&i
))
470 gimple
*new_stmt
= gsi_stmt (i
);
471 if ((gimple_assign_single_p (new_stmt
)
472 && !is_gimple_reg (gimple_assign_lhs (new_stmt
)))
473 || (is_gimple_call (new_stmt
)
474 && (gimple_call_flags (new_stmt
)
475 & (ECF_NOVOPS
| ECF_PURE
| ECF_CONST
| ECF_NORETURN
)) == 0))
479 vdef
= gimple_vdef (stmt
);
481 vdef
= make_ssa_name (gimple_vop (cfun
), new_stmt
);
482 gimple_set_vdef (new_stmt
, vdef
);
483 if (vdef
&& TREE_CODE (vdef
) == SSA_NAME
)
484 SSA_NAME_DEF_STMT (vdef
) = new_stmt
;
485 laststore
= new_stmt
;
489 /* Second iterate over the statements forward, assigning virtual
490 operands to their uses. */
491 tree reaching_vuse
= gimple_vuse (stmt
);
492 for (gimple_stmt_iterator i
= gsi_start (stmts
);
493 !gsi_end_p (i
); gsi_next (&i
))
495 gimple
*new_stmt
= gsi_stmt (i
);
496 /* If the new statement possibly has a VUSE, update it with exact SSA
497 name we know will reach this one. */
498 if (gimple_has_mem_ops (new_stmt
))
499 gimple_set_vuse (new_stmt
, reaching_vuse
);
500 gimple_set_modified (new_stmt
, true);
501 if (gimple_vdef (new_stmt
))
502 reaching_vuse
= gimple_vdef (new_stmt
);
505 /* If the new sequence does not do a store release the virtual
506 definition of the original statement. */
508 && reaching_vuse
== gimple_vuse (stmt
))
510 tree vdef
= gimple_vdef (stmt
);
512 && TREE_CODE (vdef
) == SSA_NAME
)
514 unlink_stmt_vdef (stmt
);
515 release_ssa_name (vdef
);
519 /* Finally replace the original statement with the sequence. */
520 gsi_replace_with_seq (si_p
, stmts
, false);
523 /* Convert EXPR into a GIMPLE value suitable for substitution on the
524 RHS of an assignment. Insert the necessary statements before
525 iterator *SI_P. The statement at *SI_P, which must be a GIMPLE_CALL
526 is replaced. If the call is expected to produces a result, then it
527 is replaced by an assignment of the new RHS to the result variable.
528 If the result is to be ignored, then the call is replaced by a
529 GIMPLE_NOP. A proper VDEF chain is retained by making the first
530 VUSE and the last VDEF of the whole sequence be the same as the replaced
531 statement and using new SSA names for stores in between. */
534 gimplify_and_update_call_from_tree (gimple_stmt_iterator
*si_p
, tree expr
)
537 gimple
*stmt
, *new_stmt
;
538 gimple_stmt_iterator i
;
539 gimple_seq stmts
= NULL
;
541 stmt
= gsi_stmt (*si_p
);
543 gcc_assert (is_gimple_call (stmt
));
545 push_gimplify_context (gimple_in_ssa_p (cfun
));
547 lhs
= gimple_call_lhs (stmt
);
548 if (lhs
== NULL_TREE
)
550 gimplify_and_add (expr
, &stmts
);
551 /* We can end up with folding a memcpy of an empty class assignment
552 which gets optimized away by C++ gimplification. */
553 if (gimple_seq_empty_p (stmts
))
555 pop_gimplify_context (NULL
);
556 if (gimple_in_ssa_p (cfun
))
558 unlink_stmt_vdef (stmt
);
561 gsi_replace (si_p
, gimple_build_nop (), false);
567 tree tmp
= force_gimple_operand (expr
, &stmts
, false, NULL_TREE
);
568 new_stmt
= gimple_build_assign (lhs
, tmp
);
569 i
= gsi_last (stmts
);
570 gsi_insert_after_without_update (&i
, new_stmt
,
571 GSI_CONTINUE_LINKING
);
574 pop_gimplify_context (NULL
);
576 gsi_replace_with_seq_vops (si_p
, stmts
);
580 /* Replace the call at *GSI with the gimple value VAL. */
583 replace_call_with_value (gimple_stmt_iterator
*gsi
, tree val
)
585 gimple
*stmt
= gsi_stmt (*gsi
);
586 tree lhs
= gimple_call_lhs (stmt
);
590 if (!useless_type_conversion_p (TREE_TYPE (lhs
), TREE_TYPE (val
)))
591 val
= fold_convert (TREE_TYPE (lhs
), val
);
592 repl
= gimple_build_assign (lhs
, val
);
595 repl
= gimple_build_nop ();
596 tree vdef
= gimple_vdef (stmt
);
597 if (vdef
&& TREE_CODE (vdef
) == SSA_NAME
)
599 unlink_stmt_vdef (stmt
);
600 release_ssa_name (vdef
);
602 gsi_replace (gsi
, repl
, false);
605 /* Replace the call at *GSI with the new call REPL and fold that
609 replace_call_with_call_and_fold (gimple_stmt_iterator
*gsi
, gimple
*repl
)
611 gimple
*stmt
= gsi_stmt (*gsi
);
612 gimple_call_set_lhs (repl
, gimple_call_lhs (stmt
));
613 gimple_set_location (repl
, gimple_location (stmt
));
614 if (gimple_vdef (stmt
)
615 && TREE_CODE (gimple_vdef (stmt
)) == SSA_NAME
)
617 gimple_set_vdef (repl
, gimple_vdef (stmt
));
618 SSA_NAME_DEF_STMT (gimple_vdef (repl
)) = repl
;
620 if (gimple_vuse (stmt
))
621 gimple_set_vuse (repl
, gimple_vuse (stmt
));
622 gsi_replace (gsi
, repl
, false);
626 /* Return true if VAR is a VAR_DECL or a component thereof. */
629 var_decl_component_p (tree var
)
632 while (handled_component_p (inner
))
633 inner
= TREE_OPERAND (inner
, 0);
634 return (DECL_P (inner
)
635 || (TREE_CODE (inner
) == MEM_REF
636 && TREE_CODE (TREE_OPERAND (inner
, 0)) == ADDR_EXPR
));
639 /* If the SIZE argument representing the size of an object is in a range
640 of values of which exactly one is valid (and that is zero), return
641 true, otherwise false. */
644 size_must_be_zero_p (tree size
)
646 if (integer_zerop (size
))
649 if (TREE_CODE (size
) != SSA_NAME
)
653 enum value_range_type rtype
= get_range_info (size
, &min
, &max
);
654 if (rtype
!= VR_ANTI_RANGE
)
657 tree type
= TREE_TYPE (size
);
658 int prec
= TYPE_PRECISION (type
);
660 wide_int wone
= wi::one (prec
);
662 /* Compute the value of SSIZE_MAX, the largest positive value that
663 can be stored in ssize_t, the signed counterpart of size_t. */
664 wide_int ssize_max
= wi::lshift (wi::one (prec
), prec
- 1) - 1;
666 return wi::eq_p (min
, wone
) && wi::geu_p (max
, ssize_max
);
669 /* Fold function call to builtin mem{{,p}cpy,move}. Try to detect and
670 diagnose (otherwise undefined) overlapping copies without preventing
671 folding. When folded, GCC guarantees that overlapping memcpy has
672 the same semantics as memmove. Call to the library memcpy need not
673 provide the same guarantee. Return false if no simplification can
677 gimple_fold_builtin_memory_op (gimple_stmt_iterator
*gsi
,
678 tree dest
, tree src
, int endp
)
680 gimple
*stmt
= gsi_stmt (*gsi
);
681 tree lhs
= gimple_call_lhs (stmt
);
682 tree len
= gimple_call_arg (stmt
, 2);
683 tree destvar
, srcvar
;
684 location_t loc
= gimple_location (stmt
);
686 bool nowarn
= gimple_no_warning_p (stmt
);
688 /* If the LEN parameter is a constant zero or in range where
689 the only valid value is zero, return DEST. */
690 if (size_must_be_zero_p (len
))
693 if (gimple_call_lhs (stmt
))
694 repl
= gimple_build_assign (gimple_call_lhs (stmt
), dest
);
696 repl
= gimple_build_nop ();
697 tree vdef
= gimple_vdef (stmt
);
698 if (vdef
&& TREE_CODE (vdef
) == SSA_NAME
)
700 unlink_stmt_vdef (stmt
);
701 release_ssa_name (vdef
);
703 gsi_replace (gsi
, repl
, false);
707 /* If SRC and DEST are the same (and not volatile), return
708 DEST{,+LEN,+LEN-1}. */
709 if (operand_equal_p (src
, dest
, 0))
711 /* Avoid diagnosing exact overlap in calls to __builtin_memcpy.
712 It's safe and may even be emitted by GCC itself (see bug
714 unlink_stmt_vdef (stmt
);
715 if (gimple_vdef (stmt
) && TREE_CODE (gimple_vdef (stmt
)) == SSA_NAME
)
716 release_ssa_name (gimple_vdef (stmt
));
719 gsi_replace (gsi
, gimple_build_nop (), false);
726 tree srctype
, desttype
;
727 unsigned int src_align
, dest_align
;
730 /* Build accesses at offset zero with a ref-all character type. */
731 off0
= build_int_cst (build_pointer_type_for_mode (char_type_node
,
734 /* If we can perform the copy efficiently with first doing all loads
735 and then all stores inline it that way. Currently efficiently
736 means that we can load all the memory into a single integer
737 register which is what MOVE_MAX gives us. */
738 src_align
= get_pointer_alignment (src
);
739 dest_align
= get_pointer_alignment (dest
);
740 if (tree_fits_uhwi_p (len
)
741 && compare_tree_int (len
, MOVE_MAX
) <= 0
742 /* ??? Don't transform copies from strings with known length this
743 confuses the tree-ssa-strlen.c. This doesn't handle
744 the case in gcc.dg/strlenopt-8.c which is XFAILed for that
746 && !c_strlen (src
, 2))
748 unsigned ilen
= tree_to_uhwi (len
);
749 if (pow2p_hwi (ilen
))
751 /* Detect invalid bounds and overlapping copies and issue
752 either -Warray-bounds or -Wrestrict. */
754 && check_bounds_or_overlap (as_a
<gcall
*>(stmt
),
755 dest
, src
, len
, len
))
756 gimple_set_no_warning (stmt
, true);
758 scalar_int_mode mode
;
759 tree type
= lang_hooks
.types
.type_for_size (ilen
* 8, 1);
761 && is_a
<scalar_int_mode
> (TYPE_MODE (type
), &mode
)
762 && GET_MODE_SIZE (mode
) * BITS_PER_UNIT
== ilen
* 8
763 /* If the destination pointer is not aligned we must be able
764 to emit an unaligned store. */
765 && (dest_align
>= GET_MODE_ALIGNMENT (mode
)
766 || !targetm
.slow_unaligned_access (mode
, dest_align
)
767 || (optab_handler (movmisalign_optab
, mode
)
768 != CODE_FOR_nothing
)))
771 tree desttype
= type
;
772 if (src_align
< GET_MODE_ALIGNMENT (mode
))
773 srctype
= build_aligned_type (type
, src_align
);
774 tree srcmem
= fold_build2 (MEM_REF
, srctype
, src
, off0
);
775 tree tem
= fold_const_aggregate_ref (srcmem
);
778 else if (src_align
< GET_MODE_ALIGNMENT (mode
)
779 && targetm
.slow_unaligned_access (mode
, src_align
)
780 && (optab_handler (movmisalign_optab
, mode
)
781 == CODE_FOR_nothing
))
786 if (is_gimple_reg_type (TREE_TYPE (srcmem
)))
788 new_stmt
= gimple_build_assign (NULL_TREE
, srcmem
);
790 = create_tmp_reg_or_ssa_name (TREE_TYPE (srcmem
),
792 gimple_assign_set_lhs (new_stmt
, srcmem
);
793 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
794 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
796 if (dest_align
< GET_MODE_ALIGNMENT (mode
))
797 desttype
= build_aligned_type (type
, dest_align
);
799 = gimple_build_assign (fold_build2 (MEM_REF
, desttype
,
802 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
803 gimple_set_vdef (new_stmt
, gimple_vdef (stmt
));
804 if (gimple_vdef (new_stmt
)
805 && TREE_CODE (gimple_vdef (new_stmt
)) == SSA_NAME
)
806 SSA_NAME_DEF_STMT (gimple_vdef (new_stmt
)) = new_stmt
;
809 gsi_replace (gsi
, new_stmt
, false);
812 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
821 /* Both DEST and SRC must be pointer types.
822 ??? This is what old code did. Is the testing for pointer types
825 If either SRC is readonly or length is 1, we can use memcpy. */
826 if (!dest_align
|| !src_align
)
828 if (readonly_data_expr (src
)
829 || (tree_fits_uhwi_p (len
)
830 && (MIN (src_align
, dest_align
) / BITS_PER_UNIT
831 >= tree_to_uhwi (len
))))
833 tree fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
836 gimple_call_set_fndecl (stmt
, fn
);
837 gimple_call_set_arg (stmt
, 0, dest
);
838 gimple_call_set_arg (stmt
, 1, src
);
843 /* If *src and *dest can't overlap, optimize into memcpy as well. */
844 if (TREE_CODE (src
) == ADDR_EXPR
845 && TREE_CODE (dest
) == ADDR_EXPR
)
847 tree src_base
, dest_base
, fn
;
848 poly_int64 src_offset
= 0, dest_offset
= 0;
851 srcvar
= TREE_OPERAND (src
, 0);
852 src_base
= get_addr_base_and_unit_offset (srcvar
, &src_offset
);
853 if (src_base
== NULL
)
855 destvar
= TREE_OPERAND (dest
, 0);
856 dest_base
= get_addr_base_and_unit_offset (destvar
,
858 if (dest_base
== NULL
)
860 if (!poly_int_tree_p (len
, &maxsize
))
862 if (SSA_VAR_P (src_base
)
863 && SSA_VAR_P (dest_base
))
865 if (operand_equal_p (src_base
, dest_base
, 0)
866 && ranges_maybe_overlap_p (src_offset
, maxsize
,
867 dest_offset
, maxsize
))
870 else if (TREE_CODE (src_base
) == MEM_REF
871 && TREE_CODE (dest_base
) == MEM_REF
)
873 if (! operand_equal_p (TREE_OPERAND (src_base
, 0),
874 TREE_OPERAND (dest_base
, 0), 0))
876 poly_offset_int full_src_offset
877 = mem_ref_offset (src_base
) + src_offset
;
878 poly_offset_int full_dest_offset
879 = mem_ref_offset (dest_base
) + dest_offset
;
880 if (ranges_maybe_overlap_p (full_src_offset
, maxsize
,
881 full_dest_offset
, maxsize
))
887 fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
890 gimple_call_set_fndecl (stmt
, fn
);
891 gimple_call_set_arg (stmt
, 0, dest
);
892 gimple_call_set_arg (stmt
, 1, src
);
897 /* If the destination and source do not alias optimize into
899 if ((is_gimple_min_invariant (dest
)
900 || TREE_CODE (dest
) == SSA_NAME
)
901 && (is_gimple_min_invariant (src
)
902 || TREE_CODE (src
) == SSA_NAME
))
905 ao_ref_init_from_ptr_and_size (&destr
, dest
, len
);
906 ao_ref_init_from_ptr_and_size (&srcr
, src
, len
);
907 if (!refs_may_alias_p_1 (&destr
, &srcr
, false))
910 fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
913 gimple_call_set_fndecl (stmt
, fn
);
914 gimple_call_set_arg (stmt
, 0, dest
);
915 gimple_call_set_arg (stmt
, 1, src
);
924 if (!tree_fits_shwi_p (len
))
926 if (!POINTER_TYPE_P (TREE_TYPE (src
))
927 || !POINTER_TYPE_P (TREE_TYPE (dest
)))
929 /* In the following try to find a type that is most natural to be
930 used for the memcpy source and destination and that allows
931 the most optimization when memcpy is turned into a plain assignment
932 using that type. In theory we could always use a char[len] type
933 but that only gains us that the destination and source possibly
934 no longer will have their address taken. */
935 srctype
= TREE_TYPE (TREE_TYPE (src
));
936 if (TREE_CODE (srctype
) == ARRAY_TYPE
937 && !tree_int_cst_equal (TYPE_SIZE_UNIT (srctype
), len
))
938 srctype
= TREE_TYPE (srctype
);
939 desttype
= TREE_TYPE (TREE_TYPE (dest
));
940 if (TREE_CODE (desttype
) == ARRAY_TYPE
941 && !tree_int_cst_equal (TYPE_SIZE_UNIT (desttype
), len
))
942 desttype
= TREE_TYPE (desttype
);
943 if (TREE_ADDRESSABLE (srctype
)
944 || TREE_ADDRESSABLE (desttype
))
947 /* Make sure we are not copying using a floating-point mode or
948 a type whose size possibly does not match its precision. */
949 if (FLOAT_MODE_P (TYPE_MODE (desttype
))
950 || TREE_CODE (desttype
) == BOOLEAN_TYPE
951 || TREE_CODE (desttype
) == ENUMERAL_TYPE
)
952 desttype
= bitwise_type_for_mode (TYPE_MODE (desttype
));
953 if (FLOAT_MODE_P (TYPE_MODE (srctype
))
954 || TREE_CODE (srctype
) == BOOLEAN_TYPE
955 || TREE_CODE (srctype
) == ENUMERAL_TYPE
)
956 srctype
= bitwise_type_for_mode (TYPE_MODE (srctype
));
964 src_align
= get_pointer_alignment (src
);
965 dest_align
= get_pointer_alignment (dest
);
966 if (dest_align
< TYPE_ALIGN (desttype
)
967 || src_align
< TYPE_ALIGN (srctype
))
971 if (TREE_CODE (dest
) == ADDR_EXPR
972 && var_decl_component_p (TREE_OPERAND (dest
, 0))
973 && tree_int_cst_equal (TYPE_SIZE_UNIT (desttype
), len
))
974 destvar
= fold_build2 (MEM_REF
, desttype
, dest
, off0
);
977 if (TREE_CODE (src
) == ADDR_EXPR
978 && var_decl_component_p (TREE_OPERAND (src
, 0))
979 && tree_int_cst_equal (TYPE_SIZE_UNIT (srctype
), len
))
982 || src_align
>= TYPE_ALIGN (desttype
))
983 srcvar
= fold_build2 (MEM_REF
, destvar
? desttype
: srctype
,
985 else if (!STRICT_ALIGNMENT
)
987 srctype
= build_aligned_type (TYPE_MAIN_VARIANT (desttype
),
989 srcvar
= fold_build2 (MEM_REF
, srctype
, src
, off0
);
993 if (srcvar
== NULL_TREE
&& destvar
== NULL_TREE
)
996 if (srcvar
== NULL_TREE
)
998 if (src_align
>= TYPE_ALIGN (desttype
))
999 srcvar
= fold_build2 (MEM_REF
, desttype
, src
, off0
);
1002 if (STRICT_ALIGNMENT
)
1004 srctype
= build_aligned_type (TYPE_MAIN_VARIANT (desttype
),
1006 srcvar
= fold_build2 (MEM_REF
, srctype
, src
, off0
);
1009 else if (destvar
== NULL_TREE
)
1011 if (dest_align
>= TYPE_ALIGN (srctype
))
1012 destvar
= fold_build2 (MEM_REF
, srctype
, dest
, off0
);
1015 if (STRICT_ALIGNMENT
)
1017 desttype
= build_aligned_type (TYPE_MAIN_VARIANT (srctype
),
1019 destvar
= fold_build2 (MEM_REF
, desttype
, dest
, off0
);
1023 /* Detect invalid bounds and overlapping copies and issue either
1024 -Warray-bounds or -Wrestrict. */
1026 check_bounds_or_overlap (as_a
<gcall
*>(stmt
), dest
, src
, len
, len
);
1029 if (is_gimple_reg_type (TREE_TYPE (srcvar
)))
1031 tree tem
= fold_const_aggregate_ref (srcvar
);
1034 if (! is_gimple_min_invariant (srcvar
))
1036 new_stmt
= gimple_build_assign (NULL_TREE
, srcvar
);
1037 srcvar
= create_tmp_reg_or_ssa_name (TREE_TYPE (srcvar
),
1039 gimple_assign_set_lhs (new_stmt
, srcvar
);
1040 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
1041 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
1043 new_stmt
= gimple_build_assign (destvar
, srcvar
);
1044 goto set_vop_and_replace
;
1047 /* We get an aggregate copy. Use an unsigned char[] type to
1048 perform the copying to preserve padding and to avoid any issues
1049 with TREE_ADDRESSABLE types or float modes behavior on copying. */
1050 desttype
= build_array_type_nelts (unsigned_char_type_node
,
1051 tree_to_uhwi (len
));
1053 if (src_align
> TYPE_ALIGN (srctype
))
1054 srctype
= build_aligned_type (srctype
, src_align
);
1055 if (dest_align
> TYPE_ALIGN (desttype
))
1056 desttype
= build_aligned_type (desttype
, dest_align
);
1058 = gimple_build_assign (fold_build2 (MEM_REF
, desttype
, dest
, off0
),
1059 fold_build2 (MEM_REF
, srctype
, src
, off0
));
1060 set_vop_and_replace
:
1061 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
1062 gimple_set_vdef (new_stmt
, gimple_vdef (stmt
));
1063 if (gimple_vdef (new_stmt
)
1064 && TREE_CODE (gimple_vdef (new_stmt
)) == SSA_NAME
)
1065 SSA_NAME_DEF_STMT (gimple_vdef (new_stmt
)) = new_stmt
;
1068 gsi_replace (gsi
, new_stmt
, false);
1071 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
1075 gimple_seq stmts
= NULL
;
1076 if (endp
== 0 || endp
== 3)
1079 len
= gimple_build (&stmts
, loc
, MINUS_EXPR
, TREE_TYPE (len
), len
,
1081 if (endp
== 2 || endp
== 1)
1083 len
= gimple_convert_to_ptrofftype (&stmts
, loc
, len
);
1084 dest
= gimple_build (&stmts
, loc
, POINTER_PLUS_EXPR
,
1085 TREE_TYPE (dest
), dest
, len
);
1088 gsi_insert_seq_before (gsi
, stmts
, GSI_SAME_STMT
);
1089 gimple
*repl
= gimple_build_assign (lhs
, dest
);
1090 gsi_replace (gsi
, repl
, false);
1094 /* Transform a call to built-in bcmp(a, b, len) at *GSI into one
1095 to built-in memcmp (a, b, len). */
1098 gimple_fold_builtin_bcmp (gimple_stmt_iterator
*gsi
)
1100 tree fn
= builtin_decl_implicit (BUILT_IN_MEMCMP
);
1105 /* Transform bcmp (a, b, len) into memcmp (a, b, len). */
1107 gimple
*stmt
= gsi_stmt (*gsi
);
1108 tree a
= gimple_call_arg (stmt
, 0);
1109 tree b
= gimple_call_arg (stmt
, 1);
1110 tree len
= gimple_call_arg (stmt
, 2);
1112 gimple
*repl
= gimple_build_call (fn
, 3, a
, b
, len
);
1113 replace_call_with_call_and_fold (gsi
, repl
);
1118 /* Transform a call to built-in bcopy (src, dest, len) at *GSI into one
1119 to built-in memmove (dest, src, len). */
1122 gimple_fold_builtin_bcopy (gimple_stmt_iterator
*gsi
)
1124 tree fn
= builtin_decl_implicit (BUILT_IN_MEMMOVE
);
1129 /* bcopy has been removed from POSIX in Issue 7 but Issue 6 specifies
1130 it's quivalent to memmove (not memcpy). Transform bcopy (src, dest,
1131 len) into memmove (dest, src, len). */
1133 gimple
*stmt
= gsi_stmt (*gsi
);
1134 tree src
= gimple_call_arg (stmt
, 0);
1135 tree dest
= gimple_call_arg (stmt
, 1);
1136 tree len
= gimple_call_arg (stmt
, 2);
1138 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, len
);
1139 gimple_call_set_fntype (as_a
<gcall
*> (stmt
), TREE_TYPE (fn
));
1140 replace_call_with_call_and_fold (gsi
, repl
);
1145 /* Transform a call to built-in bzero (dest, len) at *GSI into one
1146 to built-in memset (dest, 0, len). */
1149 gimple_fold_builtin_bzero (gimple_stmt_iterator
*gsi
)
1151 tree fn
= builtin_decl_implicit (BUILT_IN_MEMSET
);
1156 /* Transform bzero (dest, len) into memset (dest, 0, len). */
1158 gimple
*stmt
= gsi_stmt (*gsi
);
1159 tree dest
= gimple_call_arg (stmt
, 0);
1160 tree len
= gimple_call_arg (stmt
, 1);
1162 gimple_seq seq
= NULL
;
1163 gimple
*repl
= gimple_build_call (fn
, 3, dest
, integer_zero_node
, len
);
1164 gimple_seq_add_stmt_without_update (&seq
, repl
);
1165 gsi_replace_with_seq_vops (gsi
, seq
);
1171 /* Fold function call to builtin memset or bzero at *GSI setting the
1172 memory of size LEN to VAL. Return whether a simplification was made. */
1175 gimple_fold_builtin_memset (gimple_stmt_iterator
*gsi
, tree c
, tree len
)
1177 gimple
*stmt
= gsi_stmt (*gsi
);
1179 unsigned HOST_WIDE_INT length
, cval
;
1181 /* If the LEN parameter is zero, return DEST. */
1182 if (integer_zerop (len
))
1184 replace_call_with_value (gsi
, gimple_call_arg (stmt
, 0));
1188 if (! tree_fits_uhwi_p (len
))
1191 if (TREE_CODE (c
) != INTEGER_CST
)
1194 tree dest
= gimple_call_arg (stmt
, 0);
1196 if (TREE_CODE (var
) != ADDR_EXPR
)
1199 var
= TREE_OPERAND (var
, 0);
1200 if (TREE_THIS_VOLATILE (var
))
1203 etype
= TREE_TYPE (var
);
1204 if (TREE_CODE (etype
) == ARRAY_TYPE
)
1205 etype
= TREE_TYPE (etype
);
1207 if (!INTEGRAL_TYPE_P (etype
)
1208 && !POINTER_TYPE_P (etype
))
1211 if (! var_decl_component_p (var
))
1214 length
= tree_to_uhwi (len
);
1215 if (GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (etype
)) != length
1216 || get_pointer_alignment (dest
) / BITS_PER_UNIT
< length
)
1219 if (length
> HOST_BITS_PER_WIDE_INT
/ BITS_PER_UNIT
)
1222 if (integer_zerop (c
))
1226 if (CHAR_BIT
!= 8 || BITS_PER_UNIT
!= 8 || HOST_BITS_PER_WIDE_INT
> 64)
1229 cval
= TREE_INT_CST_LOW (c
);
1233 cval
|= (cval
<< 31) << 1;
1236 var
= fold_build2 (MEM_REF
, etype
, dest
, build_int_cst (ptr_type_node
, 0));
1237 gimple
*store
= gimple_build_assign (var
, build_int_cst_type (etype
, cval
));
1238 gimple_set_vuse (store
, gimple_vuse (stmt
));
1239 tree vdef
= gimple_vdef (stmt
);
1240 if (vdef
&& TREE_CODE (vdef
) == SSA_NAME
)
1242 gimple_set_vdef (store
, gimple_vdef (stmt
));
1243 SSA_NAME_DEF_STMT (gimple_vdef (stmt
)) = store
;
1245 gsi_insert_before (gsi
, store
, GSI_SAME_STMT
);
1246 if (gimple_call_lhs (stmt
))
1248 gimple
*asgn
= gimple_build_assign (gimple_call_lhs (stmt
), dest
);
1249 gsi_replace (gsi
, asgn
, false);
1253 gimple_stmt_iterator gsi2
= *gsi
;
1255 gsi_remove (&gsi2
, true);
1262 /* Obtain the minimum and maximum string length or minimum and maximum
1263 value of ARG in LENGTH[0] and LENGTH[1], respectively.
1264 If ARG is an SSA name variable, follow its use-def chains. When
1265 TYPE == 0, if LENGTH[1] is not equal to the length we determine or
1266 if we are unable to determine the length or value, return false.
1267 VISITED is a bitmap of visited variables.
1268 TYPE is 0 if string length should be obtained, 1 for maximum string
1269 length and 2 for maximum value ARG can have.
1270 When FUZZY is non-zero and the length of a string cannot be determined,
1271 the function instead considers as the maximum possible length the
1272 size of a character array it may refer to. If FUZZY is 2, it will handle
1273 PHIs and COND_EXPRs optimistically, if we can determine string length
1274 minimum and maximum, it will use the minimum from the ones where it
1276 Set *FLEXP to true if the range of the string lengths has been
1277 obtained from the upper bound of an array at the end of a struct.
1278 Such an array may hold a string that's longer than its upper bound
1279 due to it being used as a poor-man's flexible array member. */
1282 get_range_strlen (tree arg
, tree length
[2], bitmap
*visited
, int type
,
1283 int fuzzy
, bool *flexp
)
1285 tree var
, val
= NULL_TREE
;
1288 /* The minimum and maximum length. */
1289 tree
*const minlen
= length
;
1290 tree
*const maxlen
= length
+ 1;
1292 if (TREE_CODE (arg
) != SSA_NAME
)
1294 /* We can end up with &(*iftmp_1)[0] here as well, so handle it. */
1295 if (TREE_CODE (arg
) == ADDR_EXPR
1296 && TREE_CODE (TREE_OPERAND (arg
, 0)) == ARRAY_REF
)
1298 tree op
= TREE_OPERAND (arg
, 0);
1299 if (integer_zerop (TREE_OPERAND (op
, 1)))
1301 tree aop0
= TREE_OPERAND (op
, 0);
1302 if (TREE_CODE (aop0
) == INDIRECT_REF
1303 && TREE_CODE (TREE_OPERAND (aop0
, 0)) == SSA_NAME
)
1304 return get_range_strlen (TREE_OPERAND (aop0
, 0),
1305 length
, visited
, type
, fuzzy
, flexp
);
1307 else if (TREE_CODE (TREE_OPERAND (op
, 0)) == COMPONENT_REF
&& fuzzy
)
1309 /* Fail if an array is the last member of a struct object
1310 since it could be treated as a (fake) flexible array
1312 tree idx
= TREE_OPERAND (op
, 1);
1314 arg
= TREE_OPERAND (op
, 0);
1315 tree optype
= TREE_TYPE (arg
);
1316 if (tree dom
= TYPE_DOMAIN (optype
))
1317 if (tree bound
= TYPE_MAX_VALUE (dom
))
1318 if (TREE_CODE (bound
) == INTEGER_CST
1319 && TREE_CODE (idx
) == INTEGER_CST
1320 && tree_int_cst_lt (bound
, idx
))
1328 if (TREE_CODE (val
) != INTEGER_CST
1329 || tree_int_cst_sgn (val
) < 0)
1333 val
= c_strlen (arg
, 1);
1337 if (TREE_CODE (arg
) == ADDR_EXPR
)
1338 return get_range_strlen (TREE_OPERAND (arg
, 0), length
,
1339 visited
, type
, fuzzy
, flexp
);
1341 if (TREE_CODE (arg
) == ARRAY_REF
)
1343 tree type
= TREE_TYPE (TREE_OPERAND (arg
, 0));
1345 /* Determine the "innermost" array type. */
1346 while (TREE_CODE (type
) == ARRAY_TYPE
1347 && TREE_CODE (TREE_TYPE (type
)) == ARRAY_TYPE
)
1348 type
= TREE_TYPE (type
);
1350 /* Avoid arrays of pointers. */
1351 tree eltype
= TREE_TYPE (type
);
1352 if (TREE_CODE (type
) != ARRAY_TYPE
1353 || !INTEGRAL_TYPE_P (eltype
))
1356 val
= TYPE_SIZE_UNIT (type
);
1357 if (!val
|| integer_zerop (val
))
1360 val
= fold_build2 (MINUS_EXPR
, TREE_TYPE (val
), val
,
1362 /* Set the minimum size to zero since the string in
1363 the array could have zero length. */
1364 *minlen
= ssize_int (0);
1366 if (TREE_CODE (TREE_OPERAND (arg
, 0)) == COMPONENT_REF
1367 && type
== TREE_TYPE (TREE_OPERAND (arg
, 0))
1368 && array_at_struct_end_p (TREE_OPERAND (arg
, 0)))
1371 else if (TREE_CODE (arg
) == COMPONENT_REF
1372 && (TREE_CODE (TREE_TYPE (TREE_OPERAND (arg
, 1)))
1375 /* Use the type of the member array to determine the upper
1376 bound on the length of the array. This may be overly
1377 optimistic if the array itself isn't NUL-terminated and
1378 the caller relies on the subsequent member to contain
1379 the NUL but that would only be considered valid if
1380 the array were the last member of a struct.
1381 Set *FLEXP to true if the array whose bound is being
1382 used is at the end of a struct. */
1383 if (array_at_struct_end_p (arg
))
1386 arg
= TREE_OPERAND (arg
, 1);
1388 tree type
= TREE_TYPE (arg
);
1390 while (TREE_CODE (type
) == ARRAY_TYPE
1391 && TREE_CODE (TREE_TYPE (type
)) == ARRAY_TYPE
)
1392 type
= TREE_TYPE (type
);
1394 /* Fail when the array bound is unknown or zero. */
1395 val
= TYPE_SIZE_UNIT (type
);
1396 if (!val
|| integer_zerop (val
))
1398 val
= fold_build2 (MINUS_EXPR
, TREE_TYPE (val
), val
,
1400 /* Set the minimum size to zero since the string in
1401 the array could have zero length. */
1402 *minlen
= ssize_int (0);
1407 tree type
= TREE_TYPE (arg
);
1408 if (POINTER_TYPE_P (type
))
1409 type
= TREE_TYPE (type
);
1411 if (TREE_CODE (type
) == ARRAY_TYPE
)
1413 val
= TYPE_SIZE_UNIT (type
);
1415 || TREE_CODE (val
) != INTEGER_CST
1416 || integer_zerop (val
))
1418 val
= wide_int_to_tree (TREE_TYPE (val
),
1419 wi::sub (wi::to_wide (val
), 1));
1420 /* Set the minimum size to zero since the string in
1421 the array could have zero length. */
1422 *minlen
= ssize_int (0);
1432 && TREE_CODE (*minlen
) == INTEGER_CST
1433 && TREE_CODE (val
) == INTEGER_CST
1434 && tree_int_cst_lt (val
, *minlen
)))
1441 if (TREE_CODE (*maxlen
) != INTEGER_CST
1442 || TREE_CODE (val
) != INTEGER_CST
)
1445 if (tree_int_cst_lt (*maxlen
, val
))
1449 else if (simple_cst_equal (val
, *maxlen
) != 1)
1457 /* If ARG is registered for SSA update we cannot look at its defining
1459 if (name_registered_for_update_p (arg
))
1462 /* If we were already here, break the infinite cycle. */
1464 *visited
= BITMAP_ALLOC (NULL
);
1465 if (!bitmap_set_bit (*visited
, SSA_NAME_VERSION (arg
)))
1469 def_stmt
= SSA_NAME_DEF_STMT (var
);
1471 switch (gimple_code (def_stmt
))
1474 /* The RHS of the statement defining VAR must either have a
1475 constant length or come from another SSA_NAME with a constant
1477 if (gimple_assign_single_p (def_stmt
)
1478 || gimple_assign_unary_nop_p (def_stmt
))
1480 tree rhs
= gimple_assign_rhs1 (def_stmt
);
1481 return get_range_strlen (rhs
, length
, visited
, type
, fuzzy
, flexp
);
1483 else if (gimple_assign_rhs_code (def_stmt
) == COND_EXPR
)
1485 tree ops
[2] = { gimple_assign_rhs2 (def_stmt
),
1486 gimple_assign_rhs3 (def_stmt
) };
1488 for (unsigned int i
= 0; i
< 2; i
++)
1489 if (!get_range_strlen (ops
[i
], length
, visited
, type
, fuzzy
,
1493 *maxlen
= build_all_ones_cst (size_type_node
);
1502 /* All the arguments of the PHI node must have the same constant
1504 for (unsigned i
= 0; i
< gimple_phi_num_args (def_stmt
); i
++)
1506 tree arg
= gimple_phi_arg (def_stmt
, i
)->def
;
1508 /* If this PHI has itself as an argument, we cannot
1509 determine the string length of this argument. However,
1510 if we can find a constant string length for the other
1511 PHI args then we can still be sure that this is a
1512 constant string length. So be optimistic and just
1513 continue with the next argument. */
1514 if (arg
== gimple_phi_result (def_stmt
))
1517 if (!get_range_strlen (arg
, length
, visited
, type
, fuzzy
, flexp
))
1520 *maxlen
= build_all_ones_cst (size_type_node
);
1532 /* Determine the minimum and maximum value or string length that ARG
1533 refers to and store each in the first two elements of MINMAXLEN.
1534 For expressions that point to strings of unknown lengths that are
1535 character arrays, use the upper bound of the array as the maximum
1536 length. For example, given an expression like 'x ? array : "xyz"'
1537 and array declared as 'char array[8]', MINMAXLEN[0] will be set
1538 to 0 and MINMAXLEN[1] to 7, the longest string that could be
1540 Return true if the range of the string lengths has been obtained
1541 from the upper bound of an array at the end of a struct. Such
1542 an array may hold a string that's longer than its upper bound
1543 due to it being used as a poor-man's flexible array member.
1545 STRICT is true if it will handle PHIs and COND_EXPRs conservatively
1546 and false if PHIs and COND_EXPRs are to be handled optimistically,
1547 if we can determine string length minimum and maximum; it will use
1548 the minimum from the ones where it can be determined.
1549 STRICT false should be only used for warning code. */
1552 get_range_strlen (tree arg
, tree minmaxlen
[2], bool strict
)
1554 bitmap visited
= NULL
;
1556 minmaxlen
[0] = NULL_TREE
;
1557 minmaxlen
[1] = NULL_TREE
;
1559 bool flexarray
= false;
1560 if (!get_range_strlen (arg
, minmaxlen
, &visited
, 1, strict
? 1 : 2,
1563 minmaxlen
[0] = NULL_TREE
;
1564 minmaxlen
[1] = NULL_TREE
;
1568 BITMAP_FREE (visited
);
1574 get_maxval_strlen (tree arg
, int type
)
1576 bitmap visited
= NULL
;
1577 tree len
[2] = { NULL_TREE
, NULL_TREE
};
1580 if (!get_range_strlen (arg
, len
, &visited
, type
, 0, &dummy
))
1583 BITMAP_FREE (visited
);
1589 /* Fold function call to builtin strcpy with arguments DEST and SRC.
1590 If LEN is not NULL, it represents the length of the string to be
1591 copied. Return NULL_TREE if no simplification can be made. */
1594 gimple_fold_builtin_strcpy (gimple_stmt_iterator
*gsi
,
1595 tree dest
, tree src
)
1597 gimple
*stmt
= gsi_stmt (*gsi
);
1598 location_t loc
= gimple_location (stmt
);
1601 /* If SRC and DEST are the same (and not volatile), return DEST. */
1602 if (operand_equal_p (src
, dest
, 0))
1604 /* Issue -Wrestrict unless the pointers are null (those do
1605 not point to objects and so do not indicate an overlap;
1606 such calls could be the result of sanitization and jump
1608 if (!integer_zerop (dest
) && !gimple_no_warning_p (stmt
))
1610 tree func
= gimple_call_fndecl (stmt
);
1612 warning_at (loc
, OPT_Wrestrict
,
1613 "%qD source argument is the same as destination",
1617 replace_call_with_value (gsi
, dest
);
1621 if (optimize_function_for_size_p (cfun
))
1624 fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
1628 tree len
= get_maxval_strlen (src
, 0);
1632 len
= fold_convert_loc (loc
, size_type_node
, len
);
1633 len
= size_binop_loc (loc
, PLUS_EXPR
, len
, build_int_cst (size_type_node
, 1));
1634 len
= force_gimple_operand_gsi (gsi
, len
, true,
1635 NULL_TREE
, true, GSI_SAME_STMT
);
1636 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, len
);
1637 replace_call_with_call_and_fold (gsi
, repl
);
1641 /* Fold function call to builtin strncpy with arguments DEST, SRC, and LEN.
1642 If SLEN is not NULL, it represents the length of the source string.
1643 Return NULL_TREE if no simplification can be made. */
1646 gimple_fold_builtin_strncpy (gimple_stmt_iterator
*gsi
,
1647 tree dest
, tree src
, tree len
)
1649 gimple
*stmt
= gsi_stmt (*gsi
);
1650 location_t loc
= gimple_location (stmt
);
1651 bool nonstring
= get_attr_nonstring_decl (dest
) != NULL_TREE
;
1653 /* If the LEN parameter is zero, return DEST. */
1654 if (integer_zerop (len
))
1656 /* Avoid warning if the destination refers to a an array/pointer
1657 decorate with attribute nonstring. */
1660 tree fndecl
= gimple_call_fndecl (stmt
);
1661 gcall
*call
= as_a
<gcall
*> (stmt
);
1663 /* Warn about the lack of nul termination: the result is not
1664 a (nul-terminated) string. */
1665 tree slen
= get_maxval_strlen (src
, 0);
1666 if (slen
&& !integer_zerop (slen
))
1667 warning_at (loc
, OPT_Wstringop_truncation
,
1668 "%G%qD destination unchanged after copying no bytes "
1669 "from a string of length %E",
1670 call
, fndecl
, slen
);
1672 warning_at (loc
, OPT_Wstringop_truncation
,
1673 "%G%qD destination unchanged after copying no bytes",
1677 replace_call_with_value (gsi
, dest
);
1681 /* We can't compare slen with len as constants below if len is not a
1683 if (TREE_CODE (len
) != INTEGER_CST
)
1686 /* Now, we must be passed a constant src ptr parameter. */
1687 tree slen
= get_maxval_strlen (src
, 0);
1688 if (!slen
|| TREE_CODE (slen
) != INTEGER_CST
)
1691 /* The size of the source string including the terminating nul. */
1692 tree ssize
= size_binop_loc (loc
, PLUS_EXPR
, slen
, ssize_int (1));
1694 /* We do not support simplification of this case, though we do
1695 support it when expanding trees into RTL. */
1696 /* FIXME: generate a call to __builtin_memset. */
1697 if (tree_int_cst_lt (ssize
, len
))
1700 /* Diagnose truncation that leaves the copy unterminated. */
1701 maybe_diag_stxncpy_trunc (*gsi
, src
, len
);
1703 /* OK transform into builtin memcpy. */
1704 tree fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
1708 len
= fold_convert_loc (loc
, size_type_node
, len
);
1709 len
= force_gimple_operand_gsi (gsi
, len
, true,
1710 NULL_TREE
, true, GSI_SAME_STMT
);
1711 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, len
);
1712 replace_call_with_call_and_fold (gsi
, repl
);
1717 /* Fold function call to builtin strchr or strrchr.
1718 If both arguments are constant, evaluate and fold the result,
1719 otherwise simplify str(r)chr (str, 0) into str + strlen (str).
1720 In general strlen is significantly faster than strchr
1721 due to being a simpler operation. */
1723 gimple_fold_builtin_strchr (gimple_stmt_iterator
*gsi
, bool is_strrchr
)
1725 gimple
*stmt
= gsi_stmt (*gsi
);
1726 tree str
= gimple_call_arg (stmt
, 0);
1727 tree c
= gimple_call_arg (stmt
, 1);
1728 location_t loc
= gimple_location (stmt
);
1732 if (!gimple_call_lhs (stmt
))
1735 if ((p
= c_getstr (str
)) && target_char_cst_p (c
, &ch
))
1737 const char *p1
= is_strrchr
? strrchr (p
, ch
) : strchr (p
, ch
);
1741 replace_call_with_value (gsi
, integer_zero_node
);
1745 tree len
= build_int_cst (size_type_node
, p1
- p
);
1746 gimple_seq stmts
= NULL
;
1747 gimple
*new_stmt
= gimple_build_assign (gimple_call_lhs (stmt
),
1748 POINTER_PLUS_EXPR
, str
, len
);
1749 gimple_seq_add_stmt_without_update (&stmts
, new_stmt
);
1750 gsi_replace_with_seq_vops (gsi
, stmts
);
1754 if (!integer_zerop (c
))
1757 /* Transform strrchr (s, 0) to strchr (s, 0) when optimizing for size. */
1758 if (is_strrchr
&& optimize_function_for_size_p (cfun
))
1760 tree strchr_fn
= builtin_decl_implicit (BUILT_IN_STRCHR
);
1764 gimple
*repl
= gimple_build_call (strchr_fn
, 2, str
, c
);
1765 replace_call_with_call_and_fold (gsi
, repl
);
1773 tree strlen_fn
= builtin_decl_implicit (BUILT_IN_STRLEN
);
1778 /* Create newstr = strlen (str). */
1779 gimple_seq stmts
= NULL
;
1780 gimple
*new_stmt
= gimple_build_call (strlen_fn
, 1, str
);
1781 gimple_set_location (new_stmt
, loc
);
1782 len
= create_tmp_reg_or_ssa_name (size_type_node
);
1783 gimple_call_set_lhs (new_stmt
, len
);
1784 gimple_seq_add_stmt_without_update (&stmts
, new_stmt
);
1786 /* Create (str p+ strlen (str)). */
1787 new_stmt
= gimple_build_assign (gimple_call_lhs (stmt
),
1788 POINTER_PLUS_EXPR
, str
, len
);
1789 gimple_seq_add_stmt_without_update (&stmts
, new_stmt
);
1790 gsi_replace_with_seq_vops (gsi
, stmts
);
1791 /* gsi now points at the assignment to the lhs, get a
1792 stmt iterator to the strlen.
1793 ??? We can't use gsi_for_stmt as that doesn't work when the
1794 CFG isn't built yet. */
1795 gimple_stmt_iterator gsi2
= *gsi
;
1801 /* Fold function call to builtin strstr.
1802 If both arguments are constant, evaluate and fold the result,
1803 additionally fold strstr (x, "") into x and strstr (x, "c")
1804 into strchr (x, 'c'). */
1806 gimple_fold_builtin_strstr (gimple_stmt_iterator
*gsi
)
1808 gimple
*stmt
= gsi_stmt (*gsi
);
1809 tree haystack
= gimple_call_arg (stmt
, 0);
1810 tree needle
= gimple_call_arg (stmt
, 1);
1813 if (!gimple_call_lhs (stmt
))
1816 q
= c_getstr (needle
);
1820 if ((p
= c_getstr (haystack
)))
1822 const char *r
= strstr (p
, q
);
1826 replace_call_with_value (gsi
, integer_zero_node
);
1830 tree len
= build_int_cst (size_type_node
, r
- p
);
1831 gimple_seq stmts
= NULL
;
1833 = gimple_build_assign (gimple_call_lhs (stmt
), POINTER_PLUS_EXPR
,
1835 gimple_seq_add_stmt_without_update (&stmts
, new_stmt
);
1836 gsi_replace_with_seq_vops (gsi
, stmts
);
1840 /* For strstr (x, "") return x. */
1843 replace_call_with_value (gsi
, haystack
);
1847 /* Transform strstr (x, "c") into strchr (x, 'c'). */
1850 tree strchr_fn
= builtin_decl_implicit (BUILT_IN_STRCHR
);
1853 tree c
= build_int_cst (integer_type_node
, q
[0]);
1854 gimple
*repl
= gimple_build_call (strchr_fn
, 2, haystack
, c
);
1855 replace_call_with_call_and_fold (gsi
, repl
);
1863 /* Simplify a call to the strcat builtin. DST and SRC are the arguments
1866 Return NULL_TREE if no simplification was possible, otherwise return the
1867 simplified form of the call as a tree.
1869 The simplified form may be a constant or other expression which
1870 computes the same value, but in a more efficient manner (including
1871 calls to other builtin functions).
1873 The call may contain arguments which need to be evaluated, but
1874 which are not useful to determine the result of the call. In
1875 this case we return a chain of COMPOUND_EXPRs. The LHS of each
1876 COMPOUND_EXPR will be an argument which must be evaluated.
1877 COMPOUND_EXPRs are chained through their RHS. The RHS of the last
1878 COMPOUND_EXPR in the chain will contain the tree for the simplified
1879 form of the builtin function call. */
1882 gimple_fold_builtin_strcat (gimple_stmt_iterator
*gsi
, tree dst
, tree src
)
1884 gimple
*stmt
= gsi_stmt (*gsi
);
1885 location_t loc
= gimple_location (stmt
);
1887 const char *p
= c_getstr (src
);
1889 /* If the string length is zero, return the dst parameter. */
1890 if (p
&& *p
== '\0')
1892 replace_call_with_value (gsi
, dst
);
1896 if (!optimize_bb_for_speed_p (gimple_bb (stmt
)))
1899 /* See if we can store by pieces into (dst + strlen(dst)). */
1901 tree strlen_fn
= builtin_decl_implicit (BUILT_IN_STRLEN
);
1902 tree memcpy_fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
1904 if (!strlen_fn
|| !memcpy_fn
)
1907 /* If the length of the source string isn't computable don't
1908 split strcat into strlen and memcpy. */
1909 tree len
= get_maxval_strlen (src
, 0);
1913 /* Create strlen (dst). */
1914 gimple_seq stmts
= NULL
, stmts2
;
1915 gimple
*repl
= gimple_build_call (strlen_fn
, 1, dst
);
1916 gimple_set_location (repl
, loc
);
1917 newdst
= create_tmp_reg_or_ssa_name (size_type_node
);
1918 gimple_call_set_lhs (repl
, newdst
);
1919 gimple_seq_add_stmt_without_update (&stmts
, repl
);
1921 /* Create (dst p+ strlen (dst)). */
1922 newdst
= fold_build_pointer_plus_loc (loc
, dst
, newdst
);
1923 newdst
= force_gimple_operand (newdst
, &stmts2
, true, NULL_TREE
);
1924 gimple_seq_add_seq_without_update (&stmts
, stmts2
);
1926 len
= fold_convert_loc (loc
, size_type_node
, len
);
1927 len
= size_binop_loc (loc
, PLUS_EXPR
, len
,
1928 build_int_cst (size_type_node
, 1));
1929 len
= force_gimple_operand (len
, &stmts2
, true, NULL_TREE
);
1930 gimple_seq_add_seq_without_update (&stmts
, stmts2
);
1932 repl
= gimple_build_call (memcpy_fn
, 3, newdst
, src
, len
);
1933 gimple_seq_add_stmt_without_update (&stmts
, repl
);
1934 if (gimple_call_lhs (stmt
))
1936 repl
= gimple_build_assign (gimple_call_lhs (stmt
), dst
);
1937 gimple_seq_add_stmt_without_update (&stmts
, repl
);
1938 gsi_replace_with_seq_vops (gsi
, stmts
);
1939 /* gsi now points at the assignment to the lhs, get a
1940 stmt iterator to the memcpy call.
1941 ??? We can't use gsi_for_stmt as that doesn't work when the
1942 CFG isn't built yet. */
1943 gimple_stmt_iterator gsi2
= *gsi
;
1949 gsi_replace_with_seq_vops (gsi
, stmts
);
1955 /* Fold a call to the __strcat_chk builtin FNDECL. DEST, SRC, and SIZE
1956 are the arguments to the call. */
1959 gimple_fold_builtin_strcat_chk (gimple_stmt_iterator
*gsi
)
1961 gimple
*stmt
= gsi_stmt (*gsi
);
1962 tree dest
= gimple_call_arg (stmt
, 0);
1963 tree src
= gimple_call_arg (stmt
, 1);
1964 tree size
= gimple_call_arg (stmt
, 2);
1970 /* If the SRC parameter is "", return DEST. */
1971 if (p
&& *p
== '\0')
1973 replace_call_with_value (gsi
, dest
);
1977 if (! tree_fits_uhwi_p (size
) || ! integer_all_onesp (size
))
1980 /* If __builtin_strcat_chk is used, assume strcat is available. */
1981 fn
= builtin_decl_explicit (BUILT_IN_STRCAT
);
1985 gimple
*repl
= gimple_build_call (fn
, 2, dest
, src
);
1986 replace_call_with_call_and_fold (gsi
, repl
);
1990 /* Simplify a call to the strncat builtin. */
1993 gimple_fold_builtin_strncat (gimple_stmt_iterator
*gsi
)
1995 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
1996 tree dst
= gimple_call_arg (stmt
, 0);
1997 tree src
= gimple_call_arg (stmt
, 1);
1998 tree len
= gimple_call_arg (stmt
, 2);
2000 const char *p
= c_getstr (src
);
2002 /* If the requested length is zero, or the src parameter string
2003 length is zero, return the dst parameter. */
2004 if (integer_zerop (len
) || (p
&& *p
== '\0'))
2006 replace_call_with_value (gsi
, dst
);
2010 if (TREE_CODE (len
) != INTEGER_CST
|| !p
)
2013 unsigned srclen
= strlen (p
);
2015 int cmpsrc
= compare_tree_int (len
, srclen
);
2017 /* Return early if the requested len is less than the string length.
2018 Warnings will be issued elsewhere later. */
2022 unsigned HOST_WIDE_INT dstsize
;
2024 bool nowarn
= gimple_no_warning_p (stmt
);
2026 if (!nowarn
&& compute_builtin_object_size (dst
, 1, &dstsize
))
2028 int cmpdst
= compare_tree_int (len
, dstsize
);
2032 tree fndecl
= gimple_call_fndecl (stmt
);
2034 /* Strncat copies (at most) LEN bytes and always appends
2035 the terminating NUL so the specified bound should never
2036 be equal to (or greater than) the size of the destination.
2037 If it is, the copy could overflow. */
2038 location_t loc
= gimple_location (stmt
);
2039 nowarn
= warning_at (loc
, OPT_Wstringop_overflow_
,
2041 ? G_("%G%qD specified bound %E equals "
2043 : G_("%G%qD specified bound %E exceeds "
2044 "destination size %wu"),
2045 stmt
, fndecl
, len
, dstsize
);
2047 gimple_set_no_warning (stmt
, true);
2051 if (!nowarn
&& cmpsrc
== 0)
2053 tree fndecl
= gimple_call_fndecl (stmt
);
2055 /* To avoid certain truncation the specified bound should also
2056 not be equal to (or less than) the length of the source. */
2057 location_t loc
= gimple_location (stmt
);
2058 if (warning_at (loc
, OPT_Wstringop_overflow_
,
2059 "%G%qD specified bound %E equals source length",
2061 gimple_set_no_warning (stmt
, true);
2064 tree fn
= builtin_decl_implicit (BUILT_IN_STRCAT
);
2066 /* If the replacement _DECL isn't initialized, don't do the
2071 /* Otherwise, emit a call to strcat. */
2072 gcall
*repl
= gimple_build_call (fn
, 2, dst
, src
);
2073 replace_call_with_call_and_fold (gsi
, repl
);
2077 /* Fold a call to the __strncat_chk builtin with arguments DEST, SRC,
2081 gimple_fold_builtin_strncat_chk (gimple_stmt_iterator
*gsi
)
2083 gimple
*stmt
= gsi_stmt (*gsi
);
2084 tree dest
= gimple_call_arg (stmt
, 0);
2085 tree src
= gimple_call_arg (stmt
, 1);
2086 tree len
= gimple_call_arg (stmt
, 2);
2087 tree size
= gimple_call_arg (stmt
, 3);
2092 /* If the SRC parameter is "" or if LEN is 0, return DEST. */
2093 if ((p
&& *p
== '\0')
2094 || integer_zerop (len
))
2096 replace_call_with_value (gsi
, dest
);
2100 if (! tree_fits_uhwi_p (size
))
2103 if (! integer_all_onesp (size
))
2105 tree src_len
= c_strlen (src
, 1);
2107 && tree_fits_uhwi_p (src_len
)
2108 && tree_fits_uhwi_p (len
)
2109 && ! tree_int_cst_lt (len
, src_len
))
2111 /* If LEN >= strlen (SRC), optimize into __strcat_chk. */
2112 fn
= builtin_decl_explicit (BUILT_IN_STRCAT_CHK
);
2116 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, size
);
2117 replace_call_with_call_and_fold (gsi
, repl
);
2123 /* If __builtin_strncat_chk is used, assume strncat is available. */
2124 fn
= builtin_decl_explicit (BUILT_IN_STRNCAT
);
2128 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, len
);
2129 replace_call_with_call_and_fold (gsi
, repl
);
2133 /* Build and append gimple statements to STMTS that would load a first
2134 character of a memory location identified by STR. LOC is location
2135 of the statement. */
2138 gimple_load_first_char (location_t loc
, tree str
, gimple_seq
*stmts
)
2142 tree cst_uchar_node
= build_type_variant (unsigned_char_type_node
, 1, 0);
2143 tree cst_uchar_ptr_node
2144 = build_pointer_type_for_mode (cst_uchar_node
, ptr_mode
, true);
2145 tree off0
= build_int_cst (cst_uchar_ptr_node
, 0);
2147 tree temp
= fold_build2_loc (loc
, MEM_REF
, cst_uchar_node
, str
, off0
);
2148 gassign
*stmt
= gimple_build_assign (NULL_TREE
, temp
);
2149 var
= create_tmp_reg_or_ssa_name (cst_uchar_node
, stmt
);
2151 gimple_assign_set_lhs (stmt
, var
);
2152 gimple_seq_add_stmt_without_update (stmts
, stmt
);
2157 /* Fold a call to the str{n}{case}cmp builtin pointed by GSI iterator.
2158 FCODE is the name of the builtin. */
2161 gimple_fold_builtin_string_compare (gimple_stmt_iterator
*gsi
)
2163 gimple
*stmt
= gsi_stmt (*gsi
);
2164 tree callee
= gimple_call_fndecl (stmt
);
2165 enum built_in_function fcode
= DECL_FUNCTION_CODE (callee
);
2167 tree type
= integer_type_node
;
2168 tree str1
= gimple_call_arg (stmt
, 0);
2169 tree str2
= gimple_call_arg (stmt
, 1);
2170 tree lhs
= gimple_call_lhs (stmt
);
2171 HOST_WIDE_INT length
= -1;
2173 /* Handle strncmp and strncasecmp functions. */
2174 if (gimple_call_num_args (stmt
) == 3)
2176 tree len
= gimple_call_arg (stmt
, 2);
2177 if (tree_fits_uhwi_p (len
))
2178 length
= tree_to_uhwi (len
);
2181 /* If the LEN parameter is zero, return zero. */
2184 replace_call_with_value (gsi
, integer_zero_node
);
2188 /* If ARG1 and ARG2 are the same (and not volatile), return zero. */
2189 if (operand_equal_p (str1
, str2
, 0))
2191 replace_call_with_value (gsi
, integer_zero_node
);
2195 const char *p1
= c_getstr (str1
);
2196 const char *p2
= c_getstr (str2
);
2198 /* For known strings, return an immediate value. */
2202 bool known_result
= false;
2206 case BUILT_IN_STRCMP
:
2207 case BUILT_IN_STRCMP_EQ
:
2209 r
= strcmp (p1
, p2
);
2210 known_result
= true;
2213 case BUILT_IN_STRNCMP
:
2214 case BUILT_IN_STRNCMP_EQ
:
2218 r
= strncmp (p1
, p2
, length
);
2219 known_result
= true;
2222 /* Only handleable situation is where the string are equal (result 0),
2223 which is already handled by operand_equal_p case. */
2224 case BUILT_IN_STRCASECMP
:
2226 case BUILT_IN_STRNCASECMP
:
2230 r
= strncmp (p1
, p2
, length
);
2232 known_result
= true;
2241 replace_call_with_value (gsi
, build_cmp_result (type
, r
));
2246 bool nonzero_length
= length
>= 1
2247 || fcode
== BUILT_IN_STRCMP
2248 || fcode
== BUILT_IN_STRCMP_EQ
2249 || fcode
== BUILT_IN_STRCASECMP
;
2251 location_t loc
= gimple_location (stmt
);
2253 /* If the second arg is "", return *(const unsigned char*)arg1. */
2254 if (p2
&& *p2
== '\0' && nonzero_length
)
2256 gimple_seq stmts
= NULL
;
2257 tree var
= gimple_load_first_char (loc
, str1
, &stmts
);
2260 stmt
= gimple_build_assign (lhs
, NOP_EXPR
, var
);
2261 gimple_seq_add_stmt_without_update (&stmts
, stmt
);
2264 gsi_replace_with_seq_vops (gsi
, stmts
);
2268 /* If the first arg is "", return -*(const unsigned char*)arg2. */
2269 if (p1
&& *p1
== '\0' && nonzero_length
)
2271 gimple_seq stmts
= NULL
;
2272 tree var
= gimple_load_first_char (loc
, str2
, &stmts
);
2276 tree c
= create_tmp_reg_or_ssa_name (integer_type_node
);
2277 stmt
= gimple_build_assign (c
, NOP_EXPR
, var
);
2278 gimple_seq_add_stmt_without_update (&stmts
, stmt
);
2280 stmt
= gimple_build_assign (lhs
, NEGATE_EXPR
, c
);
2281 gimple_seq_add_stmt_without_update (&stmts
, stmt
);
2284 gsi_replace_with_seq_vops (gsi
, stmts
);
2288 /* If len parameter is one, return an expression corresponding to
2289 (*(const unsigned char*)arg2 - *(const unsigned char*)arg1). */
2290 if (fcode
== BUILT_IN_STRNCMP
&& length
== 1)
2292 gimple_seq stmts
= NULL
;
2293 tree temp1
= gimple_load_first_char (loc
, str1
, &stmts
);
2294 tree temp2
= gimple_load_first_char (loc
, str2
, &stmts
);
2298 tree c1
= create_tmp_reg_or_ssa_name (integer_type_node
);
2299 gassign
*convert1
= gimple_build_assign (c1
, NOP_EXPR
, temp1
);
2300 gimple_seq_add_stmt_without_update (&stmts
, convert1
);
2302 tree c2
= create_tmp_reg_or_ssa_name (integer_type_node
);
2303 gassign
*convert2
= gimple_build_assign (c2
, NOP_EXPR
, temp2
);
2304 gimple_seq_add_stmt_without_update (&stmts
, convert2
);
2306 stmt
= gimple_build_assign (lhs
, MINUS_EXPR
, c1
, c2
);
2307 gimple_seq_add_stmt_without_update (&stmts
, stmt
);
2310 gsi_replace_with_seq_vops (gsi
, stmts
);
2314 /* If length is larger than the length of one constant string,
2315 replace strncmp with corresponding strcmp */
2316 if (fcode
== BUILT_IN_STRNCMP
2318 && ((p2
&& (size_t) length
> strlen (p2
))
2319 || (p1
&& (size_t) length
> strlen (p1
))))
2321 tree fn
= builtin_decl_implicit (BUILT_IN_STRCMP
);
2324 gimple
*repl
= gimple_build_call (fn
, 2, str1
, str2
);
2325 replace_call_with_call_and_fold (gsi
, repl
);
2332 /* Fold a call to the memchr pointed by GSI iterator. */
2335 gimple_fold_builtin_memchr (gimple_stmt_iterator
*gsi
)
2337 gimple
*stmt
= gsi_stmt (*gsi
);
2338 tree lhs
= gimple_call_lhs (stmt
);
2339 tree arg1
= gimple_call_arg (stmt
, 0);
2340 tree arg2
= gimple_call_arg (stmt
, 1);
2341 tree len
= gimple_call_arg (stmt
, 2);
2343 /* If the LEN parameter is zero, return zero. */
2344 if (integer_zerop (len
))
2346 replace_call_with_value (gsi
, build_int_cst (ptr_type_node
, 0));
2351 if (TREE_CODE (arg2
) != INTEGER_CST
2352 || !tree_fits_uhwi_p (len
)
2353 || !target_char_cst_p (arg2
, &c
))
2356 unsigned HOST_WIDE_INT length
= tree_to_uhwi (len
);
2357 unsigned HOST_WIDE_INT string_length
;
2358 const char *p1
= c_getstr (arg1
, &string_length
);
2362 const char *r
= (const char *)memchr (p1
, c
, MIN (length
, string_length
));
2365 if (length
<= string_length
)
2367 replace_call_with_value (gsi
, build_int_cst (ptr_type_node
, 0));
2373 unsigned HOST_WIDE_INT offset
= r
- p1
;
2374 gimple_seq stmts
= NULL
;
2375 if (lhs
!= NULL_TREE
)
2377 tree offset_cst
= build_int_cst (TREE_TYPE (len
), offset
);
2378 gassign
*stmt
= gimple_build_assign (lhs
, POINTER_PLUS_EXPR
,
2380 gimple_seq_add_stmt_without_update (&stmts
, stmt
);
2383 gimple_seq_add_stmt_without_update (&stmts
,
2384 gimple_build_nop ());
2386 gsi_replace_with_seq_vops (gsi
, stmts
);
2394 /* Fold a call to the fputs builtin. ARG0 and ARG1 are the arguments
2395 to the call. IGNORE is true if the value returned
2396 by the builtin will be ignored. UNLOCKED is true is true if this
2397 actually a call to fputs_unlocked. If LEN in non-NULL, it represents
2398 the known length of the string. Return NULL_TREE if no simplification
2402 gimple_fold_builtin_fputs (gimple_stmt_iterator
*gsi
,
2403 tree arg0
, tree arg1
,
2406 gimple
*stmt
= gsi_stmt (*gsi
);
2408 /* If we're using an unlocked function, assume the other unlocked
2409 functions exist explicitly. */
2410 tree
const fn_fputc
= (unlocked
2411 ? builtin_decl_explicit (BUILT_IN_FPUTC_UNLOCKED
)
2412 : builtin_decl_implicit (BUILT_IN_FPUTC
));
2413 tree
const fn_fwrite
= (unlocked
2414 ? builtin_decl_explicit (BUILT_IN_FWRITE_UNLOCKED
)
2415 : builtin_decl_implicit (BUILT_IN_FWRITE
));
2417 /* If the return value is used, don't do the transformation. */
2418 if (gimple_call_lhs (stmt
))
2421 /* Get the length of the string passed to fputs. If the length
2422 can't be determined, punt. */
2423 tree len
= get_maxval_strlen (arg0
, 0);
2425 || TREE_CODE (len
) != INTEGER_CST
)
2428 switch (compare_tree_int (len
, 1))
2430 case -1: /* length is 0, delete the call entirely . */
2431 replace_call_with_value (gsi
, integer_zero_node
);
2434 case 0: /* length is 1, call fputc. */
2436 const char *p
= c_getstr (arg0
);
2442 gimple
*repl
= gimple_build_call (fn_fputc
, 2,
2444 (integer_type_node
, p
[0]), arg1
);
2445 replace_call_with_call_and_fold (gsi
, repl
);
2450 case 1: /* length is greater than 1, call fwrite. */
2452 /* If optimizing for size keep fputs. */
2453 if (optimize_function_for_size_p (cfun
))
2455 /* New argument list transforming fputs(string, stream) to
2456 fwrite(string, 1, len, stream). */
2460 gimple
*repl
= gimple_build_call (fn_fwrite
, 4, arg0
,
2461 size_one_node
, len
, arg1
);
2462 replace_call_with_call_and_fold (gsi
, repl
);
2471 /* Fold a call to the __mem{cpy,pcpy,move,set}_chk builtin.
2472 DEST, SRC, LEN, and SIZE are the arguments to the call.
2473 IGNORE is true, if return value can be ignored. FCODE is the BUILT_IN_*
2474 code of the builtin. If MAXLEN is not NULL, it is maximum length
2475 passed as third argument. */
2478 gimple_fold_builtin_memory_chk (gimple_stmt_iterator
*gsi
,
2479 tree dest
, tree src
, tree len
, tree size
,
2480 enum built_in_function fcode
)
2482 gimple
*stmt
= gsi_stmt (*gsi
);
2483 location_t loc
= gimple_location (stmt
);
2484 bool ignore
= gimple_call_lhs (stmt
) == NULL_TREE
;
2487 /* If SRC and DEST are the same (and not volatile), return DEST
2488 (resp. DEST+LEN for __mempcpy_chk). */
2489 if (fcode
!= BUILT_IN_MEMSET_CHK
&& operand_equal_p (src
, dest
, 0))
2491 if (fcode
!= BUILT_IN_MEMPCPY_CHK
)
2493 replace_call_with_value (gsi
, dest
);
2498 gimple_seq stmts
= NULL
;
2499 len
= gimple_convert_to_ptrofftype (&stmts
, loc
, len
);
2500 tree temp
= gimple_build (&stmts
, loc
, POINTER_PLUS_EXPR
,
2501 TREE_TYPE (dest
), dest
, len
);
2502 gsi_insert_seq_before (gsi
, stmts
, GSI_SAME_STMT
);
2503 replace_call_with_value (gsi
, temp
);
2508 if (! tree_fits_uhwi_p (size
))
2511 tree maxlen
= get_maxval_strlen (len
, 2);
2512 if (! integer_all_onesp (size
))
2514 if (! tree_fits_uhwi_p (len
))
2516 /* If LEN is not constant, try MAXLEN too.
2517 For MAXLEN only allow optimizing into non-_ocs function
2518 if SIZE is >= MAXLEN, never convert to __ocs_fail (). */
2519 if (maxlen
== NULL_TREE
|| ! tree_fits_uhwi_p (maxlen
))
2521 if (fcode
== BUILT_IN_MEMPCPY_CHK
&& ignore
)
2523 /* (void) __mempcpy_chk () can be optimized into
2524 (void) __memcpy_chk (). */
2525 fn
= builtin_decl_explicit (BUILT_IN_MEMCPY_CHK
);
2529 gimple
*repl
= gimple_build_call (fn
, 4, dest
, src
, len
, size
);
2530 replace_call_with_call_and_fold (gsi
, repl
);
2539 if (tree_int_cst_lt (size
, maxlen
))
2544 /* If __builtin_mem{cpy,pcpy,move,set}_chk is used, assume
2545 mem{cpy,pcpy,move,set} is available. */
2548 case BUILT_IN_MEMCPY_CHK
:
2549 fn
= builtin_decl_explicit (BUILT_IN_MEMCPY
);
2551 case BUILT_IN_MEMPCPY_CHK
:
2552 fn
= builtin_decl_explicit (BUILT_IN_MEMPCPY
);
2554 case BUILT_IN_MEMMOVE_CHK
:
2555 fn
= builtin_decl_explicit (BUILT_IN_MEMMOVE
);
2557 case BUILT_IN_MEMSET_CHK
:
2558 fn
= builtin_decl_explicit (BUILT_IN_MEMSET
);
2567 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, len
);
2568 replace_call_with_call_and_fold (gsi
, repl
);
2572 /* Fold a call to the __st[rp]cpy_chk builtin.
2573 DEST, SRC, and SIZE are the arguments to the call.
2574 IGNORE is true if return value can be ignored. FCODE is the BUILT_IN_*
2575 code of the builtin. If MAXLEN is not NULL, it is maximum length of
2576 strings passed as second argument. */
2579 gimple_fold_builtin_stxcpy_chk (gimple_stmt_iterator
*gsi
,
2581 tree src
, tree size
,
2582 enum built_in_function fcode
)
2584 gimple
*stmt
= gsi_stmt (*gsi
);
2585 location_t loc
= gimple_location (stmt
);
2586 bool ignore
= gimple_call_lhs (stmt
) == NULL_TREE
;
2589 /* If SRC and DEST are the same (and not volatile), return DEST. */
2590 if (fcode
== BUILT_IN_STRCPY_CHK
&& operand_equal_p (src
, dest
, 0))
2592 /* Issue -Wrestrict unless the pointers are null (those do
2593 not point to objects and so do not indicate an overlap;
2594 such calls could be the result of sanitization and jump
2596 if (!integer_zerop (dest
) && !gimple_no_warning_p (stmt
))
2598 tree func
= gimple_call_fndecl (stmt
);
2600 warning_at (loc
, OPT_Wrestrict
,
2601 "%qD source argument is the same as destination",
2605 replace_call_with_value (gsi
, dest
);
2609 if (! tree_fits_uhwi_p (size
))
2612 tree maxlen
= get_maxval_strlen (src
, 1);
2613 if (! integer_all_onesp (size
))
2615 len
= c_strlen (src
, 1);
2616 if (! len
|| ! tree_fits_uhwi_p (len
))
2618 /* If LEN is not constant, try MAXLEN too.
2619 For MAXLEN only allow optimizing into non-_ocs function
2620 if SIZE is >= MAXLEN, never convert to __ocs_fail (). */
2621 if (maxlen
== NULL_TREE
|| ! tree_fits_uhwi_p (maxlen
))
2623 if (fcode
== BUILT_IN_STPCPY_CHK
)
2628 /* If return value of __stpcpy_chk is ignored,
2629 optimize into __strcpy_chk. */
2630 fn
= builtin_decl_explicit (BUILT_IN_STRCPY_CHK
);
2634 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, size
);
2635 replace_call_with_call_and_fold (gsi
, repl
);
2639 if (! len
|| TREE_SIDE_EFFECTS (len
))
2642 /* If c_strlen returned something, but not a constant,
2643 transform __strcpy_chk into __memcpy_chk. */
2644 fn
= builtin_decl_explicit (BUILT_IN_MEMCPY_CHK
);
2648 gimple_seq stmts
= NULL
;
2649 len
= gimple_convert (&stmts
, loc
, size_type_node
, len
);
2650 len
= gimple_build (&stmts
, loc
, PLUS_EXPR
, size_type_node
, len
,
2651 build_int_cst (size_type_node
, 1));
2652 gsi_insert_seq_before (gsi
, stmts
, GSI_SAME_STMT
);
2653 gimple
*repl
= gimple_build_call (fn
, 4, dest
, src
, len
, size
);
2654 replace_call_with_call_and_fold (gsi
, repl
);
2661 if (! tree_int_cst_lt (maxlen
, size
))
2665 /* If __builtin_st{r,p}cpy_chk is used, assume st{r,p}cpy is available. */
2666 fn
= builtin_decl_explicit (fcode
== BUILT_IN_STPCPY_CHK
2667 ? BUILT_IN_STPCPY
: BUILT_IN_STRCPY
);
2671 gimple
*repl
= gimple_build_call (fn
, 2, dest
, src
);
2672 replace_call_with_call_and_fold (gsi
, repl
);
2676 /* Fold a call to the __st{r,p}ncpy_chk builtin. DEST, SRC, LEN, and SIZE
2677 are the arguments to the call. If MAXLEN is not NULL, it is maximum
2678 length passed as third argument. IGNORE is true if return value can be
2679 ignored. FCODE is the BUILT_IN_* code of the builtin. */
2682 gimple_fold_builtin_stxncpy_chk (gimple_stmt_iterator
*gsi
,
2683 tree dest
, tree src
,
2684 tree len
, tree size
,
2685 enum built_in_function fcode
)
2687 gimple
*stmt
= gsi_stmt (*gsi
);
2688 bool ignore
= gimple_call_lhs (stmt
) == NULL_TREE
;
2691 if (fcode
== BUILT_IN_STPNCPY_CHK
&& ignore
)
2693 /* If return value of __stpncpy_chk is ignored,
2694 optimize into __strncpy_chk. */
2695 fn
= builtin_decl_explicit (BUILT_IN_STRNCPY_CHK
);
2698 gimple
*repl
= gimple_build_call (fn
, 4, dest
, src
, len
, size
);
2699 replace_call_with_call_and_fold (gsi
, repl
);
2704 if (! tree_fits_uhwi_p (size
))
2707 tree maxlen
= get_maxval_strlen (len
, 2);
2708 if (! integer_all_onesp (size
))
2710 if (! tree_fits_uhwi_p (len
))
2712 /* If LEN is not constant, try MAXLEN too.
2713 For MAXLEN only allow optimizing into non-_ocs function
2714 if SIZE is >= MAXLEN, never convert to __ocs_fail (). */
2715 if (maxlen
== NULL_TREE
|| ! tree_fits_uhwi_p (maxlen
))
2721 if (tree_int_cst_lt (size
, maxlen
))
2725 /* If __builtin_st{r,p}ncpy_chk is used, assume st{r,p}ncpy is available. */
2726 fn
= builtin_decl_explicit (fcode
== BUILT_IN_STPNCPY_CHK
2727 ? BUILT_IN_STPNCPY
: BUILT_IN_STRNCPY
);
2731 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, len
);
2732 replace_call_with_call_and_fold (gsi
, repl
);
2736 /* Fold function call to builtin stpcpy with arguments DEST and SRC.
2737 Return NULL_TREE if no simplification can be made. */
2740 gimple_fold_builtin_stpcpy (gimple_stmt_iterator
*gsi
)
2742 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
2743 location_t loc
= gimple_location (stmt
);
2744 tree dest
= gimple_call_arg (stmt
, 0);
2745 tree src
= gimple_call_arg (stmt
, 1);
2746 tree fn
, len
, lenp1
;
2748 /* If the result is unused, replace stpcpy with strcpy. */
2749 if (gimple_call_lhs (stmt
) == NULL_TREE
)
2751 tree fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
2754 gimple_call_set_fndecl (stmt
, fn
);
2759 len
= c_strlen (src
, 1);
2761 || TREE_CODE (len
) != INTEGER_CST
)
2764 if (optimize_function_for_size_p (cfun
)
2765 /* If length is zero it's small enough. */
2766 && !integer_zerop (len
))
2769 /* If the source has a known length replace stpcpy with memcpy. */
2770 fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
2774 gimple_seq stmts
= NULL
;
2775 tree tem
= gimple_convert (&stmts
, loc
, size_type_node
, len
);
2776 lenp1
= gimple_build (&stmts
, loc
, PLUS_EXPR
, size_type_node
,
2777 tem
, build_int_cst (size_type_node
, 1));
2778 gsi_insert_seq_before (gsi
, stmts
, GSI_SAME_STMT
);
2779 gcall
*repl
= gimple_build_call (fn
, 3, dest
, src
, lenp1
);
2780 gimple_set_vuse (repl
, gimple_vuse (stmt
));
2781 gimple_set_vdef (repl
, gimple_vdef (stmt
));
2782 if (gimple_vdef (repl
)
2783 && TREE_CODE (gimple_vdef (repl
)) == SSA_NAME
)
2784 SSA_NAME_DEF_STMT (gimple_vdef (repl
)) = repl
;
2785 gsi_insert_before (gsi
, repl
, GSI_SAME_STMT
);
2786 /* Replace the result with dest + len. */
2788 tem
= gimple_convert (&stmts
, loc
, sizetype
, len
);
2789 gsi_insert_seq_before (gsi
, stmts
, GSI_SAME_STMT
);
2790 gassign
*ret
= gimple_build_assign (gimple_call_lhs (stmt
),
2791 POINTER_PLUS_EXPR
, dest
, tem
);
2792 gsi_replace (gsi
, ret
, false);
2793 /* Finally fold the memcpy call. */
2794 gimple_stmt_iterator gsi2
= *gsi
;
2800 /* Fold a call EXP to {,v}snprintf having NARGS passed as ARGS. Return
2801 NULL_TREE if a normal call should be emitted rather than expanding
2802 the function inline. FCODE is either BUILT_IN_SNPRINTF_CHK or
2803 BUILT_IN_VSNPRINTF_CHK. If MAXLEN is not NULL, it is maximum length
2804 passed as second argument. */
2807 gimple_fold_builtin_snprintf_chk (gimple_stmt_iterator
*gsi
,
2808 enum built_in_function fcode
)
2810 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
2811 tree dest
, size
, len
, fn
, fmt
, flag
;
2812 const char *fmt_str
;
2814 /* Verify the required arguments in the original call. */
2815 if (gimple_call_num_args (stmt
) < 5)
2818 dest
= gimple_call_arg (stmt
, 0);
2819 len
= gimple_call_arg (stmt
, 1);
2820 flag
= gimple_call_arg (stmt
, 2);
2821 size
= gimple_call_arg (stmt
, 3);
2822 fmt
= gimple_call_arg (stmt
, 4);
2824 if (! tree_fits_uhwi_p (size
))
2827 if (! integer_all_onesp (size
))
2829 tree maxlen
= get_maxval_strlen (len
, 2);
2830 if (! tree_fits_uhwi_p (len
))
2832 /* If LEN is not constant, try MAXLEN too.
2833 For MAXLEN only allow optimizing into non-_ocs function
2834 if SIZE is >= MAXLEN, never convert to __ocs_fail (). */
2835 if (maxlen
== NULL_TREE
|| ! tree_fits_uhwi_p (maxlen
))
2841 if (tree_int_cst_lt (size
, maxlen
))
2845 if (!init_target_chars ())
2848 /* Only convert __{,v}snprintf_chk to {,v}snprintf if flag is 0
2849 or if format doesn't contain % chars or is "%s". */
2850 if (! integer_zerop (flag
))
2852 fmt_str
= c_getstr (fmt
);
2853 if (fmt_str
== NULL
)
2855 if (strchr (fmt_str
, target_percent
) != NULL
2856 && strcmp (fmt_str
, target_percent_s
))
2860 /* If __builtin_{,v}snprintf_chk is used, assume {,v}snprintf is
2862 fn
= builtin_decl_explicit (fcode
== BUILT_IN_VSNPRINTF_CHK
2863 ? BUILT_IN_VSNPRINTF
: BUILT_IN_SNPRINTF
);
2867 /* Replace the called function and the first 5 argument by 3 retaining
2868 trailing varargs. */
2869 gimple_call_set_fndecl (stmt
, fn
);
2870 gimple_call_set_fntype (stmt
, TREE_TYPE (fn
));
2871 gimple_call_set_arg (stmt
, 0, dest
);
2872 gimple_call_set_arg (stmt
, 1, len
);
2873 gimple_call_set_arg (stmt
, 2, fmt
);
2874 for (unsigned i
= 3; i
< gimple_call_num_args (stmt
) - 2; ++i
)
2875 gimple_call_set_arg (stmt
, i
, gimple_call_arg (stmt
, i
+ 2));
2876 gimple_set_num_ops (stmt
, gimple_num_ops (stmt
) - 2);
2881 /* Fold a call EXP to __{,v}sprintf_chk having NARGS passed as ARGS.
2882 Return NULL_TREE if a normal call should be emitted rather than
2883 expanding the function inline. FCODE is either BUILT_IN_SPRINTF_CHK
2884 or BUILT_IN_VSPRINTF_CHK. */
2887 gimple_fold_builtin_sprintf_chk (gimple_stmt_iterator
*gsi
,
2888 enum built_in_function fcode
)
2890 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
2891 tree dest
, size
, len
, fn
, fmt
, flag
;
2892 const char *fmt_str
;
2893 unsigned nargs
= gimple_call_num_args (stmt
);
2895 /* Verify the required arguments in the original call. */
2898 dest
= gimple_call_arg (stmt
, 0);
2899 flag
= gimple_call_arg (stmt
, 1);
2900 size
= gimple_call_arg (stmt
, 2);
2901 fmt
= gimple_call_arg (stmt
, 3);
2903 if (! tree_fits_uhwi_p (size
))
2908 if (!init_target_chars ())
2911 /* Check whether the format is a literal string constant. */
2912 fmt_str
= c_getstr (fmt
);
2913 if (fmt_str
!= NULL
)
2915 /* If the format doesn't contain % args or %%, we know the size. */
2916 if (strchr (fmt_str
, target_percent
) == 0)
2918 if (fcode
!= BUILT_IN_SPRINTF_CHK
|| nargs
== 4)
2919 len
= build_int_cstu (size_type_node
, strlen (fmt_str
));
2921 /* If the format is "%s" and first ... argument is a string literal,
2922 we know the size too. */
2923 else if (fcode
== BUILT_IN_SPRINTF_CHK
2924 && strcmp (fmt_str
, target_percent_s
) == 0)
2930 arg
= gimple_call_arg (stmt
, 4);
2931 if (POINTER_TYPE_P (TREE_TYPE (arg
)))
2933 len
= c_strlen (arg
, 1);
2934 if (! len
|| ! tree_fits_uhwi_p (len
))
2941 if (! integer_all_onesp (size
))
2943 if (! len
|| ! tree_int_cst_lt (len
, size
))
2947 /* Only convert __{,v}sprintf_chk to {,v}sprintf if flag is 0
2948 or if format doesn't contain % chars or is "%s". */
2949 if (! integer_zerop (flag
))
2951 if (fmt_str
== NULL
)
2953 if (strchr (fmt_str
, target_percent
) != NULL
2954 && strcmp (fmt_str
, target_percent_s
))
2958 /* If __builtin_{,v}sprintf_chk is used, assume {,v}sprintf is available. */
2959 fn
= builtin_decl_explicit (fcode
== BUILT_IN_VSPRINTF_CHK
2960 ? BUILT_IN_VSPRINTF
: BUILT_IN_SPRINTF
);
2964 /* Replace the called function and the first 4 argument by 2 retaining
2965 trailing varargs. */
2966 gimple_call_set_fndecl (stmt
, fn
);
2967 gimple_call_set_fntype (stmt
, TREE_TYPE (fn
));
2968 gimple_call_set_arg (stmt
, 0, dest
);
2969 gimple_call_set_arg (stmt
, 1, fmt
);
2970 for (unsigned i
= 2; i
< gimple_call_num_args (stmt
) - 2; ++i
)
2971 gimple_call_set_arg (stmt
, i
, gimple_call_arg (stmt
, i
+ 2));
2972 gimple_set_num_ops (stmt
, gimple_num_ops (stmt
) - 2);
2977 /* Simplify a call to the sprintf builtin with arguments DEST, FMT, and ORIG.
2978 ORIG may be null if this is a 2-argument call. We don't attempt to
2979 simplify calls with more than 3 arguments.
2981 Return true if simplification was possible, otherwise false. */
2984 gimple_fold_builtin_sprintf (gimple_stmt_iterator
*gsi
)
2986 gimple
*stmt
= gsi_stmt (*gsi
);
2987 tree dest
= gimple_call_arg (stmt
, 0);
2988 tree fmt
= gimple_call_arg (stmt
, 1);
2989 tree orig
= NULL_TREE
;
2990 const char *fmt_str
= NULL
;
2992 /* Verify the required arguments in the original call. We deal with two
2993 types of sprintf() calls: 'sprintf (str, fmt)' and
2994 'sprintf (dest, "%s", orig)'. */
2995 if (gimple_call_num_args (stmt
) > 3)
2998 if (gimple_call_num_args (stmt
) == 3)
2999 orig
= gimple_call_arg (stmt
, 2);
3001 /* Check whether the format is a literal string constant. */
3002 fmt_str
= c_getstr (fmt
);
3003 if (fmt_str
== NULL
)
3006 if (!init_target_chars ())
3009 /* If the format doesn't contain % args or %%, use strcpy. */
3010 if (strchr (fmt_str
, target_percent
) == NULL
)
3012 tree fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
3017 /* Don't optimize sprintf (buf, "abc", ptr++). */
3021 /* Convert sprintf (str, fmt) into strcpy (str, fmt) when
3022 'format' is known to contain no % formats. */
3023 gimple_seq stmts
= NULL
;
3024 gimple
*repl
= gimple_build_call (fn
, 2, dest
, fmt
);
3025 gimple_seq_add_stmt_without_update (&stmts
, repl
);
3026 if (gimple_call_lhs (stmt
))
3028 repl
= gimple_build_assign (gimple_call_lhs (stmt
),
3029 build_int_cst (integer_type_node
,
3031 gimple_seq_add_stmt_without_update (&stmts
, repl
);
3032 gsi_replace_with_seq_vops (gsi
, stmts
);
3033 /* gsi now points at the assignment to the lhs, get a
3034 stmt iterator to the memcpy call.
3035 ??? We can't use gsi_for_stmt as that doesn't work when the
3036 CFG isn't built yet. */
3037 gimple_stmt_iterator gsi2
= *gsi
;
3043 gsi_replace_with_seq_vops (gsi
, stmts
);
3049 /* If the format is "%s", use strcpy if the result isn't used. */
3050 else if (fmt_str
&& strcmp (fmt_str
, target_percent_s
) == 0)
3053 fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
3058 /* Don't crash on sprintf (str1, "%s"). */
3062 tree orig_len
= NULL_TREE
;
3063 if (gimple_call_lhs (stmt
))
3065 orig_len
= get_maxval_strlen (orig
, 0);
3070 /* Convert sprintf (str1, "%s", str2) into strcpy (str1, str2). */
3071 gimple_seq stmts
= NULL
;
3072 gimple
*repl
= gimple_build_call (fn
, 2, dest
, orig
);
3073 gimple_seq_add_stmt_without_update (&stmts
, repl
);
3074 if (gimple_call_lhs (stmt
))
3076 if (!useless_type_conversion_p (integer_type_node
,
3077 TREE_TYPE (orig_len
)))
3078 orig_len
= fold_convert (integer_type_node
, orig_len
);
3079 repl
= gimple_build_assign (gimple_call_lhs (stmt
), orig_len
);
3080 gimple_seq_add_stmt_without_update (&stmts
, repl
);
3081 gsi_replace_with_seq_vops (gsi
, stmts
);
3082 /* gsi now points at the assignment to the lhs, get a
3083 stmt iterator to the memcpy call.
3084 ??? We can't use gsi_for_stmt as that doesn't work when the
3085 CFG isn't built yet. */
3086 gimple_stmt_iterator gsi2
= *gsi
;
3092 gsi_replace_with_seq_vops (gsi
, stmts
);
3100 /* Simplify a call to the snprintf builtin with arguments DEST, DESTSIZE,
3101 FMT, and ORIG. ORIG may be null if this is a 3-argument call. We don't
3102 attempt to simplify calls with more than 4 arguments.
3104 Return true if simplification was possible, otherwise false. */
3107 gimple_fold_builtin_snprintf (gimple_stmt_iterator
*gsi
)
3109 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
3110 tree dest
= gimple_call_arg (stmt
, 0);
3111 tree destsize
= gimple_call_arg (stmt
, 1);
3112 tree fmt
= gimple_call_arg (stmt
, 2);
3113 tree orig
= NULL_TREE
;
3114 const char *fmt_str
= NULL
;
3116 if (gimple_call_num_args (stmt
) > 4)
3119 if (gimple_call_num_args (stmt
) == 4)
3120 orig
= gimple_call_arg (stmt
, 3);
3122 if (!tree_fits_uhwi_p (destsize
))
3124 unsigned HOST_WIDE_INT destlen
= tree_to_uhwi (destsize
);
3126 /* Check whether the format is a literal string constant. */
3127 fmt_str
= c_getstr (fmt
);
3128 if (fmt_str
== NULL
)
3131 if (!init_target_chars ())
3134 /* If the format doesn't contain % args or %%, use strcpy. */
3135 if (strchr (fmt_str
, target_percent
) == NULL
)
3137 tree fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
3141 /* Don't optimize snprintf (buf, 4, "abc", ptr++). */
3145 /* We could expand this as
3146 memcpy (str, fmt, cst - 1); str[cst - 1] = '\0';
3148 memcpy (str, fmt_with_nul_at_cstm1, cst);
3149 but in the former case that might increase code size
3150 and in the latter case grow .rodata section too much.
3152 size_t len
= strlen (fmt_str
);
3156 gimple_seq stmts
= NULL
;
3157 gimple
*repl
= gimple_build_call (fn
, 2, dest
, fmt
);
3158 gimple_seq_add_stmt_without_update (&stmts
, repl
);
3159 if (gimple_call_lhs (stmt
))
3161 repl
= gimple_build_assign (gimple_call_lhs (stmt
),
3162 build_int_cst (integer_type_node
, len
));
3163 gimple_seq_add_stmt_without_update (&stmts
, repl
);
3164 gsi_replace_with_seq_vops (gsi
, stmts
);
3165 /* gsi now points at the assignment to the lhs, get a
3166 stmt iterator to the memcpy call.
3167 ??? We can't use gsi_for_stmt as that doesn't work when the
3168 CFG isn't built yet. */
3169 gimple_stmt_iterator gsi2
= *gsi
;
3175 gsi_replace_with_seq_vops (gsi
, stmts
);
3181 /* If the format is "%s", use strcpy if the result isn't used. */
3182 else if (fmt_str
&& strcmp (fmt_str
, target_percent_s
) == 0)
3184 tree fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
3188 /* Don't crash on snprintf (str1, cst, "%s"). */
3192 tree orig_len
= get_maxval_strlen (orig
, 0);
3193 if (!orig_len
|| TREE_CODE (orig_len
) != INTEGER_CST
)
3196 /* We could expand this as
3197 memcpy (str1, str2, cst - 1); str1[cst - 1] = '\0';
3199 memcpy (str1, str2_with_nul_at_cstm1, cst);
3200 but in the former case that might increase code size
3201 and in the latter case grow .rodata section too much.
3203 if (compare_tree_int (orig_len
, destlen
) >= 0)
3206 /* Convert snprintf (str1, cst, "%s", str2) into
3207 strcpy (str1, str2) if strlen (str2) < cst. */
3208 gimple_seq stmts
= NULL
;
3209 gimple
*repl
= gimple_build_call (fn
, 2, dest
, orig
);
3210 gimple_seq_add_stmt_without_update (&stmts
, repl
);
3211 if (gimple_call_lhs (stmt
))
3213 if (!useless_type_conversion_p (integer_type_node
,
3214 TREE_TYPE (orig_len
)))
3215 orig_len
= fold_convert (integer_type_node
, orig_len
);
3216 repl
= gimple_build_assign (gimple_call_lhs (stmt
), orig_len
);
3217 gimple_seq_add_stmt_without_update (&stmts
, repl
);
3218 gsi_replace_with_seq_vops (gsi
, stmts
);
3219 /* gsi now points at the assignment to the lhs, get a
3220 stmt iterator to the memcpy call.
3221 ??? We can't use gsi_for_stmt as that doesn't work when the
3222 CFG isn't built yet. */
3223 gimple_stmt_iterator gsi2
= *gsi
;
3229 gsi_replace_with_seq_vops (gsi
, stmts
);
3237 /* Fold a call to the {,v}fprintf{,_unlocked} and __{,v}printf_chk builtins.
3238 FP, FMT, and ARG are the arguments to the call. We don't fold calls with
3239 more than 3 arguments, and ARG may be null in the 2-argument case.
3241 Return NULL_TREE if no simplification was possible, otherwise return the
3242 simplified form of the call as a tree. FCODE is the BUILT_IN_*
3243 code of the function to be simplified. */
3246 gimple_fold_builtin_fprintf (gimple_stmt_iterator
*gsi
,
3247 tree fp
, tree fmt
, tree arg
,
3248 enum built_in_function fcode
)
3250 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
3251 tree fn_fputc
, fn_fputs
;
3252 const char *fmt_str
= NULL
;
3254 /* If the return value is used, don't do the transformation. */
3255 if (gimple_call_lhs (stmt
) != NULL_TREE
)
3258 /* Check whether the format is a literal string constant. */
3259 fmt_str
= c_getstr (fmt
);
3260 if (fmt_str
== NULL
)
3263 if (fcode
== BUILT_IN_FPRINTF_UNLOCKED
)
3265 /* If we're using an unlocked function, assume the other
3266 unlocked functions exist explicitly. */
3267 fn_fputc
= builtin_decl_explicit (BUILT_IN_FPUTC_UNLOCKED
);
3268 fn_fputs
= builtin_decl_explicit (BUILT_IN_FPUTS_UNLOCKED
);
3272 fn_fputc
= builtin_decl_implicit (BUILT_IN_FPUTC
);
3273 fn_fputs
= builtin_decl_implicit (BUILT_IN_FPUTS
);
3276 if (!init_target_chars ())
3279 /* If the format doesn't contain % args or %%, use strcpy. */
3280 if (strchr (fmt_str
, target_percent
) == NULL
)
3282 if (fcode
!= BUILT_IN_VFPRINTF
&& fcode
!= BUILT_IN_VFPRINTF_CHK
3286 /* If the format specifier was "", fprintf does nothing. */
3287 if (fmt_str
[0] == '\0')
3289 replace_call_with_value (gsi
, NULL_TREE
);
3293 /* When "string" doesn't contain %, replace all cases of
3294 fprintf (fp, string) with fputs (string, fp). The fputs
3295 builtin will take care of special cases like length == 1. */
3298 gcall
*repl
= gimple_build_call (fn_fputs
, 2, fmt
, fp
);
3299 replace_call_with_call_and_fold (gsi
, repl
);
3304 /* The other optimizations can be done only on the non-va_list variants. */
3305 else if (fcode
== BUILT_IN_VFPRINTF
|| fcode
== BUILT_IN_VFPRINTF_CHK
)
3308 /* If the format specifier was "%s", call __builtin_fputs (arg, fp). */
3309 else if (strcmp (fmt_str
, target_percent_s
) == 0)
3311 if (!arg
|| ! POINTER_TYPE_P (TREE_TYPE (arg
)))
3315 gcall
*repl
= gimple_build_call (fn_fputs
, 2, arg
, fp
);
3316 replace_call_with_call_and_fold (gsi
, repl
);
3321 /* If the format specifier was "%c", call __builtin_fputc (arg, fp). */
3322 else if (strcmp (fmt_str
, target_percent_c
) == 0)
3325 || ! useless_type_conversion_p (integer_type_node
, TREE_TYPE (arg
)))
3329 gcall
*repl
= gimple_build_call (fn_fputc
, 2, arg
, fp
);
3330 replace_call_with_call_and_fold (gsi
, repl
);
3338 /* Fold a call to the {,v}printf{,_unlocked} and __{,v}printf_chk builtins.
3339 FMT and ARG are the arguments to the call; we don't fold cases with
3340 more than 2 arguments, and ARG may be null if this is a 1-argument case.
3342 Return NULL_TREE if no simplification was possible, otherwise return the
3343 simplified form of the call as a tree. FCODE is the BUILT_IN_*
3344 code of the function to be simplified. */
3347 gimple_fold_builtin_printf (gimple_stmt_iterator
*gsi
, tree fmt
,
3348 tree arg
, enum built_in_function fcode
)
3350 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
3351 tree fn_putchar
, fn_puts
, newarg
;
3352 const char *fmt_str
= NULL
;
3354 /* If the return value is used, don't do the transformation. */
3355 if (gimple_call_lhs (stmt
) != NULL_TREE
)
3358 /* Check whether the format is a literal string constant. */
3359 fmt_str
= c_getstr (fmt
);
3360 if (fmt_str
== NULL
)
3363 if (fcode
== BUILT_IN_PRINTF_UNLOCKED
)
3365 /* If we're using an unlocked function, assume the other
3366 unlocked functions exist explicitly. */
3367 fn_putchar
= builtin_decl_explicit (BUILT_IN_PUTCHAR_UNLOCKED
);
3368 fn_puts
= builtin_decl_explicit (BUILT_IN_PUTS_UNLOCKED
);
3372 fn_putchar
= builtin_decl_implicit (BUILT_IN_PUTCHAR
);
3373 fn_puts
= builtin_decl_implicit (BUILT_IN_PUTS
);
3376 if (!init_target_chars ())
3379 if (strcmp (fmt_str
, target_percent_s
) == 0
3380 || strchr (fmt_str
, target_percent
) == NULL
)
3384 if (strcmp (fmt_str
, target_percent_s
) == 0)
3386 if (fcode
== BUILT_IN_VPRINTF
|| fcode
== BUILT_IN_VPRINTF_CHK
)
3389 if (!arg
|| ! POINTER_TYPE_P (TREE_TYPE (arg
)))
3392 str
= c_getstr (arg
);
3398 /* The format specifier doesn't contain any '%' characters. */
3399 if (fcode
!= BUILT_IN_VPRINTF
&& fcode
!= BUILT_IN_VPRINTF_CHK
3405 /* If the string was "", printf does nothing. */
3408 replace_call_with_value (gsi
, NULL_TREE
);
3412 /* If the string has length of 1, call putchar. */
3415 /* Given printf("c"), (where c is any one character,)
3416 convert "c"[0] to an int and pass that to the replacement
3418 newarg
= build_int_cst (integer_type_node
, str
[0]);
3421 gcall
*repl
= gimple_build_call (fn_putchar
, 1, newarg
);
3422 replace_call_with_call_and_fold (gsi
, repl
);
3428 /* If the string was "string\n", call puts("string"). */
3429 size_t len
= strlen (str
);
3430 if ((unsigned char)str
[len
- 1] == target_newline
3431 && (size_t) (int) len
== len
3435 tree offset_node
, string_cst
;
3437 /* Create a NUL-terminated string that's one char shorter
3438 than the original, stripping off the trailing '\n'. */
3439 newarg
= build_string_literal (len
, str
);
3440 string_cst
= string_constant (newarg
, &offset_node
);
3441 gcc_checking_assert (string_cst
3442 && (TREE_STRING_LENGTH (string_cst
)
3444 && integer_zerop (offset_node
)
3446 TREE_STRING_POINTER (string_cst
)[len
- 1]
3448 /* build_string_literal creates a new STRING_CST,
3449 modify it in place to avoid double copying. */
3450 newstr
= CONST_CAST (char *, TREE_STRING_POINTER (string_cst
));
3451 newstr
[len
- 1] = '\0';
3454 gcall
*repl
= gimple_build_call (fn_puts
, 1, newarg
);
3455 replace_call_with_call_and_fold (gsi
, repl
);
3460 /* We'd like to arrange to call fputs(string,stdout) here,
3461 but we need stdout and don't have a way to get it yet. */
3466 /* The other optimizations can be done only on the non-va_list variants. */
3467 else if (fcode
== BUILT_IN_VPRINTF
|| fcode
== BUILT_IN_VPRINTF_CHK
)
3470 /* If the format specifier was "%s\n", call __builtin_puts(arg). */
3471 else if (strcmp (fmt_str
, target_percent_s_newline
) == 0)
3473 if (!arg
|| ! POINTER_TYPE_P (TREE_TYPE (arg
)))
3477 gcall
*repl
= gimple_build_call (fn_puts
, 1, arg
);
3478 replace_call_with_call_and_fold (gsi
, repl
);
3483 /* If the format specifier was "%c", call __builtin_putchar(arg). */
3484 else if (strcmp (fmt_str
, target_percent_c
) == 0)
3486 if (!arg
|| ! useless_type_conversion_p (integer_type_node
,
3491 gcall
*repl
= gimple_build_call (fn_putchar
, 1, arg
);
3492 replace_call_with_call_and_fold (gsi
, repl
);
3502 /* Fold a call to __builtin_strlen with known length LEN. */
3505 gimple_fold_builtin_strlen (gimple_stmt_iterator
*gsi
)
3507 gimple
*stmt
= gsi_stmt (*gsi
);
3513 if (!get_range_strlen (gimple_call_arg (stmt
, 0), lenrange
, true)
3514 && lenrange
[0] && TREE_CODE (lenrange
[0]) == INTEGER_CST
3515 && lenrange
[1] && TREE_CODE (lenrange
[1]) == INTEGER_CST
)
3517 /* The range of lengths refers to either a single constant
3518 string or to the longest and shortest constant string
3519 referenced by the argument of the strlen() call, or to
3520 the strings that can possibly be stored in the arrays
3521 the argument refers to. */
3522 minlen
= wi::to_wide (lenrange
[0]);
3523 maxlen
= wi::to_wide (lenrange
[1]);
3527 unsigned prec
= TYPE_PRECISION (sizetype
);
3529 minlen
= wi::shwi (0, prec
);
3530 maxlen
= wi::to_wide (max_object_size (), prec
) - 2;
3533 if (minlen
== maxlen
)
3535 lenrange
[0] = force_gimple_operand_gsi (gsi
, lenrange
[0], true, NULL
,
3536 true, GSI_SAME_STMT
);
3537 replace_call_with_value (gsi
, lenrange
[0]);
3541 if (tree lhs
= gimple_call_lhs (stmt
))
3542 if (TREE_CODE (lhs
) == SSA_NAME
3543 && INTEGRAL_TYPE_P (TREE_TYPE (lhs
)))
3544 set_range_info (lhs
, VR_RANGE
, minlen
, maxlen
);
3549 /* Fold a call to __builtin_acc_on_device. */
3552 gimple_fold_builtin_acc_on_device (gimple_stmt_iterator
*gsi
, tree arg0
)
3554 /* Defer folding until we know which compiler we're in. */
3555 if (symtab
->state
!= EXPANSION
)
3558 unsigned val_host
= GOMP_DEVICE_HOST
;
3559 unsigned val_dev
= GOMP_DEVICE_NONE
;
3561 #ifdef ACCEL_COMPILER
3562 val_host
= GOMP_DEVICE_NOT_HOST
;
3563 val_dev
= ACCEL_COMPILER_acc_device
;
3566 location_t loc
= gimple_location (gsi_stmt (*gsi
));
3568 tree host_eq
= make_ssa_name (boolean_type_node
);
3569 gimple
*host_ass
= gimple_build_assign
3570 (host_eq
, EQ_EXPR
, arg0
, build_int_cst (TREE_TYPE (arg0
), val_host
));
3571 gimple_set_location (host_ass
, loc
);
3572 gsi_insert_before (gsi
, host_ass
, GSI_SAME_STMT
);
3574 tree dev_eq
= make_ssa_name (boolean_type_node
);
3575 gimple
*dev_ass
= gimple_build_assign
3576 (dev_eq
, EQ_EXPR
, arg0
, build_int_cst (TREE_TYPE (arg0
), val_dev
));
3577 gimple_set_location (dev_ass
, loc
);
3578 gsi_insert_before (gsi
, dev_ass
, GSI_SAME_STMT
);
3580 tree result
= make_ssa_name (boolean_type_node
);
3581 gimple
*result_ass
= gimple_build_assign
3582 (result
, BIT_IOR_EXPR
, host_eq
, dev_eq
);
3583 gimple_set_location (result_ass
, loc
);
3584 gsi_insert_before (gsi
, result_ass
, GSI_SAME_STMT
);
3586 replace_call_with_value (gsi
, result
);
3591 /* Fold realloc (0, n) -> malloc (n). */
3594 gimple_fold_builtin_realloc (gimple_stmt_iterator
*gsi
)
3596 gimple
*stmt
= gsi_stmt (*gsi
);
3597 tree arg
= gimple_call_arg (stmt
, 0);
3598 tree size
= gimple_call_arg (stmt
, 1);
3600 if (operand_equal_p (arg
, null_pointer_node
, 0))
3602 tree fn_malloc
= builtin_decl_implicit (BUILT_IN_MALLOC
);
3605 gcall
*repl
= gimple_build_call (fn_malloc
, 1, size
);
3606 replace_call_with_call_and_fold (gsi
, repl
);
3613 /* Fold the non-target builtin at *GSI and return whether any simplification
3617 gimple_fold_builtin (gimple_stmt_iterator
*gsi
)
3619 gcall
*stmt
= as_a
<gcall
*>(gsi_stmt (*gsi
));
3620 tree callee
= gimple_call_fndecl (stmt
);
3622 /* Give up for always_inline inline builtins until they are
3624 if (avoid_folding_inline_builtin (callee
))
3627 unsigned n
= gimple_call_num_args (stmt
);
3628 enum built_in_function fcode
= DECL_FUNCTION_CODE (callee
);
3632 return gimple_fold_builtin_bcmp (gsi
);
3633 case BUILT_IN_BCOPY
:
3634 return gimple_fold_builtin_bcopy (gsi
);
3635 case BUILT_IN_BZERO
:
3636 return gimple_fold_builtin_bzero (gsi
);
3638 case BUILT_IN_MEMSET
:
3639 return gimple_fold_builtin_memset (gsi
,
3640 gimple_call_arg (stmt
, 1),
3641 gimple_call_arg (stmt
, 2));
3642 case BUILT_IN_MEMCPY
:
3643 return gimple_fold_builtin_memory_op (gsi
, gimple_call_arg (stmt
, 0),
3644 gimple_call_arg (stmt
, 1), 0);
3645 case BUILT_IN_MEMPCPY
:
3646 return gimple_fold_builtin_memory_op (gsi
, gimple_call_arg (stmt
, 0),
3647 gimple_call_arg (stmt
, 1), 1);
3648 case BUILT_IN_MEMMOVE
:
3649 return gimple_fold_builtin_memory_op (gsi
, gimple_call_arg (stmt
, 0),
3650 gimple_call_arg (stmt
, 1), 3);
3651 case BUILT_IN_SPRINTF_CHK
:
3652 case BUILT_IN_VSPRINTF_CHK
:
3653 return gimple_fold_builtin_sprintf_chk (gsi
, fcode
);
3654 case BUILT_IN_STRCAT_CHK
:
3655 return gimple_fold_builtin_strcat_chk (gsi
);
3656 case BUILT_IN_STRNCAT_CHK
:
3657 return gimple_fold_builtin_strncat_chk (gsi
);
3658 case BUILT_IN_STRLEN
:
3659 return gimple_fold_builtin_strlen (gsi
);
3660 case BUILT_IN_STRCPY
:
3661 return gimple_fold_builtin_strcpy (gsi
,
3662 gimple_call_arg (stmt
, 0),
3663 gimple_call_arg (stmt
, 1));
3664 case BUILT_IN_STRNCPY
:
3665 return gimple_fold_builtin_strncpy (gsi
,
3666 gimple_call_arg (stmt
, 0),
3667 gimple_call_arg (stmt
, 1),
3668 gimple_call_arg (stmt
, 2));
3669 case BUILT_IN_STRCAT
:
3670 return gimple_fold_builtin_strcat (gsi
, gimple_call_arg (stmt
, 0),
3671 gimple_call_arg (stmt
, 1));
3672 case BUILT_IN_STRNCAT
:
3673 return gimple_fold_builtin_strncat (gsi
);
3674 case BUILT_IN_INDEX
:
3675 case BUILT_IN_STRCHR
:
3676 return gimple_fold_builtin_strchr (gsi
, false);
3677 case BUILT_IN_RINDEX
:
3678 case BUILT_IN_STRRCHR
:
3679 return gimple_fold_builtin_strchr (gsi
, true);
3680 case BUILT_IN_STRSTR
:
3681 return gimple_fold_builtin_strstr (gsi
);
3682 case BUILT_IN_STRCMP
:
3683 case BUILT_IN_STRCMP_EQ
:
3684 case BUILT_IN_STRCASECMP
:
3685 case BUILT_IN_STRNCMP
:
3686 case BUILT_IN_STRNCMP_EQ
:
3687 case BUILT_IN_STRNCASECMP
:
3688 return gimple_fold_builtin_string_compare (gsi
);
3689 case BUILT_IN_MEMCHR
:
3690 return gimple_fold_builtin_memchr (gsi
);
3691 case BUILT_IN_FPUTS
:
3692 return gimple_fold_builtin_fputs (gsi
, gimple_call_arg (stmt
, 0),
3693 gimple_call_arg (stmt
, 1), false);
3694 case BUILT_IN_FPUTS_UNLOCKED
:
3695 return gimple_fold_builtin_fputs (gsi
, gimple_call_arg (stmt
, 0),
3696 gimple_call_arg (stmt
, 1), true);
3697 case BUILT_IN_MEMCPY_CHK
:
3698 case BUILT_IN_MEMPCPY_CHK
:
3699 case BUILT_IN_MEMMOVE_CHK
:
3700 case BUILT_IN_MEMSET_CHK
:
3701 return gimple_fold_builtin_memory_chk (gsi
,
3702 gimple_call_arg (stmt
, 0),
3703 gimple_call_arg (stmt
, 1),
3704 gimple_call_arg (stmt
, 2),
3705 gimple_call_arg (stmt
, 3),
3707 case BUILT_IN_STPCPY
:
3708 return gimple_fold_builtin_stpcpy (gsi
);
3709 case BUILT_IN_STRCPY_CHK
:
3710 case BUILT_IN_STPCPY_CHK
:
3711 return gimple_fold_builtin_stxcpy_chk (gsi
,
3712 gimple_call_arg (stmt
, 0),
3713 gimple_call_arg (stmt
, 1),
3714 gimple_call_arg (stmt
, 2),
3716 case BUILT_IN_STRNCPY_CHK
:
3717 case BUILT_IN_STPNCPY_CHK
:
3718 return gimple_fold_builtin_stxncpy_chk (gsi
,
3719 gimple_call_arg (stmt
, 0),
3720 gimple_call_arg (stmt
, 1),
3721 gimple_call_arg (stmt
, 2),
3722 gimple_call_arg (stmt
, 3),
3724 case BUILT_IN_SNPRINTF_CHK
:
3725 case BUILT_IN_VSNPRINTF_CHK
:
3726 return gimple_fold_builtin_snprintf_chk (gsi
, fcode
);
3728 case BUILT_IN_FPRINTF
:
3729 case BUILT_IN_FPRINTF_UNLOCKED
:
3730 case BUILT_IN_VFPRINTF
:
3731 if (n
== 2 || n
== 3)
3732 return gimple_fold_builtin_fprintf (gsi
,
3733 gimple_call_arg (stmt
, 0),
3734 gimple_call_arg (stmt
, 1),
3736 ? gimple_call_arg (stmt
, 2)
3740 case BUILT_IN_FPRINTF_CHK
:
3741 case BUILT_IN_VFPRINTF_CHK
:
3742 if (n
== 3 || n
== 4)
3743 return gimple_fold_builtin_fprintf (gsi
,
3744 gimple_call_arg (stmt
, 0),
3745 gimple_call_arg (stmt
, 2),
3747 ? gimple_call_arg (stmt
, 3)
3751 case BUILT_IN_PRINTF
:
3752 case BUILT_IN_PRINTF_UNLOCKED
:
3753 case BUILT_IN_VPRINTF
:
3754 if (n
== 1 || n
== 2)
3755 return gimple_fold_builtin_printf (gsi
, gimple_call_arg (stmt
, 0),
3757 ? gimple_call_arg (stmt
, 1)
3758 : NULL_TREE
, fcode
);
3760 case BUILT_IN_PRINTF_CHK
:
3761 case BUILT_IN_VPRINTF_CHK
:
3762 if (n
== 2 || n
== 3)
3763 return gimple_fold_builtin_printf (gsi
, gimple_call_arg (stmt
, 1),
3765 ? gimple_call_arg (stmt
, 2)
3766 : NULL_TREE
, fcode
);
3768 case BUILT_IN_ACC_ON_DEVICE
:
3769 return gimple_fold_builtin_acc_on_device (gsi
,
3770 gimple_call_arg (stmt
, 0));
3771 case BUILT_IN_REALLOC
:
3772 return gimple_fold_builtin_realloc (gsi
);
3777 /* Try the generic builtin folder. */
3778 bool ignore
= (gimple_call_lhs (stmt
) == NULL
);
3779 tree result
= fold_call_stmt (stmt
, ignore
);
3783 STRIP_NOPS (result
);
3785 result
= fold_convert (gimple_call_return_type (stmt
), result
);
3786 if (!update_call_from_tree (gsi
, result
))
3787 gimplify_and_update_call_from_tree (gsi
, result
);
3794 /* Transform IFN_GOACC_DIM_SIZE and IFN_GOACC_DIM_POS internal
3795 function calls to constants, where possible. */
3798 fold_internal_goacc_dim (const gimple
*call
)
3800 int axis
= oacc_get_ifn_dim_arg (call
);
3801 int size
= oacc_get_fn_dim_size (current_function_decl
, axis
);
3802 tree result
= NULL_TREE
;
3803 tree type
= TREE_TYPE (gimple_call_lhs (call
));
3805 switch (gimple_call_internal_fn (call
))
3807 case IFN_GOACC_DIM_POS
:
3808 /* If the size is 1, we know the answer. */
3810 result
= build_int_cst (type
, 0);
3812 case IFN_GOACC_DIM_SIZE
:
3813 /* If the size is not dynamic, we know the answer. */
3815 result
= build_int_cst (type
, size
);
3824 /* Return true if stmt is __atomic_compare_exchange_N call which is suitable
3825 for conversion into ATOMIC_COMPARE_EXCHANGE if the second argument is
3826 &var where var is only addressable because of such calls. */
3829 optimize_atomic_compare_exchange_p (gimple
*stmt
)
3831 if (gimple_call_num_args (stmt
) != 6
3832 || !flag_inline_atomics
3834 || sanitize_flags_p (SANITIZE_THREAD
| SANITIZE_ADDRESS
)
3835 || !gimple_call_builtin_p (stmt
, BUILT_IN_NORMAL
)
3836 || !gimple_vdef (stmt
)
3837 || !gimple_vuse (stmt
))
3840 tree fndecl
= gimple_call_fndecl (stmt
);
3841 switch (DECL_FUNCTION_CODE (fndecl
))
3843 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1
:
3844 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2
:
3845 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4
:
3846 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8
:
3847 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16
:
3853 tree expected
= gimple_call_arg (stmt
, 1);
3854 if (TREE_CODE (expected
) != ADDR_EXPR
3855 || !SSA_VAR_P (TREE_OPERAND (expected
, 0)))
3858 tree etype
= TREE_TYPE (TREE_OPERAND (expected
, 0));
3859 if (!is_gimple_reg_type (etype
)
3860 || !auto_var_in_fn_p (TREE_OPERAND (expected
, 0), current_function_decl
)
3861 || TREE_THIS_VOLATILE (etype
)
3862 || VECTOR_TYPE_P (etype
)
3863 || TREE_CODE (etype
) == COMPLEX_TYPE
3864 /* Don't optimize floating point expected vars, VIEW_CONVERT_EXPRs
3865 might not preserve all the bits. See PR71716. */
3866 || SCALAR_FLOAT_TYPE_P (etype
)
3867 || maybe_ne (TYPE_PRECISION (etype
),
3868 GET_MODE_BITSIZE (TYPE_MODE (etype
))))
3871 tree weak
= gimple_call_arg (stmt
, 3);
3872 if (!integer_zerop (weak
) && !integer_onep (weak
))
3875 tree parmt
= TYPE_ARG_TYPES (TREE_TYPE (fndecl
));
3876 tree itype
= TREE_VALUE (TREE_CHAIN (TREE_CHAIN (parmt
)));
3877 machine_mode mode
= TYPE_MODE (itype
);
3879 if (direct_optab_handler (atomic_compare_and_swap_optab
, mode
)
3881 && optab_handler (sync_compare_and_swap_optab
, mode
) == CODE_FOR_nothing
)
3884 if (maybe_ne (int_size_in_bytes (etype
), GET_MODE_SIZE (mode
)))
3891 r = __atomic_compare_exchange_N (p, &e, d, w, s, f);
3893 _Complex uintN_t t = ATOMIC_COMPARE_EXCHANGE (p, e, d, w * 256 + N, s, f);
3894 i = IMAGPART_EXPR <t>;
3896 e = REALPART_EXPR <t>; */
3899 fold_builtin_atomic_compare_exchange (gimple_stmt_iterator
*gsi
)
3901 gimple
*stmt
= gsi_stmt (*gsi
);
3902 tree fndecl
= gimple_call_fndecl (stmt
);
3903 tree parmt
= TYPE_ARG_TYPES (TREE_TYPE (fndecl
));
3904 tree itype
= TREE_VALUE (TREE_CHAIN (TREE_CHAIN (parmt
)));
3905 tree ctype
= build_complex_type (itype
);
3906 tree expected
= TREE_OPERAND (gimple_call_arg (stmt
, 1), 0);
3907 bool throws
= false;
3909 gimple
*g
= gimple_build_assign (make_ssa_name (TREE_TYPE (expected
)),
3911 gsi_insert_before (gsi
, g
, GSI_SAME_STMT
);
3912 gimple_stmt_iterator gsiret
= gsi_for_stmt (g
);
3913 if (!useless_type_conversion_p (itype
, TREE_TYPE (expected
)))
3915 g
= gimple_build_assign (make_ssa_name (itype
), VIEW_CONVERT_EXPR
,
3916 build1 (VIEW_CONVERT_EXPR
, itype
,
3917 gimple_assign_lhs (g
)));
3918 gsi_insert_before (gsi
, g
, GSI_SAME_STMT
);
3920 int flag
= (integer_onep (gimple_call_arg (stmt
, 3)) ? 256 : 0)
3921 + int_size_in_bytes (itype
);
3922 g
= gimple_build_call_internal (IFN_ATOMIC_COMPARE_EXCHANGE
, 6,
3923 gimple_call_arg (stmt
, 0),
3924 gimple_assign_lhs (g
),
3925 gimple_call_arg (stmt
, 2),
3926 build_int_cst (integer_type_node
, flag
),
3927 gimple_call_arg (stmt
, 4),
3928 gimple_call_arg (stmt
, 5));
3929 tree lhs
= make_ssa_name (ctype
);
3930 gimple_call_set_lhs (g
, lhs
);
3931 gimple_set_vdef (g
, gimple_vdef (stmt
));
3932 gimple_set_vuse (g
, gimple_vuse (stmt
));
3933 SSA_NAME_DEF_STMT (gimple_vdef (g
)) = g
;
3934 tree oldlhs
= gimple_call_lhs (stmt
);
3935 if (stmt_can_throw_internal (stmt
))
3938 e
= find_fallthru_edge (gsi_bb (*gsi
)->succs
);
3940 gimple_call_set_nothrow (as_a
<gcall
*> (g
),
3941 gimple_call_nothrow_p (as_a
<gcall
*> (stmt
)));
3942 gimple_call_set_lhs (stmt
, NULL_TREE
);
3943 gsi_replace (gsi
, g
, true);
3946 g
= gimple_build_assign (make_ssa_name (itype
), IMAGPART_EXPR
,
3947 build1 (IMAGPART_EXPR
, itype
, lhs
));
3950 gsi_insert_on_edge_immediate (e
, g
);
3951 *gsi
= gsi_for_stmt (g
);
3954 gsi_insert_after (gsi
, g
, GSI_NEW_STMT
);
3955 g
= gimple_build_assign (oldlhs
, NOP_EXPR
, gimple_assign_lhs (g
));
3956 gsi_insert_after (gsi
, g
, GSI_NEW_STMT
);
3958 g
= gimple_build_assign (make_ssa_name (itype
), REALPART_EXPR
,
3959 build1 (REALPART_EXPR
, itype
, lhs
));
3960 if (throws
&& oldlhs
== NULL_TREE
)
3962 gsi_insert_on_edge_immediate (e
, g
);
3963 *gsi
= gsi_for_stmt (g
);
3966 gsi_insert_after (gsi
, g
, GSI_NEW_STMT
);
3967 if (!useless_type_conversion_p (TREE_TYPE (expected
), itype
))
3969 g
= gimple_build_assign (make_ssa_name (TREE_TYPE (expected
)),
3971 build1 (VIEW_CONVERT_EXPR
, TREE_TYPE (expected
),
3972 gimple_assign_lhs (g
)));
3973 gsi_insert_after (gsi
, g
, GSI_NEW_STMT
);
3975 g
= gimple_build_assign (expected
, SSA_NAME
, gimple_assign_lhs (g
));
3976 gsi_insert_after (gsi
, g
, GSI_NEW_STMT
);
3980 /* Return true if ARG0 CODE ARG1 in infinite signed precision operation
3981 doesn't fit into TYPE. The test for overflow should be regardless of
3982 -fwrapv, and even for unsigned types. */
3985 arith_overflowed_p (enum tree_code code
, const_tree type
,
3986 const_tree arg0
, const_tree arg1
)
3988 typedef FIXED_WIDE_INT (WIDE_INT_MAX_PRECISION
* 2) widest2_int
;
3989 typedef generic_wide_int
<wi::extended_tree
<WIDE_INT_MAX_PRECISION
* 2> >
3991 widest2_int warg0
= widest2_int_cst (arg0
);
3992 widest2_int warg1
= widest2_int_cst (arg1
);
3996 case PLUS_EXPR
: wres
= wi::add (warg0
, warg1
); break;
3997 case MINUS_EXPR
: wres
= wi::sub (warg0
, warg1
); break;
3998 case MULT_EXPR
: wres
= wi::mul (warg0
, warg1
); break;
3999 default: gcc_unreachable ();
4001 signop sign
= TYPE_SIGN (type
);
4002 if (sign
== UNSIGNED
&& wi::neg_p (wres
))
4004 return wi::min_precision (wres
, sign
) > TYPE_PRECISION (type
);
4007 /* Attempt to fold a call statement referenced by the statement iterator GSI.
4008 The statement may be replaced by another statement, e.g., if the call
4009 simplifies to a constant value. Return true if any changes were made.
4010 It is assumed that the operands have been previously folded. */
4013 gimple_fold_call (gimple_stmt_iterator
*gsi
, bool inplace
)
4015 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
4017 bool changed
= false;
4020 /* Fold *& in call arguments. */
4021 for (i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
4022 if (REFERENCE_CLASS_P (gimple_call_arg (stmt
, i
)))
4024 tree tmp
= maybe_fold_reference (gimple_call_arg (stmt
, i
), false);
4027 gimple_call_set_arg (stmt
, i
, tmp
);
4032 /* Check for virtual calls that became direct calls. */
4033 callee
= gimple_call_fn (stmt
);
4034 if (callee
&& TREE_CODE (callee
) == OBJ_TYPE_REF
)
4036 if (gimple_call_addr_fndecl (OBJ_TYPE_REF_EXPR (callee
)) != NULL_TREE
)
4038 if (dump_file
&& virtual_method_call_p (callee
)
4039 && !possible_polymorphic_call_target_p
4040 (callee
, stmt
, cgraph_node::get (gimple_call_addr_fndecl
4041 (OBJ_TYPE_REF_EXPR (callee
)))))
4044 "Type inheritance inconsistent devirtualization of ");
4045 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
4046 fprintf (dump_file
, " to ");
4047 print_generic_expr (dump_file
, callee
, TDF_SLIM
);
4048 fprintf (dump_file
, "\n");
4051 gimple_call_set_fn (stmt
, OBJ_TYPE_REF_EXPR (callee
));
4054 else if (flag_devirtualize
&& !inplace
&& virtual_method_call_p (callee
))
4057 vec
<cgraph_node
*>targets
4058 = possible_polymorphic_call_targets (callee
, stmt
, &final
);
4059 if (final
&& targets
.length () <= 1 && dbg_cnt (devirt
))
4061 tree lhs
= gimple_call_lhs (stmt
);
4062 if (dump_enabled_p ())
4064 location_t loc
= gimple_location_safe (stmt
);
4065 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS
, loc
,
4066 "folding virtual function call to %s\n",
4067 targets
.length () == 1
4068 ? targets
[0]->name ()
4069 : "__builtin_unreachable");
4071 if (targets
.length () == 1)
4073 tree fndecl
= targets
[0]->decl
;
4074 gimple_call_set_fndecl (stmt
, fndecl
);
4076 /* If changing the call to __cxa_pure_virtual
4077 or similar noreturn function, adjust gimple_call_fntype
4079 if (gimple_call_noreturn_p (stmt
)
4080 && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fndecl
)))
4081 && TYPE_ARG_TYPES (TREE_TYPE (fndecl
))
4082 && (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (fndecl
)))
4084 gimple_call_set_fntype (stmt
, TREE_TYPE (fndecl
));
4085 /* If the call becomes noreturn, remove the lhs. */
4087 && gimple_call_noreturn_p (stmt
)
4088 && (VOID_TYPE_P (TREE_TYPE (gimple_call_fntype (stmt
)))
4089 || should_remove_lhs_p (lhs
)))
4091 if (TREE_CODE (lhs
) == SSA_NAME
)
4093 tree var
= create_tmp_var (TREE_TYPE (lhs
));
4094 tree def
= get_or_create_ssa_default_def (cfun
, var
);
4095 gimple
*new_stmt
= gimple_build_assign (lhs
, def
);
4096 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
4098 gimple_call_set_lhs (stmt
, NULL_TREE
);
4100 maybe_remove_unused_call_args (cfun
, stmt
);
4104 tree fndecl
= builtin_decl_implicit (BUILT_IN_UNREACHABLE
);
4105 gimple
*new_stmt
= gimple_build_call (fndecl
, 0);
4106 gimple_set_location (new_stmt
, gimple_location (stmt
));
4107 /* If the call had a SSA name as lhs morph that into
4108 an uninitialized value. */
4109 if (lhs
&& TREE_CODE (lhs
) == SSA_NAME
)
4111 tree var
= create_tmp_var (TREE_TYPE (lhs
));
4112 SET_SSA_NAME_VAR_OR_IDENTIFIER (lhs
, var
);
4113 SSA_NAME_DEF_STMT (lhs
) = gimple_build_nop ();
4114 set_ssa_default_def (cfun
, var
, lhs
);
4116 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
4117 gimple_set_vdef (new_stmt
, gimple_vdef (stmt
));
4118 gsi_replace (gsi
, new_stmt
, false);
4125 /* Check for indirect calls that became direct calls, and then
4126 no longer require a static chain. */
4127 if (gimple_call_chain (stmt
))
4129 tree fn
= gimple_call_fndecl (stmt
);
4130 if (fn
&& !DECL_STATIC_CHAIN (fn
))
4132 gimple_call_set_chain (stmt
, NULL
);
4137 tree tmp
= maybe_fold_reference (gimple_call_chain (stmt
), false);
4140 gimple_call_set_chain (stmt
, tmp
);
4149 /* Check for builtins that CCP can handle using information not
4150 available in the generic fold routines. */
4151 if (gimple_call_builtin_p (stmt
, BUILT_IN_NORMAL
))
4153 if (gimple_fold_builtin (gsi
))
4156 else if (gimple_call_builtin_p (stmt
, BUILT_IN_MD
))
4158 changed
|= targetm
.gimple_fold_builtin (gsi
);
4160 else if (gimple_call_internal_p (stmt
))
4162 enum tree_code subcode
= ERROR_MARK
;
4163 tree result
= NULL_TREE
;
4164 bool cplx_result
= false;
4165 tree overflow
= NULL_TREE
;
4166 switch (gimple_call_internal_fn (stmt
))
4168 case IFN_BUILTIN_EXPECT
:
4169 result
= fold_builtin_expect (gimple_location (stmt
),
4170 gimple_call_arg (stmt
, 0),
4171 gimple_call_arg (stmt
, 1),
4172 gimple_call_arg (stmt
, 2));
4174 case IFN_UBSAN_OBJECT_SIZE
:
4176 tree offset
= gimple_call_arg (stmt
, 1);
4177 tree objsize
= gimple_call_arg (stmt
, 2);
4178 if (integer_all_onesp (objsize
)
4179 || (TREE_CODE (offset
) == INTEGER_CST
4180 && TREE_CODE (objsize
) == INTEGER_CST
4181 && tree_int_cst_le (offset
, objsize
)))
4183 replace_call_with_value (gsi
, NULL_TREE
);
4189 if (integer_zerop (gimple_call_arg (stmt
, 1)))
4191 replace_call_with_value (gsi
, NULL_TREE
);
4195 case IFN_UBSAN_BOUNDS
:
4197 tree index
= gimple_call_arg (stmt
, 1);
4198 tree bound
= gimple_call_arg (stmt
, 2);
4199 if (TREE_CODE (index
) == INTEGER_CST
4200 && TREE_CODE (bound
) == INTEGER_CST
)
4202 index
= fold_convert (TREE_TYPE (bound
), index
);
4203 if (TREE_CODE (index
) == INTEGER_CST
4204 && tree_int_cst_le (index
, bound
))
4206 replace_call_with_value (gsi
, NULL_TREE
);
4212 case IFN_GOACC_DIM_SIZE
:
4213 case IFN_GOACC_DIM_POS
:
4214 result
= fold_internal_goacc_dim (stmt
);
4216 case IFN_UBSAN_CHECK_ADD
:
4217 subcode
= PLUS_EXPR
;
4219 case IFN_UBSAN_CHECK_SUB
:
4220 subcode
= MINUS_EXPR
;
4222 case IFN_UBSAN_CHECK_MUL
:
4223 subcode
= MULT_EXPR
;
4225 case IFN_ADD_OVERFLOW
:
4226 subcode
= PLUS_EXPR
;
4229 case IFN_SUB_OVERFLOW
:
4230 subcode
= MINUS_EXPR
;
4233 case IFN_MUL_OVERFLOW
:
4234 subcode
= MULT_EXPR
;
4240 if (subcode
!= ERROR_MARK
)
4242 tree arg0
= gimple_call_arg (stmt
, 0);
4243 tree arg1
= gimple_call_arg (stmt
, 1);
4244 tree type
= TREE_TYPE (arg0
);
4247 tree lhs
= gimple_call_lhs (stmt
);
4248 if (lhs
== NULL_TREE
)
4251 type
= TREE_TYPE (TREE_TYPE (lhs
));
4253 if (type
== NULL_TREE
)
4255 /* x = y + 0; x = y - 0; x = y * 0; */
4256 else if (integer_zerop (arg1
))
4257 result
= subcode
== MULT_EXPR
? integer_zero_node
: arg0
;
4258 /* x = 0 + y; x = 0 * y; */
4259 else if (subcode
!= MINUS_EXPR
&& integer_zerop (arg0
))
4260 result
= subcode
== MULT_EXPR
? integer_zero_node
: arg1
;
4262 else if (subcode
== MINUS_EXPR
&& operand_equal_p (arg0
, arg1
, 0))
4263 result
= integer_zero_node
;
4264 /* x = y * 1; x = 1 * y; */
4265 else if (subcode
== MULT_EXPR
&& integer_onep (arg1
))
4267 else if (subcode
== MULT_EXPR
&& integer_onep (arg0
))
4269 else if (TREE_CODE (arg0
) == INTEGER_CST
4270 && TREE_CODE (arg1
) == INTEGER_CST
)
4273 result
= int_const_binop (subcode
, fold_convert (type
, arg0
),
4274 fold_convert (type
, arg1
));
4276 result
= int_const_binop (subcode
, arg0
, arg1
);
4277 if (result
&& arith_overflowed_p (subcode
, type
, arg0
, arg1
))
4280 overflow
= build_one_cst (type
);
4287 if (result
== integer_zero_node
)
4288 result
= build_zero_cst (type
);
4289 else if (cplx_result
&& TREE_TYPE (result
) != type
)
4291 if (TREE_CODE (result
) == INTEGER_CST
)
4293 if (arith_overflowed_p (PLUS_EXPR
, type
, result
,
4295 overflow
= build_one_cst (type
);
4297 else if ((!TYPE_UNSIGNED (TREE_TYPE (result
))
4298 && TYPE_UNSIGNED (type
))
4299 || (TYPE_PRECISION (type
)
4300 < (TYPE_PRECISION (TREE_TYPE (result
))
4301 + (TYPE_UNSIGNED (TREE_TYPE (result
))
4302 && !TYPE_UNSIGNED (type
)))))
4305 result
= fold_convert (type
, result
);
4312 if (TREE_CODE (result
) == INTEGER_CST
&& TREE_OVERFLOW (result
))
4313 result
= drop_tree_overflow (result
);
4316 if (overflow
== NULL_TREE
)
4317 overflow
= build_zero_cst (TREE_TYPE (result
));
4318 tree ctype
= build_complex_type (TREE_TYPE (result
));
4319 if (TREE_CODE (result
) == INTEGER_CST
4320 && TREE_CODE (overflow
) == INTEGER_CST
)
4321 result
= build_complex (ctype
, result
, overflow
);
4323 result
= build2_loc (gimple_location (stmt
), COMPLEX_EXPR
,
4324 ctype
, result
, overflow
);
4326 if (!update_call_from_tree (gsi
, result
))
4327 gimplify_and_update_call_from_tree (gsi
, result
);
4336 /* Return true whether NAME has a use on STMT. */
4339 has_use_on_stmt (tree name
, gimple
*stmt
)
4341 imm_use_iterator iter
;
4342 use_operand_p use_p
;
4343 FOR_EACH_IMM_USE_FAST (use_p
, iter
, name
)
4344 if (USE_STMT (use_p
) == stmt
)
4349 /* Worker for fold_stmt_1 dispatch to pattern based folding with
4352 Replaces *GSI with the simplification result in RCODE and OPS
4353 and the associated statements in *SEQ. Does the replacement
4354 according to INPLACE and returns true if the operation succeeded. */
4357 replace_stmt_with_simplification (gimple_stmt_iterator
*gsi
,
4358 gimple_match_op
*res_op
,
4359 gimple_seq
*seq
, bool inplace
)
4361 gimple
*stmt
= gsi_stmt (*gsi
);
4362 tree
*ops
= res_op
->ops
;
4363 unsigned int num_ops
= res_op
->num_ops
;
4365 /* Play safe and do not allow abnormals to be mentioned in
4366 newly created statements. See also maybe_push_res_to_seq.
4367 As an exception allow such uses if there was a use of the
4368 same SSA name on the old stmt. */
4369 for (unsigned int i
= 0; i
< num_ops
; ++i
)
4370 if (TREE_CODE (ops
[i
]) == SSA_NAME
4371 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops
[i
])
4372 && !has_use_on_stmt (ops
[i
], stmt
))
4375 if (num_ops
> 0 && COMPARISON_CLASS_P (ops
[0]))
4376 for (unsigned int i
= 0; i
< 2; ++i
)
4377 if (TREE_CODE (TREE_OPERAND (ops
[0], i
)) == SSA_NAME
4378 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (ops
[0], i
))
4379 && !has_use_on_stmt (TREE_OPERAND (ops
[0], i
), stmt
))
4382 /* Don't insert new statements when INPLACE is true, even if we could
4383 reuse STMT for the final statement. */
4384 if (inplace
&& !gimple_seq_empty_p (*seq
))
4387 if (gcond
*cond_stmt
= dyn_cast
<gcond
*> (stmt
))
4389 gcc_assert (res_op
->code
.is_tree_code ());
4390 if (TREE_CODE_CLASS ((enum tree_code
) res_op
->code
) == tcc_comparison
4391 /* GIMPLE_CONDs condition may not throw. */
4392 && (!flag_exceptions
4393 || !cfun
->can_throw_non_call_exceptions
4394 || !operation_could_trap_p (res_op
->code
,
4395 FLOAT_TYPE_P (TREE_TYPE (ops
[0])),
4397 gimple_cond_set_condition (cond_stmt
, res_op
->code
, ops
[0], ops
[1]);
4398 else if (res_op
->code
== SSA_NAME
)
4399 gimple_cond_set_condition (cond_stmt
, NE_EXPR
, ops
[0],
4400 build_zero_cst (TREE_TYPE (ops
[0])));
4401 else if (res_op
->code
== INTEGER_CST
)
4403 if (integer_zerop (ops
[0]))
4404 gimple_cond_make_false (cond_stmt
);
4406 gimple_cond_make_true (cond_stmt
);
4410 tree res
= maybe_push_res_to_seq (res_op
, seq
);
4413 gimple_cond_set_condition (cond_stmt
, NE_EXPR
, res
,
4414 build_zero_cst (TREE_TYPE (res
)));
4418 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4420 fprintf (dump_file
, "gimple_simplified to ");
4421 if (!gimple_seq_empty_p (*seq
))
4422 print_gimple_seq (dump_file
, *seq
, 0, TDF_SLIM
);
4423 print_gimple_stmt (dump_file
, gsi_stmt (*gsi
),
4426 gsi_insert_seq_before (gsi
, *seq
, GSI_SAME_STMT
);
4429 else if (is_gimple_assign (stmt
)
4430 && res_op
->code
.is_tree_code ())
4433 || gimple_num_ops (stmt
) > get_gimple_rhs_num_ops (res_op
->code
))
4435 maybe_build_generic_op (res_op
);
4436 gimple_assign_set_rhs_with_ops (gsi
, res_op
->code
,
4437 res_op
->op_or_null (0),
4438 res_op
->op_or_null (1),
4439 res_op
->op_or_null (2));
4440 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4442 fprintf (dump_file
, "gimple_simplified to ");
4443 if (!gimple_seq_empty_p (*seq
))
4444 print_gimple_seq (dump_file
, *seq
, 0, TDF_SLIM
);
4445 print_gimple_stmt (dump_file
, gsi_stmt (*gsi
),
4448 gsi_insert_seq_before (gsi
, *seq
, GSI_SAME_STMT
);
4452 else if (res_op
->code
.is_fn_code ()
4453 && gimple_call_combined_fn (stmt
) == res_op
->code
)
4455 gcc_assert (num_ops
== gimple_call_num_args (stmt
));
4456 for (unsigned int i
= 0; i
< num_ops
; ++i
)
4457 gimple_call_set_arg (stmt
, i
, ops
[i
]);
4458 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4460 fprintf (dump_file
, "gimple_simplified to ");
4461 if (!gimple_seq_empty_p (*seq
))
4462 print_gimple_seq (dump_file
, *seq
, 0, TDF_SLIM
);
4463 print_gimple_stmt (dump_file
, gsi_stmt (*gsi
), 0, TDF_SLIM
);
4465 gsi_insert_seq_before (gsi
, *seq
, GSI_SAME_STMT
);
4470 if (gimple_has_lhs (stmt
))
4472 tree lhs
= gimple_get_lhs (stmt
);
4473 if (!maybe_push_res_to_seq (res_op
, seq
, lhs
))
4475 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4477 fprintf (dump_file
, "gimple_simplified to ");
4478 print_gimple_seq (dump_file
, *seq
, 0, TDF_SLIM
);
4480 gsi_replace_with_seq_vops (gsi
, *seq
);
4490 /* Canonicalize MEM_REFs invariant address operand after propagation. */
4493 maybe_canonicalize_mem_ref_addr (tree
*t
)
4497 if (TREE_CODE (*t
) == ADDR_EXPR
)
4498 t
= &TREE_OPERAND (*t
, 0);
4500 /* The C and C++ frontends use an ARRAY_REF for indexing with their
4501 generic vector extension. The actual vector referenced is
4502 view-converted to an array type for this purpose. If the index
4503 is constant the canonical representation in the middle-end is a
4504 BIT_FIELD_REF so re-write the former to the latter here. */
4505 if (TREE_CODE (*t
) == ARRAY_REF
4506 && TREE_CODE (TREE_OPERAND (*t
, 0)) == VIEW_CONVERT_EXPR
4507 && TREE_CODE (TREE_OPERAND (*t
, 1)) == INTEGER_CST
4508 && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*t
, 0), 0))))
4510 tree vtype
= TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*t
, 0), 0));
4511 if (VECTOR_TYPE_P (vtype
))
4513 tree low
= array_ref_low_bound (*t
);
4514 if (TREE_CODE (low
) == INTEGER_CST
)
4516 if (tree_int_cst_le (low
, TREE_OPERAND (*t
, 1)))
4518 widest_int idx
= wi::sub (wi::to_widest (TREE_OPERAND (*t
, 1)),
4519 wi::to_widest (low
));
4520 idx
= wi::mul (idx
, wi::to_widest
4521 (TYPE_SIZE (TREE_TYPE (*t
))));
4523 = wi::add (idx
, wi::to_widest (TYPE_SIZE (TREE_TYPE (*t
))));
4524 if (wi::les_p (ext
, wi::to_widest (TYPE_SIZE (vtype
))))
4526 *t
= build3_loc (EXPR_LOCATION (*t
), BIT_FIELD_REF
,
4528 TREE_OPERAND (TREE_OPERAND (*t
, 0), 0),
4529 TYPE_SIZE (TREE_TYPE (*t
)),
4530 wide_int_to_tree (bitsizetype
, idx
));
4538 while (handled_component_p (*t
))
4539 t
= &TREE_OPERAND (*t
, 0);
4541 /* Canonicalize MEM [&foo.bar, 0] which appears after propagating
4542 of invariant addresses into a SSA name MEM_REF address. */
4543 if (TREE_CODE (*t
) == MEM_REF
4544 || TREE_CODE (*t
) == TARGET_MEM_REF
)
4546 tree addr
= TREE_OPERAND (*t
, 0);
4547 if (TREE_CODE (addr
) == ADDR_EXPR
4548 && (TREE_CODE (TREE_OPERAND (addr
, 0)) == MEM_REF
4549 || handled_component_p (TREE_OPERAND (addr
, 0))))
4553 base
= get_addr_base_and_unit_offset (TREE_OPERAND (addr
, 0),
4558 TREE_OPERAND (*t
, 0) = build_fold_addr_expr (base
);
4559 TREE_OPERAND (*t
, 1) = int_const_binop (PLUS_EXPR
,
4560 TREE_OPERAND (*t
, 1),
4561 size_int (coffset
));
4564 gcc_checking_assert (TREE_CODE (TREE_OPERAND (*t
, 0)) == DEBUG_EXPR_DECL
4565 || is_gimple_mem_ref_addr (TREE_OPERAND (*t
, 0)));
4568 /* Canonicalize back MEM_REFs to plain reference trees if the object
4569 accessed is a decl that has the same access semantics as the MEM_REF. */
4570 if (TREE_CODE (*t
) == MEM_REF
4571 && TREE_CODE (TREE_OPERAND (*t
, 0)) == ADDR_EXPR
4572 && integer_zerop (TREE_OPERAND (*t
, 1))
4573 && MR_DEPENDENCE_CLIQUE (*t
) == 0)
4575 tree decl
= TREE_OPERAND (TREE_OPERAND (*t
, 0), 0);
4576 tree alias_type
= TREE_TYPE (TREE_OPERAND (*t
, 1));
4577 if (/* Same volatile qualification. */
4578 TREE_THIS_VOLATILE (*t
) == TREE_THIS_VOLATILE (decl
)
4579 /* Same TBAA behavior with -fstrict-aliasing. */
4580 && !TYPE_REF_CAN_ALIAS_ALL (alias_type
)
4581 && (TYPE_MAIN_VARIANT (TREE_TYPE (decl
))
4582 == TYPE_MAIN_VARIANT (TREE_TYPE (alias_type
)))
4583 /* Same alignment. */
4584 && TYPE_ALIGN (TREE_TYPE (decl
)) == TYPE_ALIGN (TREE_TYPE (*t
))
4585 /* We have to look out here to not drop a required conversion
4586 from the rhs to the lhs if *t appears on the lhs or vice-versa
4587 if it appears on the rhs. Thus require strict type
4589 && types_compatible_p (TREE_TYPE (*t
), TREE_TYPE (decl
)))
4591 *t
= TREE_OPERAND (TREE_OPERAND (*t
, 0), 0);
4596 /* Canonicalize TARGET_MEM_REF in particular with respect to
4597 the indexes becoming constant. */
4598 else if (TREE_CODE (*t
) == TARGET_MEM_REF
)
4600 tree tem
= maybe_fold_tmr (*t
);
4611 /* Worker for both fold_stmt and fold_stmt_inplace. The INPLACE argument
4612 distinguishes both cases. */
4615 fold_stmt_1 (gimple_stmt_iterator
*gsi
, bool inplace
, tree (*valueize
) (tree
))
4617 bool changed
= false;
4618 gimple
*stmt
= gsi_stmt (*gsi
);
4619 bool nowarning
= gimple_no_warning_p (stmt
);
4621 fold_defer_overflow_warnings ();
4623 /* First do required canonicalization of [TARGET_]MEM_REF addresses
4625 ??? This shouldn't be done in generic folding but in the
4626 propagation helpers which also know whether an address was
4628 Also canonicalize operand order. */
4629 switch (gimple_code (stmt
))
4632 if (gimple_assign_rhs_class (stmt
) == GIMPLE_SINGLE_RHS
)
4634 tree
*rhs
= gimple_assign_rhs1_ptr (stmt
);
4635 if ((REFERENCE_CLASS_P (*rhs
)
4636 || TREE_CODE (*rhs
) == ADDR_EXPR
)
4637 && maybe_canonicalize_mem_ref_addr (rhs
))
4639 tree
*lhs
= gimple_assign_lhs_ptr (stmt
);
4640 if (REFERENCE_CLASS_P (*lhs
)
4641 && maybe_canonicalize_mem_ref_addr (lhs
))
4646 /* Canonicalize operand order. */
4647 enum tree_code code
= gimple_assign_rhs_code (stmt
);
4648 if (TREE_CODE_CLASS (code
) == tcc_comparison
4649 || commutative_tree_code (code
)
4650 || commutative_ternary_tree_code (code
))
4652 tree rhs1
= gimple_assign_rhs1 (stmt
);
4653 tree rhs2
= gimple_assign_rhs2 (stmt
);
4654 if (tree_swap_operands_p (rhs1
, rhs2
))
4656 gimple_assign_set_rhs1 (stmt
, rhs2
);
4657 gimple_assign_set_rhs2 (stmt
, rhs1
);
4658 if (TREE_CODE_CLASS (code
) == tcc_comparison
)
4659 gimple_assign_set_rhs_code (stmt
,
4660 swap_tree_comparison (code
));
4668 for (i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
4670 tree
*arg
= gimple_call_arg_ptr (stmt
, i
);
4671 if (REFERENCE_CLASS_P (*arg
)
4672 && maybe_canonicalize_mem_ref_addr (arg
))
4675 tree
*lhs
= gimple_call_lhs_ptr (stmt
);
4677 && REFERENCE_CLASS_P (*lhs
)
4678 && maybe_canonicalize_mem_ref_addr (lhs
))
4684 gasm
*asm_stmt
= as_a
<gasm
*> (stmt
);
4685 for (i
= 0; i
< gimple_asm_noutputs (asm_stmt
); ++i
)
4687 tree link
= gimple_asm_output_op (asm_stmt
, i
);
4688 tree op
= TREE_VALUE (link
);
4689 if (REFERENCE_CLASS_P (op
)
4690 && maybe_canonicalize_mem_ref_addr (&TREE_VALUE (link
)))
4693 for (i
= 0; i
< gimple_asm_ninputs (asm_stmt
); ++i
)
4695 tree link
= gimple_asm_input_op (asm_stmt
, i
);
4696 tree op
= TREE_VALUE (link
);
4697 if ((REFERENCE_CLASS_P (op
)
4698 || TREE_CODE (op
) == ADDR_EXPR
)
4699 && maybe_canonicalize_mem_ref_addr (&TREE_VALUE (link
)))
4705 if (gimple_debug_bind_p (stmt
))
4707 tree
*val
= gimple_debug_bind_get_value_ptr (stmt
);
4709 && (REFERENCE_CLASS_P (*val
)
4710 || TREE_CODE (*val
) == ADDR_EXPR
)
4711 && maybe_canonicalize_mem_ref_addr (val
))
4717 /* Canonicalize operand order. */
4718 tree lhs
= gimple_cond_lhs (stmt
);
4719 tree rhs
= gimple_cond_rhs (stmt
);
4720 if (tree_swap_operands_p (lhs
, rhs
))
4722 gcond
*gc
= as_a
<gcond
*> (stmt
);
4723 gimple_cond_set_lhs (gc
, rhs
);
4724 gimple_cond_set_rhs (gc
, lhs
);
4725 gimple_cond_set_code (gc
,
4726 swap_tree_comparison (gimple_cond_code (gc
)));
4733 /* Dispatch to pattern-based folding. */
4735 || is_gimple_assign (stmt
)
4736 || gimple_code (stmt
) == GIMPLE_COND
)
4738 gimple_seq seq
= NULL
;
4739 gimple_match_op res_op
;
4740 if (gimple_simplify (stmt
, &res_op
, inplace
? NULL
: &seq
,
4741 valueize
, valueize
))
4743 if (replace_stmt_with_simplification (gsi
, &res_op
, &seq
, inplace
))
4746 gimple_seq_discard (seq
);
4750 stmt
= gsi_stmt (*gsi
);
4752 /* Fold the main computation performed by the statement. */
4753 switch (gimple_code (stmt
))
4757 /* Try to canonicalize for boolean-typed X the comparisons
4758 X == 0, X == 1, X != 0, and X != 1. */
4759 if (gimple_assign_rhs_code (stmt
) == EQ_EXPR
4760 || gimple_assign_rhs_code (stmt
) == NE_EXPR
)
4762 tree lhs
= gimple_assign_lhs (stmt
);
4763 tree op1
= gimple_assign_rhs1 (stmt
);
4764 tree op2
= gimple_assign_rhs2 (stmt
);
4765 tree type
= TREE_TYPE (op1
);
4767 /* Check whether the comparison operands are of the same boolean
4768 type as the result type is.
4769 Check that second operand is an integer-constant with value
4771 if (TREE_CODE (op2
) == INTEGER_CST
4772 && (integer_zerop (op2
) || integer_onep (op2
))
4773 && useless_type_conversion_p (TREE_TYPE (lhs
), type
))
4775 enum tree_code cmp_code
= gimple_assign_rhs_code (stmt
);
4776 bool is_logical_not
= false;
4778 /* X == 0 and X != 1 is a logical-not.of X
4779 X == 1 and X != 0 is X */
4780 if ((cmp_code
== EQ_EXPR
&& integer_zerop (op2
))
4781 || (cmp_code
== NE_EXPR
&& integer_onep (op2
)))
4782 is_logical_not
= true;
4784 if (is_logical_not
== false)
4785 gimple_assign_set_rhs_with_ops (gsi
, TREE_CODE (op1
), op1
);
4786 /* Only for one-bit precision typed X the transformation
4787 !X -> ~X is valied. */
4788 else if (TYPE_PRECISION (type
) == 1)
4789 gimple_assign_set_rhs_with_ops (gsi
, BIT_NOT_EXPR
, op1
);
4790 /* Otherwise we use !X -> X ^ 1. */
4792 gimple_assign_set_rhs_with_ops (gsi
, BIT_XOR_EXPR
, op1
,
4793 build_int_cst (type
, 1));
4799 unsigned old_num_ops
= gimple_num_ops (stmt
);
4800 tree lhs
= gimple_assign_lhs (stmt
);
4801 tree new_rhs
= fold_gimple_assign (gsi
);
4803 && !useless_type_conversion_p (TREE_TYPE (lhs
),
4804 TREE_TYPE (new_rhs
)))
4805 new_rhs
= fold_convert (TREE_TYPE (lhs
), new_rhs
);
4808 || get_gimple_rhs_num_ops (TREE_CODE (new_rhs
)) < old_num_ops
))
4810 gimple_assign_set_rhs_from_tree (gsi
, new_rhs
);
4817 changed
|= gimple_fold_call (gsi
, inplace
);
4821 /* Fold *& in asm operands. */
4823 gasm
*asm_stmt
= as_a
<gasm
*> (stmt
);
4825 const char **oconstraints
;
4826 const char *constraint
;
4827 bool allows_mem
, allows_reg
;
4829 noutputs
= gimple_asm_noutputs (asm_stmt
);
4830 oconstraints
= XALLOCAVEC (const char *, noutputs
);
4832 for (i
= 0; i
< gimple_asm_noutputs (asm_stmt
); ++i
)
4834 tree link
= gimple_asm_output_op (asm_stmt
, i
);
4835 tree op
= TREE_VALUE (link
);
4837 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link
)));
4838 if (REFERENCE_CLASS_P (op
)
4839 && (op
= maybe_fold_reference (op
, true)) != NULL_TREE
)
4841 TREE_VALUE (link
) = op
;
4845 for (i
= 0; i
< gimple_asm_ninputs (asm_stmt
); ++i
)
4847 tree link
= gimple_asm_input_op (asm_stmt
, i
);
4848 tree op
= TREE_VALUE (link
);
4850 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link
)));
4851 parse_input_constraint (&constraint
, 0, 0, noutputs
, 0,
4852 oconstraints
, &allows_mem
, &allows_reg
);
4853 if (REFERENCE_CLASS_P (op
)
4854 && (op
= maybe_fold_reference (op
, !allows_reg
&& allows_mem
))
4857 TREE_VALUE (link
) = op
;
4865 if (gimple_debug_bind_p (stmt
))
4867 tree val
= gimple_debug_bind_get_value (stmt
);
4869 && REFERENCE_CLASS_P (val
))
4871 tree tem
= maybe_fold_reference (val
, false);
4874 gimple_debug_bind_set_value (stmt
, tem
);
4879 && TREE_CODE (val
) == ADDR_EXPR
)
4881 tree ref
= TREE_OPERAND (val
, 0);
4882 tree tem
= maybe_fold_reference (ref
, false);
4885 tem
= build_fold_addr_expr_with_type (tem
, TREE_TYPE (val
));
4886 gimple_debug_bind_set_value (stmt
, tem
);
4895 greturn
*ret_stmt
= as_a
<greturn
*> (stmt
);
4896 tree ret
= gimple_return_retval(ret_stmt
);
4898 if (ret
&& TREE_CODE (ret
) == SSA_NAME
&& valueize
)
4900 tree val
= valueize (ret
);
4901 if (val
&& val
!= ret
4902 && may_propagate_copy (ret
, val
))
4904 gimple_return_set_retval (ret_stmt
, val
);
4914 stmt
= gsi_stmt (*gsi
);
4916 /* Fold *& on the lhs. */
4917 if (gimple_has_lhs (stmt
))
4919 tree lhs
= gimple_get_lhs (stmt
);
4920 if (lhs
&& REFERENCE_CLASS_P (lhs
))
4922 tree new_lhs
= maybe_fold_reference (lhs
, true);
4925 gimple_set_lhs (stmt
, new_lhs
);
4931 fold_undefer_overflow_warnings (changed
&& !nowarning
, stmt
, 0);
4935 /* Valueziation callback that ends up not following SSA edges. */
4938 no_follow_ssa_edges (tree
)
4943 /* Valueization callback that ends up following single-use SSA edges only. */
4946 follow_single_use_edges (tree val
)
4948 if (TREE_CODE (val
) == SSA_NAME
4949 && !has_single_use (val
))
4954 /* Valueization callback that follows all SSA edges. */
4957 follow_all_ssa_edges (tree val
)
4962 /* Fold the statement pointed to by GSI. In some cases, this function may
4963 replace the whole statement with a new one. Returns true iff folding
4965 The statement pointed to by GSI should be in valid gimple form but may
4966 be in unfolded state as resulting from for example constant propagation
4967 which can produce *&x = 0. */
4970 fold_stmt (gimple_stmt_iterator
*gsi
)
4972 return fold_stmt_1 (gsi
, false, no_follow_ssa_edges
);
4976 fold_stmt (gimple_stmt_iterator
*gsi
, tree (*valueize
) (tree
))
4978 return fold_stmt_1 (gsi
, false, valueize
);
4981 /* Perform the minimal folding on statement *GSI. Only operations like
4982 *&x created by constant propagation are handled. The statement cannot
4983 be replaced with a new one. Return true if the statement was
4984 changed, false otherwise.
4985 The statement *GSI should be in valid gimple form but may
4986 be in unfolded state as resulting from for example constant propagation
4987 which can produce *&x = 0. */
4990 fold_stmt_inplace (gimple_stmt_iterator
*gsi
)
4992 gimple
*stmt
= gsi_stmt (*gsi
);
4993 bool changed
= fold_stmt_1 (gsi
, true, no_follow_ssa_edges
);
4994 gcc_assert (gsi_stmt (*gsi
) == stmt
);
4998 /* Canonicalize and possibly invert the boolean EXPR; return NULL_TREE
4999 if EXPR is null or we don't know how.
5000 If non-null, the result always has boolean type. */
5003 canonicalize_bool (tree expr
, bool invert
)
5009 if (integer_nonzerop (expr
))
5010 return boolean_false_node
;
5011 else if (integer_zerop (expr
))
5012 return boolean_true_node
;
5013 else if (TREE_CODE (expr
) == SSA_NAME
)
5014 return fold_build2 (EQ_EXPR
, boolean_type_node
, expr
,
5015 build_int_cst (TREE_TYPE (expr
), 0));
5016 else if (COMPARISON_CLASS_P (expr
))
5017 return fold_build2 (invert_tree_comparison (TREE_CODE (expr
), false),
5019 TREE_OPERAND (expr
, 0),
5020 TREE_OPERAND (expr
, 1));
5026 if (TREE_CODE (TREE_TYPE (expr
)) == BOOLEAN_TYPE
)
5028 if (integer_nonzerop (expr
))
5029 return boolean_true_node
;
5030 else if (integer_zerop (expr
))
5031 return boolean_false_node
;
5032 else if (TREE_CODE (expr
) == SSA_NAME
)
5033 return fold_build2 (NE_EXPR
, boolean_type_node
, expr
,
5034 build_int_cst (TREE_TYPE (expr
), 0));
5035 else if (COMPARISON_CLASS_P (expr
))
5036 return fold_build2 (TREE_CODE (expr
),
5038 TREE_OPERAND (expr
, 0),
5039 TREE_OPERAND (expr
, 1));
5045 /* Check to see if a boolean expression EXPR is logically equivalent to the
5046 comparison (OP1 CODE OP2). Check for various identities involving
5050 same_bool_comparison_p (const_tree expr
, enum tree_code code
,
5051 const_tree op1
, const_tree op2
)
5055 /* The obvious case. */
5056 if (TREE_CODE (expr
) == code
5057 && operand_equal_p (TREE_OPERAND (expr
, 0), op1
, 0)
5058 && operand_equal_p (TREE_OPERAND (expr
, 1), op2
, 0))
5061 /* Check for comparing (name, name != 0) and the case where expr
5062 is an SSA_NAME with a definition matching the comparison. */
5063 if (TREE_CODE (expr
) == SSA_NAME
5064 && TREE_CODE (TREE_TYPE (expr
)) == BOOLEAN_TYPE
)
5066 if (operand_equal_p (expr
, op1
, 0))
5067 return ((code
== NE_EXPR
&& integer_zerop (op2
))
5068 || (code
== EQ_EXPR
&& integer_nonzerop (op2
)));
5069 s
= SSA_NAME_DEF_STMT (expr
);
5070 if (is_gimple_assign (s
)
5071 && gimple_assign_rhs_code (s
) == code
5072 && operand_equal_p (gimple_assign_rhs1 (s
), op1
, 0)
5073 && operand_equal_p (gimple_assign_rhs2 (s
), op2
, 0))
5077 /* If op1 is of the form (name != 0) or (name == 0), and the definition
5078 of name is a comparison, recurse. */
5079 if (TREE_CODE (op1
) == SSA_NAME
5080 && TREE_CODE (TREE_TYPE (op1
)) == BOOLEAN_TYPE
)
5082 s
= SSA_NAME_DEF_STMT (op1
);
5083 if (is_gimple_assign (s
)
5084 && TREE_CODE_CLASS (gimple_assign_rhs_code (s
)) == tcc_comparison
)
5086 enum tree_code c
= gimple_assign_rhs_code (s
);
5087 if ((c
== NE_EXPR
&& integer_zerop (op2
))
5088 || (c
== EQ_EXPR
&& integer_nonzerop (op2
)))
5089 return same_bool_comparison_p (expr
, c
,
5090 gimple_assign_rhs1 (s
),
5091 gimple_assign_rhs2 (s
));
5092 if ((c
== EQ_EXPR
&& integer_zerop (op2
))
5093 || (c
== NE_EXPR
&& integer_nonzerop (op2
)))
5094 return same_bool_comparison_p (expr
,
5095 invert_tree_comparison (c
, false),
5096 gimple_assign_rhs1 (s
),
5097 gimple_assign_rhs2 (s
));
5103 /* Check to see if two boolean expressions OP1 and OP2 are logically
5107 same_bool_result_p (const_tree op1
, const_tree op2
)
5109 /* Simple cases first. */
5110 if (operand_equal_p (op1
, op2
, 0))
5113 /* Check the cases where at least one of the operands is a comparison.
5114 These are a bit smarter than operand_equal_p in that they apply some
5115 identifies on SSA_NAMEs. */
5116 if (COMPARISON_CLASS_P (op2
)
5117 && same_bool_comparison_p (op1
, TREE_CODE (op2
),
5118 TREE_OPERAND (op2
, 0),
5119 TREE_OPERAND (op2
, 1)))
5121 if (COMPARISON_CLASS_P (op1
)
5122 && same_bool_comparison_p (op2
, TREE_CODE (op1
),
5123 TREE_OPERAND (op1
, 0),
5124 TREE_OPERAND (op1
, 1)))
5131 /* Forward declarations for some mutually recursive functions. */
5134 and_comparisons_1 (enum tree_code code1
, tree op1a
, tree op1b
,
5135 enum tree_code code2
, tree op2a
, tree op2b
);
5137 and_var_with_comparison (tree var
, bool invert
,
5138 enum tree_code code2
, tree op2a
, tree op2b
);
5140 and_var_with_comparison_1 (gimple
*stmt
,
5141 enum tree_code code2
, tree op2a
, tree op2b
);
5143 or_comparisons_1 (enum tree_code code1
, tree op1a
, tree op1b
,
5144 enum tree_code code2
, tree op2a
, tree op2b
);
5146 or_var_with_comparison (tree var
, bool invert
,
5147 enum tree_code code2
, tree op2a
, tree op2b
);
5149 or_var_with_comparison_1 (gimple
*stmt
,
5150 enum tree_code code2
, tree op2a
, tree op2b
);
5152 /* Helper function for and_comparisons_1: try to simplify the AND of the
5153 ssa variable VAR with the comparison specified by (OP2A CODE2 OP2B).
5154 If INVERT is true, invert the value of the VAR before doing the AND.
5155 Return NULL_EXPR if we can't simplify this to a single expression. */
5158 and_var_with_comparison (tree var
, bool invert
,
5159 enum tree_code code2
, tree op2a
, tree op2b
)
5162 gimple
*stmt
= SSA_NAME_DEF_STMT (var
);
5164 /* We can only deal with variables whose definitions are assignments. */
5165 if (!is_gimple_assign (stmt
))
5168 /* If we have an inverted comparison, apply DeMorgan's law and rewrite
5169 !var AND (op2a code2 op2b) => !(var OR !(op2a code2 op2b))
5170 Then we only have to consider the simpler non-inverted cases. */
5172 t
= or_var_with_comparison_1 (stmt
,
5173 invert_tree_comparison (code2
, false),
5176 t
= and_var_with_comparison_1 (stmt
, code2
, op2a
, op2b
);
5177 return canonicalize_bool (t
, invert
);
5180 /* Try to simplify the AND of the ssa variable defined by the assignment
5181 STMT with the comparison specified by (OP2A CODE2 OP2B).
5182 Return NULL_EXPR if we can't simplify this to a single expression. */
5185 and_var_with_comparison_1 (gimple
*stmt
,
5186 enum tree_code code2
, tree op2a
, tree op2b
)
5188 tree var
= gimple_assign_lhs (stmt
);
5189 tree true_test_var
= NULL_TREE
;
5190 tree false_test_var
= NULL_TREE
;
5191 enum tree_code innercode
= gimple_assign_rhs_code (stmt
);
5193 /* Check for identities like (var AND (var == 0)) => false. */
5194 if (TREE_CODE (op2a
) == SSA_NAME
5195 && TREE_CODE (TREE_TYPE (var
)) == BOOLEAN_TYPE
)
5197 if ((code2
== NE_EXPR
&& integer_zerop (op2b
))
5198 || (code2
== EQ_EXPR
&& integer_nonzerop (op2b
)))
5200 true_test_var
= op2a
;
5201 if (var
== true_test_var
)
5204 else if ((code2
== EQ_EXPR
&& integer_zerop (op2b
))
5205 || (code2
== NE_EXPR
&& integer_nonzerop (op2b
)))
5207 false_test_var
= op2a
;
5208 if (var
== false_test_var
)
5209 return boolean_false_node
;
5213 /* If the definition is a comparison, recurse on it. */
5214 if (TREE_CODE_CLASS (innercode
) == tcc_comparison
)
5216 tree t
= and_comparisons_1 (innercode
,
5217 gimple_assign_rhs1 (stmt
),
5218 gimple_assign_rhs2 (stmt
),
5226 /* If the definition is an AND or OR expression, we may be able to
5227 simplify by reassociating. */
5228 if (TREE_CODE (TREE_TYPE (var
)) == BOOLEAN_TYPE
5229 && (innercode
== BIT_AND_EXPR
|| innercode
== BIT_IOR_EXPR
))
5231 tree inner1
= gimple_assign_rhs1 (stmt
);
5232 tree inner2
= gimple_assign_rhs2 (stmt
);
5235 tree partial
= NULL_TREE
;
5236 bool is_and
= (innercode
== BIT_AND_EXPR
);
5238 /* Check for boolean identities that don't require recursive examination
5240 inner1 AND (inner1 AND inner2) => inner1 AND inner2 => var
5241 inner1 AND (inner1 OR inner2) => inner1
5242 !inner1 AND (inner1 AND inner2) => false
5243 !inner1 AND (inner1 OR inner2) => !inner1 AND inner2
5244 Likewise for similar cases involving inner2. */
5245 if (inner1
== true_test_var
)
5246 return (is_and
? var
: inner1
);
5247 else if (inner2
== true_test_var
)
5248 return (is_and
? var
: inner2
);
5249 else if (inner1
== false_test_var
)
5251 ? boolean_false_node
5252 : and_var_with_comparison (inner2
, false, code2
, op2a
, op2b
));
5253 else if (inner2
== false_test_var
)
5255 ? boolean_false_node
5256 : and_var_with_comparison (inner1
, false, code2
, op2a
, op2b
));
5258 /* Next, redistribute/reassociate the AND across the inner tests.
5259 Compute the first partial result, (inner1 AND (op2a code op2b)) */
5260 if (TREE_CODE (inner1
) == SSA_NAME
5261 && is_gimple_assign (s
= SSA_NAME_DEF_STMT (inner1
))
5262 && TREE_CODE_CLASS (gimple_assign_rhs_code (s
)) == tcc_comparison
5263 && (t
= maybe_fold_and_comparisons (gimple_assign_rhs_code (s
),
5264 gimple_assign_rhs1 (s
),
5265 gimple_assign_rhs2 (s
),
5266 code2
, op2a
, op2b
)))
5268 /* Handle the AND case, where we are reassociating:
5269 (inner1 AND inner2) AND (op2a code2 op2b)
5271 If the partial result t is a constant, we win. Otherwise
5272 continue on to try reassociating with the other inner test. */
5275 if (integer_onep (t
))
5277 else if (integer_zerop (t
))
5278 return boolean_false_node
;
5281 /* Handle the OR case, where we are redistributing:
5282 (inner1 OR inner2) AND (op2a code2 op2b)
5283 => (t OR (inner2 AND (op2a code2 op2b))) */
5284 else if (integer_onep (t
))
5285 return boolean_true_node
;
5287 /* Save partial result for later. */
5291 /* Compute the second partial result, (inner2 AND (op2a code op2b)) */
5292 if (TREE_CODE (inner2
) == SSA_NAME
5293 && is_gimple_assign (s
= SSA_NAME_DEF_STMT (inner2
))
5294 && TREE_CODE_CLASS (gimple_assign_rhs_code (s
)) == tcc_comparison
5295 && (t
= maybe_fold_and_comparisons (gimple_assign_rhs_code (s
),
5296 gimple_assign_rhs1 (s
),
5297 gimple_assign_rhs2 (s
),
5298 code2
, op2a
, op2b
)))
5300 /* Handle the AND case, where we are reassociating:
5301 (inner1 AND inner2) AND (op2a code2 op2b)
5302 => (inner1 AND t) */
5305 if (integer_onep (t
))
5307 else if (integer_zerop (t
))
5308 return boolean_false_node
;
5309 /* If both are the same, we can apply the identity
5311 else if (partial
&& same_bool_result_p (t
, partial
))
5315 /* Handle the OR case. where we are redistributing:
5316 (inner1 OR inner2) AND (op2a code2 op2b)
5317 => (t OR (inner1 AND (op2a code2 op2b)))
5318 => (t OR partial) */
5321 if (integer_onep (t
))
5322 return boolean_true_node
;
5325 /* We already got a simplification for the other
5326 operand to the redistributed OR expression. The
5327 interesting case is when at least one is false.
5328 Or, if both are the same, we can apply the identity
5330 if (integer_zerop (partial
))
5332 else if (integer_zerop (t
))
5334 else if (same_bool_result_p (t
, partial
))
5343 /* Try to simplify the AND of two comparisons defined by
5344 (OP1A CODE1 OP1B) and (OP2A CODE2 OP2B), respectively.
5345 If this can be done without constructing an intermediate value,
5346 return the resulting tree; otherwise NULL_TREE is returned.
5347 This function is deliberately asymmetric as it recurses on SSA_DEFs
5348 in the first comparison but not the second. */
5351 and_comparisons_1 (enum tree_code code1
, tree op1a
, tree op1b
,
5352 enum tree_code code2
, tree op2a
, tree op2b
)
5354 tree truth_type
= truth_type_for (TREE_TYPE (op1a
));
5356 /* First check for ((x CODE1 y) AND (x CODE2 y)). */
5357 if (operand_equal_p (op1a
, op2a
, 0)
5358 && operand_equal_p (op1b
, op2b
, 0))
5360 /* Result will be either NULL_TREE, or a combined comparison. */
5361 tree t
= combine_comparisons (UNKNOWN_LOCATION
,
5362 TRUTH_ANDIF_EXPR
, code1
, code2
,
5363 truth_type
, op1a
, op1b
);
5368 /* Likewise the swapped case of the above. */
5369 if (operand_equal_p (op1a
, op2b
, 0)
5370 && operand_equal_p (op1b
, op2a
, 0))
5372 /* Result will be either NULL_TREE, or a combined comparison. */
5373 tree t
= combine_comparisons (UNKNOWN_LOCATION
,
5374 TRUTH_ANDIF_EXPR
, code1
,
5375 swap_tree_comparison (code2
),
5376 truth_type
, op1a
, op1b
);
5381 /* If both comparisons are of the same value against constants, we might
5382 be able to merge them. */
5383 if (operand_equal_p (op1a
, op2a
, 0)
5384 && TREE_CODE (op1b
) == INTEGER_CST
5385 && TREE_CODE (op2b
) == INTEGER_CST
)
5387 int cmp
= tree_int_cst_compare (op1b
, op2b
);
5389 /* If we have (op1a == op1b), we should either be able to
5390 return that or FALSE, depending on whether the constant op1b
5391 also satisfies the other comparison against op2b. */
5392 if (code1
== EQ_EXPR
)
5398 case EQ_EXPR
: val
= (cmp
== 0); break;
5399 case NE_EXPR
: val
= (cmp
!= 0); break;
5400 case LT_EXPR
: val
= (cmp
< 0); break;
5401 case GT_EXPR
: val
= (cmp
> 0); break;
5402 case LE_EXPR
: val
= (cmp
<= 0); break;
5403 case GE_EXPR
: val
= (cmp
>= 0); break;
5404 default: done
= false;
5409 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
5411 return boolean_false_node
;
5414 /* Likewise if the second comparison is an == comparison. */
5415 else if (code2
== EQ_EXPR
)
5421 case EQ_EXPR
: val
= (cmp
== 0); break;
5422 case NE_EXPR
: val
= (cmp
!= 0); break;
5423 case LT_EXPR
: val
= (cmp
> 0); break;
5424 case GT_EXPR
: val
= (cmp
< 0); break;
5425 case LE_EXPR
: val
= (cmp
>= 0); break;
5426 case GE_EXPR
: val
= (cmp
<= 0); break;
5427 default: done
= false;
5432 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
5434 return boolean_false_node
;
5438 /* Same business with inequality tests. */
5439 else if (code1
== NE_EXPR
)
5444 case EQ_EXPR
: val
= (cmp
!= 0); break;
5445 case NE_EXPR
: val
= (cmp
== 0); break;
5446 case LT_EXPR
: val
= (cmp
>= 0); break;
5447 case GT_EXPR
: val
= (cmp
<= 0); break;
5448 case LE_EXPR
: val
= (cmp
> 0); break;
5449 case GE_EXPR
: val
= (cmp
< 0); break;
5454 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
5456 else if (code2
== NE_EXPR
)
5461 case EQ_EXPR
: val
= (cmp
== 0); break;
5462 case NE_EXPR
: val
= (cmp
!= 0); break;
5463 case LT_EXPR
: val
= (cmp
<= 0); break;
5464 case GT_EXPR
: val
= (cmp
>= 0); break;
5465 case LE_EXPR
: val
= (cmp
< 0); break;
5466 case GE_EXPR
: val
= (cmp
> 0); break;
5471 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
5474 /* Chose the more restrictive of two < or <= comparisons. */
5475 else if ((code1
== LT_EXPR
|| code1
== LE_EXPR
)
5476 && (code2
== LT_EXPR
|| code2
== LE_EXPR
))
5478 if ((cmp
< 0) || (cmp
== 0 && code1
== LT_EXPR
))
5479 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
5481 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
5484 /* Likewise chose the more restrictive of two > or >= comparisons. */
5485 else if ((code1
== GT_EXPR
|| code1
== GE_EXPR
)
5486 && (code2
== GT_EXPR
|| code2
== GE_EXPR
))
5488 if ((cmp
> 0) || (cmp
== 0 && code1
== GT_EXPR
))
5489 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
5491 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
5494 /* Check for singleton ranges. */
5496 && ((code1
== LE_EXPR
&& code2
== GE_EXPR
)
5497 || (code1
== GE_EXPR
&& code2
== LE_EXPR
)))
5498 return fold_build2 (EQ_EXPR
, boolean_type_node
, op1a
, op2b
);
5500 /* Check for disjoint ranges. */
5502 && (code1
== LT_EXPR
|| code1
== LE_EXPR
)
5503 && (code2
== GT_EXPR
|| code2
== GE_EXPR
))
5504 return boolean_false_node
;
5506 && (code1
== GT_EXPR
|| code1
== GE_EXPR
)
5507 && (code2
== LT_EXPR
|| code2
== LE_EXPR
))
5508 return boolean_false_node
;
5511 /* Perhaps the first comparison is (NAME != 0) or (NAME == 1) where
5512 NAME's definition is a truth value. See if there are any simplifications
5513 that can be done against the NAME's definition. */
5514 if (TREE_CODE (op1a
) == SSA_NAME
5515 && (code1
== NE_EXPR
|| code1
== EQ_EXPR
)
5516 && (integer_zerop (op1b
) || integer_onep (op1b
)))
5518 bool invert
= ((code1
== EQ_EXPR
&& integer_zerop (op1b
))
5519 || (code1
== NE_EXPR
&& integer_onep (op1b
)));
5520 gimple
*stmt
= SSA_NAME_DEF_STMT (op1a
);
5521 switch (gimple_code (stmt
))
5524 /* Try to simplify by copy-propagating the definition. */
5525 return and_var_with_comparison (op1a
, invert
, code2
, op2a
, op2b
);
5528 /* If every argument to the PHI produces the same result when
5529 ANDed with the second comparison, we win.
5530 Do not do this unless the type is bool since we need a bool
5531 result here anyway. */
5532 if (TREE_CODE (TREE_TYPE (op1a
)) == BOOLEAN_TYPE
)
5534 tree result
= NULL_TREE
;
5536 for (i
= 0; i
< gimple_phi_num_args (stmt
); i
++)
5538 tree arg
= gimple_phi_arg_def (stmt
, i
);
5540 /* If this PHI has itself as an argument, ignore it.
5541 If all the other args produce the same result,
5543 if (arg
== gimple_phi_result (stmt
))
5545 else if (TREE_CODE (arg
) == INTEGER_CST
)
5547 if (invert
? integer_nonzerop (arg
) : integer_zerop (arg
))
5550 result
= boolean_false_node
;
5551 else if (!integer_zerop (result
))
5555 result
= fold_build2 (code2
, boolean_type_node
,
5557 else if (!same_bool_comparison_p (result
,
5561 else if (TREE_CODE (arg
) == SSA_NAME
5562 && !SSA_NAME_IS_DEFAULT_DEF (arg
))
5565 gimple
*def_stmt
= SSA_NAME_DEF_STMT (arg
);
5566 /* In simple cases we can look through PHI nodes,
5567 but we have to be careful with loops.
5569 if (! dom_info_available_p (CDI_DOMINATORS
)
5570 || gimple_bb (def_stmt
) == gimple_bb (stmt
)
5571 || dominated_by_p (CDI_DOMINATORS
,
5572 gimple_bb (def_stmt
),
5575 temp
= and_var_with_comparison (arg
, invert
, code2
,
5581 else if (!same_bool_result_p (result
, temp
))
5597 /* Try to simplify the AND of two comparisons, specified by
5598 (OP1A CODE1 OP1B) and (OP2B CODE2 OP2B), respectively.
5599 If this can be simplified to a single expression (without requiring
5600 introducing more SSA variables to hold intermediate values),
5601 return the resulting tree. Otherwise return NULL_TREE.
5602 If the result expression is non-null, it has boolean type. */
5605 maybe_fold_and_comparisons (enum tree_code code1
, tree op1a
, tree op1b
,
5606 enum tree_code code2
, tree op2a
, tree op2b
)
5608 tree t
= and_comparisons_1 (code1
, op1a
, op1b
, code2
, op2a
, op2b
);
5612 return and_comparisons_1 (code2
, op2a
, op2b
, code1
, op1a
, op1b
);
5615 /* Helper function for or_comparisons_1: try to simplify the OR of the
5616 ssa variable VAR with the comparison specified by (OP2A CODE2 OP2B).
5617 If INVERT is true, invert the value of VAR before doing the OR.
5618 Return NULL_EXPR if we can't simplify this to a single expression. */
5621 or_var_with_comparison (tree var
, bool invert
,
5622 enum tree_code code2
, tree op2a
, tree op2b
)
5625 gimple
*stmt
= SSA_NAME_DEF_STMT (var
);
5627 /* We can only deal with variables whose definitions are assignments. */
5628 if (!is_gimple_assign (stmt
))
5631 /* If we have an inverted comparison, apply DeMorgan's law and rewrite
5632 !var OR (op2a code2 op2b) => !(var AND !(op2a code2 op2b))
5633 Then we only have to consider the simpler non-inverted cases. */
5635 t
= and_var_with_comparison_1 (stmt
,
5636 invert_tree_comparison (code2
, false),
5639 t
= or_var_with_comparison_1 (stmt
, code2
, op2a
, op2b
);
5640 return canonicalize_bool (t
, invert
);
5643 /* Try to simplify the OR of the ssa variable defined by the assignment
5644 STMT with the comparison specified by (OP2A CODE2 OP2B).
5645 Return NULL_EXPR if we can't simplify this to a single expression. */
5648 or_var_with_comparison_1 (gimple
*stmt
,
5649 enum tree_code code2
, tree op2a
, tree op2b
)
5651 tree var
= gimple_assign_lhs (stmt
);
5652 tree true_test_var
= NULL_TREE
;
5653 tree false_test_var
= NULL_TREE
;
5654 enum tree_code innercode
= gimple_assign_rhs_code (stmt
);
5656 /* Check for identities like (var OR (var != 0)) => true . */
5657 if (TREE_CODE (op2a
) == SSA_NAME
5658 && TREE_CODE (TREE_TYPE (var
)) == BOOLEAN_TYPE
)
5660 if ((code2
== NE_EXPR
&& integer_zerop (op2b
))
5661 || (code2
== EQ_EXPR
&& integer_nonzerop (op2b
)))
5663 true_test_var
= op2a
;
5664 if (var
== true_test_var
)
5667 else if ((code2
== EQ_EXPR
&& integer_zerop (op2b
))
5668 || (code2
== NE_EXPR
&& integer_nonzerop (op2b
)))
5670 false_test_var
= op2a
;
5671 if (var
== false_test_var
)
5672 return boolean_true_node
;
5676 /* If the definition is a comparison, recurse on it. */
5677 if (TREE_CODE_CLASS (innercode
) == tcc_comparison
)
5679 tree t
= or_comparisons_1 (innercode
,
5680 gimple_assign_rhs1 (stmt
),
5681 gimple_assign_rhs2 (stmt
),
5689 /* If the definition is an AND or OR expression, we may be able to
5690 simplify by reassociating. */
5691 if (TREE_CODE (TREE_TYPE (var
)) == BOOLEAN_TYPE
5692 && (innercode
== BIT_AND_EXPR
|| innercode
== BIT_IOR_EXPR
))
5694 tree inner1
= gimple_assign_rhs1 (stmt
);
5695 tree inner2
= gimple_assign_rhs2 (stmt
);
5698 tree partial
= NULL_TREE
;
5699 bool is_or
= (innercode
== BIT_IOR_EXPR
);
5701 /* Check for boolean identities that don't require recursive examination
5703 inner1 OR (inner1 OR inner2) => inner1 OR inner2 => var
5704 inner1 OR (inner1 AND inner2) => inner1
5705 !inner1 OR (inner1 OR inner2) => true
5706 !inner1 OR (inner1 AND inner2) => !inner1 OR inner2
5708 if (inner1
== true_test_var
)
5709 return (is_or
? var
: inner1
);
5710 else if (inner2
== true_test_var
)
5711 return (is_or
? var
: inner2
);
5712 else if (inner1
== false_test_var
)
5715 : or_var_with_comparison (inner2
, false, code2
, op2a
, op2b
));
5716 else if (inner2
== false_test_var
)
5719 : or_var_with_comparison (inner1
, false, code2
, op2a
, op2b
));
5721 /* Next, redistribute/reassociate the OR across the inner tests.
5722 Compute the first partial result, (inner1 OR (op2a code op2b)) */
5723 if (TREE_CODE (inner1
) == SSA_NAME
5724 && is_gimple_assign (s
= SSA_NAME_DEF_STMT (inner1
))
5725 && TREE_CODE_CLASS (gimple_assign_rhs_code (s
)) == tcc_comparison
5726 && (t
= maybe_fold_or_comparisons (gimple_assign_rhs_code (s
),
5727 gimple_assign_rhs1 (s
),
5728 gimple_assign_rhs2 (s
),
5729 code2
, op2a
, op2b
)))
5731 /* Handle the OR case, where we are reassociating:
5732 (inner1 OR inner2) OR (op2a code2 op2b)
5734 If the partial result t is a constant, we win. Otherwise
5735 continue on to try reassociating with the other inner test. */
5738 if (integer_onep (t
))
5739 return boolean_true_node
;
5740 else if (integer_zerop (t
))
5744 /* Handle the AND case, where we are redistributing:
5745 (inner1 AND inner2) OR (op2a code2 op2b)
5746 => (t AND (inner2 OR (op2a code op2b))) */
5747 else if (integer_zerop (t
))
5748 return boolean_false_node
;
5750 /* Save partial result for later. */
5754 /* Compute the second partial result, (inner2 OR (op2a code op2b)) */
5755 if (TREE_CODE (inner2
) == SSA_NAME
5756 && is_gimple_assign (s
= SSA_NAME_DEF_STMT (inner2
))
5757 && TREE_CODE_CLASS (gimple_assign_rhs_code (s
)) == tcc_comparison
5758 && (t
= maybe_fold_or_comparisons (gimple_assign_rhs_code (s
),
5759 gimple_assign_rhs1 (s
),
5760 gimple_assign_rhs2 (s
),
5761 code2
, op2a
, op2b
)))
5763 /* Handle the OR case, where we are reassociating:
5764 (inner1 OR inner2) OR (op2a code2 op2b)
5766 => (t OR partial) */
5769 if (integer_zerop (t
))
5771 else if (integer_onep (t
))
5772 return boolean_true_node
;
5773 /* If both are the same, we can apply the identity
5775 else if (partial
&& same_bool_result_p (t
, partial
))
5779 /* Handle the AND case, where we are redistributing:
5780 (inner1 AND inner2) OR (op2a code2 op2b)
5781 => (t AND (inner1 OR (op2a code2 op2b)))
5782 => (t AND partial) */
5785 if (integer_zerop (t
))
5786 return boolean_false_node
;
5789 /* We already got a simplification for the other
5790 operand to the redistributed AND expression. The
5791 interesting case is when at least one is true.
5792 Or, if both are the same, we can apply the identity
5794 if (integer_onep (partial
))
5796 else if (integer_onep (t
))
5798 else if (same_bool_result_p (t
, partial
))
5807 /* Try to simplify the OR of two comparisons defined by
5808 (OP1A CODE1 OP1B) and (OP2A CODE2 OP2B), respectively.
5809 If this can be done without constructing an intermediate value,
5810 return the resulting tree; otherwise NULL_TREE is returned.
5811 This function is deliberately asymmetric as it recurses on SSA_DEFs
5812 in the first comparison but not the second. */
5815 or_comparisons_1 (enum tree_code code1
, tree op1a
, tree op1b
,
5816 enum tree_code code2
, tree op2a
, tree op2b
)
5818 tree truth_type
= truth_type_for (TREE_TYPE (op1a
));
5820 /* First check for ((x CODE1 y) OR (x CODE2 y)). */
5821 if (operand_equal_p (op1a
, op2a
, 0)
5822 && operand_equal_p (op1b
, op2b
, 0))
5824 /* Result will be either NULL_TREE, or a combined comparison. */
5825 tree t
= combine_comparisons (UNKNOWN_LOCATION
,
5826 TRUTH_ORIF_EXPR
, code1
, code2
,
5827 truth_type
, op1a
, op1b
);
5832 /* Likewise the swapped case of the above. */
5833 if (operand_equal_p (op1a
, op2b
, 0)
5834 && operand_equal_p (op1b
, op2a
, 0))
5836 /* Result will be either NULL_TREE, or a combined comparison. */
5837 tree t
= combine_comparisons (UNKNOWN_LOCATION
,
5838 TRUTH_ORIF_EXPR
, code1
,
5839 swap_tree_comparison (code2
),
5840 truth_type
, op1a
, op1b
);
5845 /* If both comparisons are of the same value against constants, we might
5846 be able to merge them. */
5847 if (operand_equal_p (op1a
, op2a
, 0)
5848 && TREE_CODE (op1b
) == INTEGER_CST
5849 && TREE_CODE (op2b
) == INTEGER_CST
)
5851 int cmp
= tree_int_cst_compare (op1b
, op2b
);
5853 /* If we have (op1a != op1b), we should either be able to
5854 return that or TRUE, depending on whether the constant op1b
5855 also satisfies the other comparison against op2b. */
5856 if (code1
== NE_EXPR
)
5862 case EQ_EXPR
: val
= (cmp
== 0); break;
5863 case NE_EXPR
: val
= (cmp
!= 0); break;
5864 case LT_EXPR
: val
= (cmp
< 0); break;
5865 case GT_EXPR
: val
= (cmp
> 0); break;
5866 case LE_EXPR
: val
= (cmp
<= 0); break;
5867 case GE_EXPR
: val
= (cmp
>= 0); break;
5868 default: done
= false;
5873 return boolean_true_node
;
5875 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
5878 /* Likewise if the second comparison is a != comparison. */
5879 else if (code2
== NE_EXPR
)
5885 case EQ_EXPR
: val
= (cmp
== 0); break;
5886 case NE_EXPR
: val
= (cmp
!= 0); break;
5887 case LT_EXPR
: val
= (cmp
> 0); break;
5888 case GT_EXPR
: val
= (cmp
< 0); break;
5889 case LE_EXPR
: val
= (cmp
>= 0); break;
5890 case GE_EXPR
: val
= (cmp
<= 0); break;
5891 default: done
= false;
5896 return boolean_true_node
;
5898 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
5902 /* See if an equality test is redundant with the other comparison. */
5903 else if (code1
== EQ_EXPR
)
5908 case EQ_EXPR
: val
= (cmp
== 0); break;
5909 case NE_EXPR
: val
= (cmp
!= 0); break;
5910 case LT_EXPR
: val
= (cmp
< 0); break;
5911 case GT_EXPR
: val
= (cmp
> 0); break;
5912 case LE_EXPR
: val
= (cmp
<= 0); break;
5913 case GE_EXPR
: val
= (cmp
>= 0); break;
5918 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
5920 else if (code2
== EQ_EXPR
)
5925 case EQ_EXPR
: val
= (cmp
== 0); break;
5926 case NE_EXPR
: val
= (cmp
!= 0); break;
5927 case LT_EXPR
: val
= (cmp
> 0); break;
5928 case GT_EXPR
: val
= (cmp
< 0); break;
5929 case LE_EXPR
: val
= (cmp
>= 0); break;
5930 case GE_EXPR
: val
= (cmp
<= 0); break;
5935 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
5938 /* Chose the less restrictive of two < or <= comparisons. */
5939 else if ((code1
== LT_EXPR
|| code1
== LE_EXPR
)
5940 && (code2
== LT_EXPR
|| code2
== LE_EXPR
))
5942 if ((cmp
< 0) || (cmp
== 0 && code1
== LT_EXPR
))
5943 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
5945 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
5948 /* Likewise chose the less restrictive of two > or >= comparisons. */
5949 else if ((code1
== GT_EXPR
|| code1
== GE_EXPR
)
5950 && (code2
== GT_EXPR
|| code2
== GE_EXPR
))
5952 if ((cmp
> 0) || (cmp
== 0 && code1
== GT_EXPR
))
5953 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
5955 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
5958 /* Check for singleton ranges. */
5960 && ((code1
== LT_EXPR
&& code2
== GT_EXPR
)
5961 || (code1
== GT_EXPR
&& code2
== LT_EXPR
)))
5962 return fold_build2 (NE_EXPR
, boolean_type_node
, op1a
, op2b
);
5964 /* Check for less/greater pairs that don't restrict the range at all. */
5966 && (code1
== LT_EXPR
|| code1
== LE_EXPR
)
5967 && (code2
== GT_EXPR
|| code2
== GE_EXPR
))
5968 return boolean_true_node
;
5970 && (code1
== GT_EXPR
|| code1
== GE_EXPR
)
5971 && (code2
== LT_EXPR
|| code2
== LE_EXPR
))
5972 return boolean_true_node
;
5975 /* Perhaps the first comparison is (NAME != 0) or (NAME == 1) where
5976 NAME's definition is a truth value. See if there are any simplifications
5977 that can be done against the NAME's definition. */
5978 if (TREE_CODE (op1a
) == SSA_NAME
5979 && (code1
== NE_EXPR
|| code1
== EQ_EXPR
)
5980 && (integer_zerop (op1b
) || integer_onep (op1b
)))
5982 bool invert
= ((code1
== EQ_EXPR
&& integer_zerop (op1b
))
5983 || (code1
== NE_EXPR
&& integer_onep (op1b
)));
5984 gimple
*stmt
= SSA_NAME_DEF_STMT (op1a
);
5985 switch (gimple_code (stmt
))
5988 /* Try to simplify by copy-propagating the definition. */
5989 return or_var_with_comparison (op1a
, invert
, code2
, op2a
, op2b
);
5992 /* If every argument to the PHI produces the same result when
5993 ORed with the second comparison, we win.
5994 Do not do this unless the type is bool since we need a bool
5995 result here anyway. */
5996 if (TREE_CODE (TREE_TYPE (op1a
)) == BOOLEAN_TYPE
)
5998 tree result
= NULL_TREE
;
6000 for (i
= 0; i
< gimple_phi_num_args (stmt
); i
++)
6002 tree arg
= gimple_phi_arg_def (stmt
, i
);
6004 /* If this PHI has itself as an argument, ignore it.
6005 If all the other args produce the same result,
6007 if (arg
== gimple_phi_result (stmt
))
6009 else if (TREE_CODE (arg
) == INTEGER_CST
)
6011 if (invert
? integer_zerop (arg
) : integer_nonzerop (arg
))
6014 result
= boolean_true_node
;
6015 else if (!integer_onep (result
))
6019 result
= fold_build2 (code2
, boolean_type_node
,
6021 else if (!same_bool_comparison_p (result
,
6025 else if (TREE_CODE (arg
) == SSA_NAME
6026 && !SSA_NAME_IS_DEFAULT_DEF (arg
))
6029 gimple
*def_stmt
= SSA_NAME_DEF_STMT (arg
);
6030 /* In simple cases we can look through PHI nodes,
6031 but we have to be careful with loops.
6033 if (! dom_info_available_p (CDI_DOMINATORS
)
6034 || gimple_bb (def_stmt
) == gimple_bb (stmt
)
6035 || dominated_by_p (CDI_DOMINATORS
,
6036 gimple_bb (def_stmt
),
6039 temp
= or_var_with_comparison (arg
, invert
, code2
,
6045 else if (!same_bool_result_p (result
, temp
))
6061 /* Try to simplify the OR of two comparisons, specified by
6062 (OP1A CODE1 OP1B) and (OP2B CODE2 OP2B), respectively.
6063 If this can be simplified to a single expression (without requiring
6064 introducing more SSA variables to hold intermediate values),
6065 return the resulting tree. Otherwise return NULL_TREE.
6066 If the result expression is non-null, it has boolean type. */
6069 maybe_fold_or_comparisons (enum tree_code code1
, tree op1a
, tree op1b
,
6070 enum tree_code code2
, tree op2a
, tree op2b
)
6072 tree t
= or_comparisons_1 (code1
, op1a
, op1b
, code2
, op2a
, op2b
);
6076 return or_comparisons_1 (code2
, op2a
, op2b
, code1
, op1a
, op1b
);
6080 /* Fold STMT to a constant using VALUEIZE to valueize SSA names.
6082 Either NULL_TREE, a simplified but non-constant or a constant
6085 ??? This should go into a gimple-fold-inline.h file to be eventually
6086 privatized with the single valueize function used in the various TUs
6087 to avoid the indirect function call overhead. */
6090 gimple_fold_stmt_to_constant_1 (gimple
*stmt
, tree (*valueize
) (tree
),
6091 tree (*gvalueize
) (tree
))
6093 gimple_match_op res_op
;
6094 /* ??? The SSA propagators do not correctly deal with following SSA use-def
6095 edges if there are intermediate VARYING defs. For this reason
6096 do not follow SSA edges here even though SCCVN can technically
6097 just deal fine with that. */
6098 if (gimple_simplify (stmt
, &res_op
, NULL
, gvalueize
, valueize
))
6100 tree res
= NULL_TREE
;
6101 if (gimple_simplified_result_is_gimple_val (&res_op
))
6102 res
= res_op
.ops
[0];
6103 else if (mprts_hook
)
6104 res
= mprts_hook (&res_op
);
6107 if (dump_file
&& dump_flags
& TDF_DETAILS
)
6109 fprintf (dump_file
, "Match-and-simplified ");
6110 print_gimple_expr (dump_file
, stmt
, 0, TDF_SLIM
);
6111 fprintf (dump_file
, " to ");
6112 print_generic_expr (dump_file
, res
);
6113 fprintf (dump_file
, "\n");
6119 location_t loc
= gimple_location (stmt
);
6120 switch (gimple_code (stmt
))
6124 enum tree_code subcode
= gimple_assign_rhs_code (stmt
);
6126 switch (get_gimple_rhs_class (subcode
))
6128 case GIMPLE_SINGLE_RHS
:
6130 tree rhs
= gimple_assign_rhs1 (stmt
);
6131 enum tree_code_class kind
= TREE_CODE_CLASS (subcode
);
6133 if (TREE_CODE (rhs
) == SSA_NAME
)
6135 /* If the RHS is an SSA_NAME, return its known constant value,
6137 return (*valueize
) (rhs
);
6139 /* Handle propagating invariant addresses into address
6141 else if (TREE_CODE (rhs
) == ADDR_EXPR
6142 && !is_gimple_min_invariant (rhs
))
6144 poly_int64 offset
= 0;
6146 base
= get_addr_base_and_unit_offset_1 (TREE_OPERAND (rhs
, 0),
6150 && (CONSTANT_CLASS_P (base
)
6151 || decl_address_invariant_p (base
)))
6152 return build_invariant_address (TREE_TYPE (rhs
),
6155 else if (TREE_CODE (rhs
) == CONSTRUCTOR
6156 && TREE_CODE (TREE_TYPE (rhs
)) == VECTOR_TYPE
6157 && known_eq (CONSTRUCTOR_NELTS (rhs
),
6158 TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs
))))
6163 nelts
= CONSTRUCTOR_NELTS (rhs
);
6164 tree_vector_builder
vec (TREE_TYPE (rhs
), nelts
, 1);
6165 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs
), i
, val
)
6167 val
= (*valueize
) (val
);
6168 if (TREE_CODE (val
) == INTEGER_CST
6169 || TREE_CODE (val
) == REAL_CST
6170 || TREE_CODE (val
) == FIXED_CST
)
6171 vec
.quick_push (val
);
6176 return vec
.build ();
6178 if (subcode
== OBJ_TYPE_REF
)
6180 tree val
= (*valueize
) (OBJ_TYPE_REF_EXPR (rhs
));
6181 /* If callee is constant, we can fold away the wrapper. */
6182 if (is_gimple_min_invariant (val
))
6186 if (kind
== tcc_reference
)
6188 if ((TREE_CODE (rhs
) == VIEW_CONVERT_EXPR
6189 || TREE_CODE (rhs
) == REALPART_EXPR
6190 || TREE_CODE (rhs
) == IMAGPART_EXPR
)
6191 && TREE_CODE (TREE_OPERAND (rhs
, 0)) == SSA_NAME
)
6193 tree val
= (*valueize
) (TREE_OPERAND (rhs
, 0));
6194 return fold_unary_loc (EXPR_LOCATION (rhs
),
6196 TREE_TYPE (rhs
), val
);
6198 else if (TREE_CODE (rhs
) == BIT_FIELD_REF
6199 && TREE_CODE (TREE_OPERAND (rhs
, 0)) == SSA_NAME
)
6201 tree val
= (*valueize
) (TREE_OPERAND (rhs
, 0));
6202 return fold_ternary_loc (EXPR_LOCATION (rhs
),
6204 TREE_TYPE (rhs
), val
,
6205 TREE_OPERAND (rhs
, 1),
6206 TREE_OPERAND (rhs
, 2));
6208 else if (TREE_CODE (rhs
) == MEM_REF
6209 && TREE_CODE (TREE_OPERAND (rhs
, 0)) == SSA_NAME
)
6211 tree val
= (*valueize
) (TREE_OPERAND (rhs
, 0));
6212 if (TREE_CODE (val
) == ADDR_EXPR
6213 && is_gimple_min_invariant (val
))
6215 tree tem
= fold_build2 (MEM_REF
, TREE_TYPE (rhs
),
6217 TREE_OPERAND (rhs
, 1));
6222 return fold_const_aggregate_ref_1 (rhs
, valueize
);
6224 else if (kind
== tcc_declaration
)
6225 return get_symbol_constant_value (rhs
);
6229 case GIMPLE_UNARY_RHS
:
6232 case GIMPLE_BINARY_RHS
:
6233 /* Translate &x + CST into an invariant form suitable for
6234 further propagation. */
6235 if (subcode
== POINTER_PLUS_EXPR
)
6237 tree op0
= (*valueize
) (gimple_assign_rhs1 (stmt
));
6238 tree op1
= (*valueize
) (gimple_assign_rhs2 (stmt
));
6239 if (TREE_CODE (op0
) == ADDR_EXPR
6240 && TREE_CODE (op1
) == INTEGER_CST
)
6242 tree off
= fold_convert (ptr_type_node
, op1
);
6243 return build_fold_addr_expr_loc
6245 fold_build2 (MEM_REF
,
6246 TREE_TYPE (TREE_TYPE (op0
)),
6247 unshare_expr (op0
), off
));
6250 /* Canonicalize bool != 0 and bool == 0 appearing after
6251 valueization. While gimple_simplify handles this
6252 it can get confused by the ~X == 1 -> X == 0 transform
6253 which we cant reduce to a SSA name or a constant
6254 (and we have no way to tell gimple_simplify to not
6255 consider those transforms in the first place). */
6256 else if (subcode
== EQ_EXPR
6257 || subcode
== NE_EXPR
)
6259 tree lhs
= gimple_assign_lhs (stmt
);
6260 tree op0
= gimple_assign_rhs1 (stmt
);
6261 if (useless_type_conversion_p (TREE_TYPE (lhs
),
6264 tree op1
= (*valueize
) (gimple_assign_rhs2 (stmt
));
6265 op0
= (*valueize
) (op0
);
6266 if (TREE_CODE (op0
) == INTEGER_CST
)
6267 std::swap (op0
, op1
);
6268 if (TREE_CODE (op1
) == INTEGER_CST
6269 && ((subcode
== NE_EXPR
&& integer_zerop (op1
))
6270 || (subcode
== EQ_EXPR
&& integer_onep (op1
))))
6276 case GIMPLE_TERNARY_RHS
:
6278 /* Handle ternary operators that can appear in GIMPLE form. */
6279 tree op0
= (*valueize
) (gimple_assign_rhs1 (stmt
));
6280 tree op1
= (*valueize
) (gimple_assign_rhs2 (stmt
));
6281 tree op2
= (*valueize
) (gimple_assign_rhs3 (stmt
));
6282 return fold_ternary_loc (loc
, subcode
,
6283 gimple_expr_type (stmt
), op0
, op1
, op2
);
6294 gcall
*call_stmt
= as_a
<gcall
*> (stmt
);
6296 if (gimple_call_internal_p (stmt
))
6298 enum tree_code subcode
= ERROR_MARK
;
6299 switch (gimple_call_internal_fn (stmt
))
6301 case IFN_UBSAN_CHECK_ADD
:
6302 subcode
= PLUS_EXPR
;
6304 case IFN_UBSAN_CHECK_SUB
:
6305 subcode
= MINUS_EXPR
;
6307 case IFN_UBSAN_CHECK_MUL
:
6308 subcode
= MULT_EXPR
;
6310 case IFN_BUILTIN_EXPECT
:
6312 tree arg0
= gimple_call_arg (stmt
, 0);
6313 tree op0
= (*valueize
) (arg0
);
6314 if (TREE_CODE (op0
) == INTEGER_CST
)
6321 tree arg0
= gimple_call_arg (stmt
, 0);
6322 tree arg1
= gimple_call_arg (stmt
, 1);
6323 tree op0
= (*valueize
) (arg0
);
6324 tree op1
= (*valueize
) (arg1
);
6326 if (TREE_CODE (op0
) != INTEGER_CST
6327 || TREE_CODE (op1
) != INTEGER_CST
)
6332 /* x * 0 = 0 * x = 0 without overflow. */
6333 if (integer_zerop (op0
) || integer_zerop (op1
))
6334 return build_zero_cst (TREE_TYPE (arg0
));
6337 /* y - y = 0 without overflow. */
6338 if (operand_equal_p (op0
, op1
, 0))
6339 return build_zero_cst (TREE_TYPE (arg0
));
6346 = fold_binary_loc (loc
, subcode
, TREE_TYPE (arg0
), op0
, op1
);
6348 && TREE_CODE (res
) == INTEGER_CST
6349 && !TREE_OVERFLOW (res
))
6354 fn
= (*valueize
) (gimple_call_fn (stmt
));
6355 if (TREE_CODE (fn
) == ADDR_EXPR
6356 && TREE_CODE (TREE_OPERAND (fn
, 0)) == FUNCTION_DECL
6357 && DECL_BUILT_IN (TREE_OPERAND (fn
, 0))
6358 && gimple_builtin_call_types_compatible_p (stmt
,
6359 TREE_OPERAND (fn
, 0)))
6361 tree
*args
= XALLOCAVEC (tree
, gimple_call_num_args (stmt
));
6364 for (i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
6365 args
[i
] = (*valueize
) (gimple_call_arg (stmt
, i
));
6366 retval
= fold_builtin_call_array (loc
,
6367 gimple_call_return_type (call_stmt
),
6368 fn
, gimple_call_num_args (stmt
), args
);
6371 /* fold_call_expr wraps the result inside a NOP_EXPR. */
6372 STRIP_NOPS (retval
);
6373 retval
= fold_convert (gimple_call_return_type (call_stmt
),
6386 /* Fold STMT to a constant using VALUEIZE to valueize SSA names.
6387 Returns NULL_TREE if folding to a constant is not possible, otherwise
6388 returns a constant according to is_gimple_min_invariant. */
6391 gimple_fold_stmt_to_constant (gimple
*stmt
, tree (*valueize
) (tree
))
6393 tree res
= gimple_fold_stmt_to_constant_1 (stmt
, valueize
);
6394 if (res
&& is_gimple_min_invariant (res
))
6400 /* The following set of functions are supposed to fold references using
6401 their constant initializers. */
6403 /* See if we can find constructor defining value of BASE.
6404 When we know the consructor with constant offset (such as
6405 base is array[40] and we do know constructor of array), then
6406 BIT_OFFSET is adjusted accordingly.
6408 As a special case, return error_mark_node when constructor
6409 is not explicitly available, but it is known to be zero
6410 such as 'static const int a;'. */
6412 get_base_constructor (tree base
, poly_int64_pod
*bit_offset
,
6413 tree (*valueize
)(tree
))
6415 poly_int64 bit_offset2
, size
, max_size
;
6418 if (TREE_CODE (base
) == MEM_REF
)
6420 poly_offset_int boff
= *bit_offset
+ mem_ref_offset (base
) * BITS_PER_UNIT
;
6421 if (!boff
.to_shwi (bit_offset
))
6425 && TREE_CODE (TREE_OPERAND (base
, 0)) == SSA_NAME
)
6426 base
= valueize (TREE_OPERAND (base
, 0));
6427 if (!base
|| TREE_CODE (base
) != ADDR_EXPR
)
6429 base
= TREE_OPERAND (base
, 0);
6432 && TREE_CODE (base
) == SSA_NAME
)
6433 base
= valueize (base
);
6435 /* Get a CONSTRUCTOR. If BASE is a VAR_DECL, get its
6436 DECL_INITIAL. If BASE is a nested reference into another
6437 ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
6438 the inner reference. */
6439 switch (TREE_CODE (base
))
6444 tree init
= ctor_for_folding (base
);
6446 /* Our semantic is exact opposite of ctor_for_folding;
6447 NULL means unknown, while error_mark_node is 0. */
6448 if (init
== error_mark_node
)
6451 return error_mark_node
;
6455 case VIEW_CONVERT_EXPR
:
6456 return get_base_constructor (TREE_OPERAND (base
, 0),
6457 bit_offset
, valueize
);
6461 base
= get_ref_base_and_extent (base
, &bit_offset2
, &size
, &max_size
,
6463 if (!known_size_p (max_size
) || maybe_ne (size
, max_size
))
6465 *bit_offset
+= bit_offset2
;
6466 return get_base_constructor (base
, bit_offset
, valueize
);
6472 if (CONSTANT_CLASS_P (base
))
6479 /* CTOR is CONSTRUCTOR of an array type. Fold reference of type TYPE and size
6480 SIZE to the memory at bit OFFSET. */
6483 fold_array_ctor_reference (tree type
, tree ctor
,
6484 unsigned HOST_WIDE_INT offset
,
6485 unsigned HOST_WIDE_INT size
,
6488 offset_int low_bound
;
6489 offset_int elt_size
;
6490 offset_int access_index
;
6491 tree domain_type
= NULL_TREE
;
6492 HOST_WIDE_INT inner_offset
;
6494 /* Compute low bound and elt size. */
6495 if (TREE_CODE (TREE_TYPE (ctor
)) == ARRAY_TYPE
)
6496 domain_type
= TYPE_DOMAIN (TREE_TYPE (ctor
));
6497 if (domain_type
&& TYPE_MIN_VALUE (domain_type
))
6499 /* Static constructors for variably sized objects makes no sense. */
6500 if (TREE_CODE (TYPE_MIN_VALUE (domain_type
)) != INTEGER_CST
)
6502 low_bound
= wi::to_offset (TYPE_MIN_VALUE (domain_type
));
6506 /* Static constructors for variably sized objects makes no sense. */
6507 if (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor
)))) != INTEGER_CST
)
6509 elt_size
= wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor
))));
6511 /* We can handle only constantly sized accesses that are known to not
6512 be larger than size of array element. */
6513 if (!TYPE_SIZE_UNIT (type
)
6514 || TREE_CODE (TYPE_SIZE_UNIT (type
)) != INTEGER_CST
6515 || elt_size
< wi::to_offset (TYPE_SIZE_UNIT (type
))
6519 /* Compute the array index we look for. */
6520 access_index
= wi::udiv_trunc (offset_int (offset
/ BITS_PER_UNIT
),
6522 access_index
+= low_bound
;
6524 /* And offset within the access. */
6525 inner_offset
= offset
% (elt_size
.to_uhwi () * BITS_PER_UNIT
);
6527 /* See if the array field is large enough to span whole access. We do not
6528 care to fold accesses spanning multiple array indexes. */
6529 if (inner_offset
+ size
> elt_size
.to_uhwi () * BITS_PER_UNIT
)
6531 if (tree val
= get_array_ctor_element_at_index (ctor
, access_index
))
6532 return fold_ctor_reference (type
, val
, inner_offset
, size
, from_decl
);
6534 /* When memory is not explicitely mentioned in constructor,
6535 it is 0 (or out of range). */
6536 return build_zero_cst (type
);
6539 /* CTOR is CONSTRUCTOR of an aggregate or vector.
6540 Fold reference of type TYPE and size SIZE to the memory at bit OFFSET. */
6543 fold_nonarray_ctor_reference (tree type
, tree ctor
,
6544 unsigned HOST_WIDE_INT offset
,
6545 unsigned HOST_WIDE_INT size
,
6548 unsigned HOST_WIDE_INT cnt
;
6551 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor
), cnt
, cfield
,
6554 tree byte_offset
= DECL_FIELD_OFFSET (cfield
);
6555 tree field_offset
= DECL_FIELD_BIT_OFFSET (cfield
);
6556 tree field_size
= DECL_SIZE (cfield
);
6557 offset_int bitoffset
;
6558 offset_int bitoffset_end
, access_end
;
6560 /* Variable sized objects in static constructors makes no sense,
6561 but field_size can be NULL for flexible array members. */
6562 gcc_assert (TREE_CODE (field_offset
) == INTEGER_CST
6563 && TREE_CODE (byte_offset
) == INTEGER_CST
6564 && (field_size
!= NULL_TREE
6565 ? TREE_CODE (field_size
) == INTEGER_CST
6566 : TREE_CODE (TREE_TYPE (cfield
)) == ARRAY_TYPE
));
6568 /* Compute bit offset of the field. */
6569 bitoffset
= (wi::to_offset (field_offset
)
6570 + (wi::to_offset (byte_offset
) << LOG2_BITS_PER_UNIT
));
6571 /* Compute bit offset where the field ends. */
6572 if (field_size
!= NULL_TREE
)
6573 bitoffset_end
= bitoffset
+ wi::to_offset (field_size
);
6577 access_end
= offset_int (offset
) + size
;
6579 /* Is there any overlap between [OFFSET, OFFSET+SIZE) and
6580 [BITOFFSET, BITOFFSET_END)? */
6581 if (wi::cmps (access_end
, bitoffset
) > 0
6582 && (field_size
== NULL_TREE
6583 || wi::lts_p (offset
, bitoffset_end
)))
6585 offset_int inner_offset
= offset_int (offset
) - bitoffset
;
6586 /* We do have overlap. Now see if field is large enough to
6587 cover the access. Give up for accesses spanning multiple
6589 if (wi::cmps (access_end
, bitoffset_end
) > 0)
6591 if (offset
< bitoffset
)
6593 return fold_ctor_reference (type
, cval
,
6594 inner_offset
.to_uhwi (), size
,
6598 /* When memory is not explicitely mentioned in constructor, it is 0. */
6599 return build_zero_cst (type
);
6602 /* CTOR is value initializing memory, fold reference of type TYPE and
6603 size POLY_SIZE to the memory at bit POLY_OFFSET. */
6606 fold_ctor_reference (tree type
, tree ctor
, poly_uint64 poly_offset
,
6607 poly_uint64 poly_size
, tree from_decl
)
6611 /* We found the field with exact match. */
6612 if (useless_type_conversion_p (type
, TREE_TYPE (ctor
))
6613 && known_eq (poly_offset
, 0U))
6614 return canonicalize_constructor_val (unshare_expr (ctor
), from_decl
);
6616 /* The remaining optimizations need a constant size and offset. */
6617 unsigned HOST_WIDE_INT size
, offset
;
6618 if (!poly_size
.is_constant (&size
) || !poly_offset
.is_constant (&offset
))
6621 /* We are at the end of walk, see if we can view convert the
6623 if (!AGGREGATE_TYPE_P (TREE_TYPE (ctor
)) && !offset
6624 /* VIEW_CONVERT_EXPR is defined only for matching sizes. */
6625 && !compare_tree_int (TYPE_SIZE (type
), size
)
6626 && !compare_tree_int (TYPE_SIZE (TREE_TYPE (ctor
)), size
))
6628 ret
= canonicalize_constructor_val (unshare_expr (ctor
), from_decl
);
6631 ret
= fold_unary (VIEW_CONVERT_EXPR
, type
, ret
);
6633 STRIP_USELESS_TYPE_CONVERSION (ret
);
6637 /* For constants and byte-aligned/sized reads try to go through
6638 native_encode/interpret. */
6639 if (CONSTANT_CLASS_P (ctor
)
6640 && BITS_PER_UNIT
== 8
6641 && offset
% BITS_PER_UNIT
== 0
6642 && size
% BITS_PER_UNIT
== 0
6643 && size
<= MAX_BITSIZE_MODE_ANY_MODE
)
6645 unsigned char buf
[MAX_BITSIZE_MODE_ANY_MODE
/ BITS_PER_UNIT
];
6646 int len
= native_encode_expr (ctor
, buf
, size
/ BITS_PER_UNIT
,
6647 offset
/ BITS_PER_UNIT
);
6649 return native_interpret_expr (type
, buf
, len
);
6651 if (TREE_CODE (ctor
) == CONSTRUCTOR
)
6654 if (TREE_CODE (TREE_TYPE (ctor
)) == ARRAY_TYPE
6655 || TREE_CODE (TREE_TYPE (ctor
)) == VECTOR_TYPE
)
6656 return fold_array_ctor_reference (type
, ctor
, offset
, size
,
6659 return fold_nonarray_ctor_reference (type
, ctor
, offset
, size
,
6666 /* Return the tree representing the element referenced by T if T is an
6667 ARRAY_REF or COMPONENT_REF into constant aggregates valuezing SSA
6668 names using VALUEIZE. Return NULL_TREE otherwise. */
6671 fold_const_aggregate_ref_1 (tree t
, tree (*valueize
) (tree
))
6673 tree ctor
, idx
, base
;
6674 poly_int64 offset
, size
, max_size
;
6678 if (TREE_THIS_VOLATILE (t
))
6682 return get_symbol_constant_value (t
);
6684 tem
= fold_read_from_constant_string (t
);
6688 switch (TREE_CODE (t
))
6691 case ARRAY_RANGE_REF
:
6692 /* Constant indexes are handled well by get_base_constructor.
6693 Only special case variable offsets.
6694 FIXME: This code can't handle nested references with variable indexes
6695 (they will be handled only by iteration of ccp). Perhaps we can bring
6696 get_ref_base_and_extent here and make it use a valueize callback. */
6697 if (TREE_CODE (TREE_OPERAND (t
, 1)) == SSA_NAME
6699 && (idx
= (*valueize
) (TREE_OPERAND (t
, 1)))
6700 && poly_int_tree_p (idx
))
6702 tree low_bound
, unit_size
;
6704 /* If the resulting bit-offset is constant, track it. */
6705 if ((low_bound
= array_ref_low_bound (t
),
6706 poly_int_tree_p (low_bound
))
6707 && (unit_size
= array_ref_element_size (t
),
6708 tree_fits_uhwi_p (unit_size
)))
6710 poly_offset_int woffset
6711 = wi::sext (wi::to_poly_offset (idx
)
6712 - wi::to_poly_offset (low_bound
),
6713 TYPE_PRECISION (TREE_TYPE (idx
)));
6715 if (woffset
.to_shwi (&offset
))
6717 /* TODO: This code seems wrong, multiply then check
6718 to see if it fits. */
6719 offset
*= tree_to_uhwi (unit_size
);
6720 offset
*= BITS_PER_UNIT
;
6722 base
= TREE_OPERAND (t
, 0);
6723 ctor
= get_base_constructor (base
, &offset
, valueize
);
6724 /* Empty constructor. Always fold to 0. */
6725 if (ctor
== error_mark_node
)
6726 return build_zero_cst (TREE_TYPE (t
));
6727 /* Out of bound array access. Value is undefined,
6729 if (maybe_lt (offset
, 0))
6731 /* We can not determine ctor. */
6734 return fold_ctor_reference (TREE_TYPE (t
), ctor
, offset
,
6735 tree_to_uhwi (unit_size
)
6745 case TARGET_MEM_REF
:
6747 base
= get_ref_base_and_extent (t
, &offset
, &size
, &max_size
, &reverse
);
6748 ctor
= get_base_constructor (base
, &offset
, valueize
);
6750 /* Empty constructor. Always fold to 0. */
6751 if (ctor
== error_mark_node
)
6752 return build_zero_cst (TREE_TYPE (t
));
6753 /* We do not know precise address. */
6754 if (!known_size_p (max_size
) || maybe_ne (max_size
, size
))
6756 /* We can not determine ctor. */
6760 /* Out of bound array access. Value is undefined, but don't fold. */
6761 if (maybe_lt (offset
, 0))
6764 return fold_ctor_reference (TREE_TYPE (t
), ctor
, offset
, size
,
6770 tree c
= fold_const_aggregate_ref_1 (TREE_OPERAND (t
, 0), valueize
);
6771 if (c
&& TREE_CODE (c
) == COMPLEX_CST
)
6772 return fold_build1_loc (EXPR_LOCATION (t
),
6773 TREE_CODE (t
), TREE_TYPE (t
), c
);
6785 fold_const_aggregate_ref (tree t
)
6787 return fold_const_aggregate_ref_1 (t
, NULL
);
6790 /* Lookup virtual method with index TOKEN in a virtual table V
6792 Set CAN_REFER if non-NULL to false if method
6793 is not referable or if the virtual table is ill-formed (such as rewriten
6794 by non-C++ produced symbol). Otherwise just return NULL in that calse. */
6797 gimple_get_virt_method_for_vtable (HOST_WIDE_INT token
,
6799 unsigned HOST_WIDE_INT offset
,
6802 tree vtable
= v
, init
, fn
;
6803 unsigned HOST_WIDE_INT size
;
6804 unsigned HOST_WIDE_INT elt_size
, access_index
;
6810 /* First of all double check we have virtual table. */
6811 if (!VAR_P (v
) || !DECL_VIRTUAL_P (v
))
6813 /* Pass down that we lost track of the target. */
6819 init
= ctor_for_folding (v
);
6821 /* The virtual tables should always be born with constructors
6822 and we always should assume that they are avaialble for
6823 folding. At the moment we do not stream them in all cases,
6824 but it should never happen that ctor seem unreachable. */
6826 if (init
== error_mark_node
)
6828 /* Pass down that we lost track of the target. */
6833 gcc_checking_assert (TREE_CODE (TREE_TYPE (v
)) == ARRAY_TYPE
);
6834 size
= tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (v
))));
6835 offset
*= BITS_PER_UNIT
;
6836 offset
+= token
* size
;
6838 /* Lookup the value in the constructor that is assumed to be array.
6839 This is equivalent to
6840 fn = fold_ctor_reference (TREE_TYPE (TREE_TYPE (v)), init,
6841 offset, size, NULL);
6842 but in a constant time. We expect that frontend produced a simple
6843 array without indexed initializers. */
6845 gcc_checking_assert (TREE_CODE (TREE_TYPE (init
)) == ARRAY_TYPE
);
6846 domain_type
= TYPE_DOMAIN (TREE_TYPE (init
));
6847 gcc_checking_assert (integer_zerop (TYPE_MIN_VALUE (domain_type
)));
6848 elt_size
= tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (init
))));
6850 access_index
= offset
/ BITS_PER_UNIT
/ elt_size
;
6851 gcc_checking_assert (offset
% (elt_size
* BITS_PER_UNIT
) == 0);
6853 /* This code makes an assumption that there are no
6854 indexed fileds produced by C++ FE, so we can directly index the array. */
6855 if (access_index
< CONSTRUCTOR_NELTS (init
))
6857 fn
= CONSTRUCTOR_ELT (init
, access_index
)->value
;
6858 gcc_checking_assert (!CONSTRUCTOR_ELT (init
, access_index
)->index
);
6864 /* For type inconsistent program we may end up looking up virtual method
6865 in virtual table that does not contain TOKEN entries. We may overrun
6866 the virtual table and pick up a constant or RTTI info pointer.
6867 In any case the call is undefined. */
6869 || (TREE_CODE (fn
) != ADDR_EXPR
&& TREE_CODE (fn
) != FDESC_EXPR
)
6870 || TREE_CODE (TREE_OPERAND (fn
, 0)) != FUNCTION_DECL
)
6871 fn
= builtin_decl_implicit (BUILT_IN_UNREACHABLE
);
6874 fn
= TREE_OPERAND (fn
, 0);
6876 /* When cgraph node is missing and function is not public, we cannot
6877 devirtualize. This can happen in WHOPR when the actual method
6878 ends up in other partition, because we found devirtualization
6879 possibility too late. */
6880 if (!can_refer_decl_in_current_unit_p (fn
, vtable
))
6891 /* Make sure we create a cgraph node for functions we'll reference.
6892 They can be non-existent if the reference comes from an entry
6893 of an external vtable for example. */
6894 cgraph_node::get_create (fn
);
6899 /* Return a declaration of a function which an OBJ_TYPE_REF references. TOKEN
6900 is integer form of OBJ_TYPE_REF_TOKEN of the reference expression.
6901 KNOWN_BINFO carries the binfo describing the true type of
6902 OBJ_TYPE_REF_OBJECT(REF).
6903 Set CAN_REFER if non-NULL to false if method
6904 is not referable or if the virtual table is ill-formed (such as rewriten
6905 by non-C++ produced symbol). Otherwise just return NULL in that calse. */
6908 gimple_get_virt_method_for_binfo (HOST_WIDE_INT token
, tree known_binfo
,
6911 unsigned HOST_WIDE_INT offset
;
6914 v
= BINFO_VTABLE (known_binfo
);
6915 /* If there is no virtual methods table, leave the OBJ_TYPE_REF alone. */
6919 if (!vtable_pointer_value_to_vtable (v
, &v
, &offset
))
6925 return gimple_get_virt_method_for_vtable (token
, v
, offset
, can_refer
);
6928 /* Given a pointer value T, return a simplified version of an
6929 indirection through T, or NULL_TREE if no simplification is
6930 possible. Note that the resulting type may be different from
6931 the type pointed to in the sense that it is still compatible
6932 from the langhooks point of view. */
6935 gimple_fold_indirect_ref (tree t
)
6937 tree ptype
= TREE_TYPE (t
), type
= TREE_TYPE (ptype
);
6942 subtype
= TREE_TYPE (sub
);
6943 if (!POINTER_TYPE_P (subtype
)
6944 || TYPE_REF_CAN_ALIAS_ALL (ptype
))
6947 if (TREE_CODE (sub
) == ADDR_EXPR
)
6949 tree op
= TREE_OPERAND (sub
, 0);
6950 tree optype
= TREE_TYPE (op
);
6952 if (useless_type_conversion_p (type
, optype
))
6955 /* *(foo *)&fooarray => fooarray[0] */
6956 if (TREE_CODE (optype
) == ARRAY_TYPE
6957 && TREE_CODE (TYPE_SIZE (TREE_TYPE (optype
))) == INTEGER_CST
6958 && useless_type_conversion_p (type
, TREE_TYPE (optype
)))
6960 tree type_domain
= TYPE_DOMAIN (optype
);
6961 tree min_val
= size_zero_node
;
6962 if (type_domain
&& TYPE_MIN_VALUE (type_domain
))
6963 min_val
= TYPE_MIN_VALUE (type_domain
);
6964 if (TREE_CODE (min_val
) == INTEGER_CST
)
6965 return build4 (ARRAY_REF
, type
, op
, min_val
, NULL_TREE
, NULL_TREE
);
6967 /* *(foo *)&complexfoo => __real__ complexfoo */
6968 else if (TREE_CODE (optype
) == COMPLEX_TYPE
6969 && useless_type_conversion_p (type
, TREE_TYPE (optype
)))
6970 return fold_build1 (REALPART_EXPR
, type
, op
);
6971 /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
6972 else if (TREE_CODE (optype
) == VECTOR_TYPE
6973 && useless_type_conversion_p (type
, TREE_TYPE (optype
)))
6975 tree part_width
= TYPE_SIZE (type
);
6976 tree index
= bitsize_int (0);
6977 return fold_build3 (BIT_FIELD_REF
, type
, op
, part_width
, index
);
6981 /* *(p + CST) -> ... */
6982 if (TREE_CODE (sub
) == POINTER_PLUS_EXPR
6983 && TREE_CODE (TREE_OPERAND (sub
, 1)) == INTEGER_CST
)
6985 tree addr
= TREE_OPERAND (sub
, 0);
6986 tree off
= TREE_OPERAND (sub
, 1);
6990 addrtype
= TREE_TYPE (addr
);
6992 /* ((foo*)&vectorfoo)[1] -> BIT_FIELD_REF<vectorfoo,...> */
6993 if (TREE_CODE (addr
) == ADDR_EXPR
6994 && TREE_CODE (TREE_TYPE (addrtype
)) == VECTOR_TYPE
6995 && useless_type_conversion_p (type
, TREE_TYPE (TREE_TYPE (addrtype
)))
6996 && tree_fits_uhwi_p (off
))
6998 unsigned HOST_WIDE_INT offset
= tree_to_uhwi (off
);
6999 tree part_width
= TYPE_SIZE (type
);
7000 unsigned HOST_WIDE_INT part_widthi
7001 = tree_to_shwi (part_width
) / BITS_PER_UNIT
;
7002 unsigned HOST_WIDE_INT indexi
= offset
* BITS_PER_UNIT
;
7003 tree index
= bitsize_int (indexi
);
7004 if (known_lt (offset
/ part_widthi
,
7005 TYPE_VECTOR_SUBPARTS (TREE_TYPE (addrtype
))))
7006 return fold_build3 (BIT_FIELD_REF
, type
, TREE_OPERAND (addr
, 0),
7010 /* ((foo*)&complexfoo)[1] -> __imag__ complexfoo */
7011 if (TREE_CODE (addr
) == ADDR_EXPR
7012 && TREE_CODE (TREE_TYPE (addrtype
)) == COMPLEX_TYPE
7013 && useless_type_conversion_p (type
, TREE_TYPE (TREE_TYPE (addrtype
))))
7015 tree size
= TYPE_SIZE_UNIT (type
);
7016 if (tree_int_cst_equal (size
, off
))
7017 return fold_build1 (IMAGPART_EXPR
, type
, TREE_OPERAND (addr
, 0));
7020 /* *(p + CST) -> MEM_REF <p, CST>. */
7021 if (TREE_CODE (addr
) != ADDR_EXPR
7022 || DECL_P (TREE_OPERAND (addr
, 0)))
7023 return fold_build2 (MEM_REF
, type
,
7025 wide_int_to_tree (ptype
, wi::to_wide (off
)));
7028 /* *(foo *)fooarrptr => (*fooarrptr)[0] */
7029 if (TREE_CODE (TREE_TYPE (subtype
)) == ARRAY_TYPE
7030 && TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (subtype
)))) == INTEGER_CST
7031 && useless_type_conversion_p (type
, TREE_TYPE (TREE_TYPE (subtype
))))
7034 tree min_val
= size_zero_node
;
7036 sub
= gimple_fold_indirect_ref (sub
);
7038 sub
= build1 (INDIRECT_REF
, TREE_TYPE (subtype
), osub
);
7039 type_domain
= TYPE_DOMAIN (TREE_TYPE (sub
));
7040 if (type_domain
&& TYPE_MIN_VALUE (type_domain
))
7041 min_val
= TYPE_MIN_VALUE (type_domain
);
7042 if (TREE_CODE (min_val
) == INTEGER_CST
)
7043 return build4 (ARRAY_REF
, type
, sub
, min_val
, NULL_TREE
, NULL_TREE
);
7049 /* Return true if CODE is an operation that when operating on signed
7050 integer types involves undefined behavior on overflow and the
7051 operation can be expressed with unsigned arithmetic. */
7054 arith_code_with_undefined_signed_overflow (tree_code code
)
7062 case POINTER_PLUS_EXPR
:
7069 /* Rewrite STMT, an assignment with a signed integer or pointer arithmetic
7070 operation that can be transformed to unsigned arithmetic by converting
7071 its operand, carrying out the operation in the corresponding unsigned
7072 type and converting the result back to the original type.
7074 Returns a sequence of statements that replace STMT and also contain
7075 a modified form of STMT itself. */
7078 rewrite_to_defined_overflow (gimple
*stmt
)
7080 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
7082 fprintf (dump_file
, "rewriting stmt with undefined signed "
7084 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
7087 tree lhs
= gimple_assign_lhs (stmt
);
7088 tree type
= unsigned_type_for (TREE_TYPE (lhs
));
7089 gimple_seq stmts
= NULL
;
7090 for (unsigned i
= 1; i
< gimple_num_ops (stmt
); ++i
)
7092 tree op
= gimple_op (stmt
, i
);
7093 op
= gimple_convert (&stmts
, type
, op
);
7094 gimple_set_op (stmt
, i
, op
);
7096 gimple_assign_set_lhs (stmt
, make_ssa_name (type
, stmt
));
7097 if (gimple_assign_rhs_code (stmt
) == POINTER_PLUS_EXPR
)
7098 gimple_assign_set_rhs_code (stmt
, PLUS_EXPR
);
7099 gimple_seq_add_stmt (&stmts
, stmt
);
7100 gimple
*cvt
= gimple_build_assign (lhs
, NOP_EXPR
, gimple_assign_lhs (stmt
));
7101 gimple_seq_add_stmt (&stmts
, cvt
);
7107 /* The valueization hook we use for the gimple_build API simplification.
7108 This makes us match fold_buildN behavior by only combining with
7109 statements in the sequence(s) we are currently building. */
7112 gimple_build_valueize (tree op
)
7114 if (gimple_bb (SSA_NAME_DEF_STMT (op
)) == NULL
)
7119 /* Build the expression CODE OP0 of type TYPE with location LOC,
7120 simplifying it first if possible. Returns the built
7121 expression value and appends statements possibly defining it
7125 gimple_build (gimple_seq
*seq
, location_t loc
,
7126 enum tree_code code
, tree type
, tree op0
)
7128 tree res
= gimple_simplify (code
, type
, op0
, seq
, gimple_build_valueize
);
7131 res
= create_tmp_reg_or_ssa_name (type
);
7133 if (code
== REALPART_EXPR
7134 || code
== IMAGPART_EXPR
7135 || code
== VIEW_CONVERT_EXPR
)
7136 stmt
= gimple_build_assign (res
, code
, build1 (code
, type
, op0
));
7138 stmt
= gimple_build_assign (res
, code
, op0
);
7139 gimple_set_location (stmt
, loc
);
7140 gimple_seq_add_stmt_without_update (seq
, stmt
);
7145 /* Build the expression OP0 CODE OP1 of type TYPE with location LOC,
7146 simplifying it first if possible. Returns the built
7147 expression value and appends statements possibly defining it
7151 gimple_build (gimple_seq
*seq
, location_t loc
,
7152 enum tree_code code
, tree type
, tree op0
, tree op1
)
7154 tree res
= gimple_simplify (code
, type
, op0
, op1
, seq
, gimple_build_valueize
);
7157 res
= create_tmp_reg_or_ssa_name (type
);
7158 gimple
*stmt
= gimple_build_assign (res
, code
, op0
, op1
);
7159 gimple_set_location (stmt
, loc
);
7160 gimple_seq_add_stmt_without_update (seq
, stmt
);
7165 /* Build the expression (CODE OP0 OP1 OP2) of type TYPE with location LOC,
7166 simplifying it first if possible. Returns the built
7167 expression value and appends statements possibly defining it
7171 gimple_build (gimple_seq
*seq
, location_t loc
,
7172 enum tree_code code
, tree type
, tree op0
, tree op1
, tree op2
)
7174 tree res
= gimple_simplify (code
, type
, op0
, op1
, op2
,
7175 seq
, gimple_build_valueize
);
7178 res
= create_tmp_reg_or_ssa_name (type
);
7180 if (code
== BIT_FIELD_REF
)
7181 stmt
= gimple_build_assign (res
, code
,
7182 build3 (code
, type
, op0
, op1
, op2
));
7184 stmt
= gimple_build_assign (res
, code
, op0
, op1
, op2
);
7185 gimple_set_location (stmt
, loc
);
7186 gimple_seq_add_stmt_without_update (seq
, stmt
);
7191 /* Build the call FN (ARG0) with a result of type TYPE
7192 (or no result if TYPE is void) with location LOC,
7193 simplifying it first if possible. Returns the built
7194 expression value (or NULL_TREE if TYPE is void) and appends
7195 statements possibly defining it to SEQ. */
7198 gimple_build (gimple_seq
*seq
, location_t loc
, combined_fn fn
,
7199 tree type
, tree arg0
)
7201 tree res
= gimple_simplify (fn
, type
, arg0
, seq
, gimple_build_valueize
);
7205 if (internal_fn_p (fn
))
7206 stmt
= gimple_build_call_internal (as_internal_fn (fn
), 1, arg0
);
7209 tree decl
= builtin_decl_implicit (as_builtin_fn (fn
));
7210 stmt
= gimple_build_call (decl
, 1, arg0
);
7212 if (!VOID_TYPE_P (type
))
7214 res
= create_tmp_reg_or_ssa_name (type
);
7215 gimple_call_set_lhs (stmt
, res
);
7217 gimple_set_location (stmt
, loc
);
7218 gimple_seq_add_stmt_without_update (seq
, stmt
);
7223 /* Build the call FN (ARG0, ARG1) with a result of type TYPE
7224 (or no result if TYPE is void) with location LOC,
7225 simplifying it first if possible. Returns the built
7226 expression value (or NULL_TREE if TYPE is void) and appends
7227 statements possibly defining it to SEQ. */
7230 gimple_build (gimple_seq
*seq
, location_t loc
, combined_fn fn
,
7231 tree type
, tree arg0
, tree arg1
)
7233 tree res
= gimple_simplify (fn
, type
, arg0
, arg1
, seq
, gimple_build_valueize
);
7237 if (internal_fn_p (fn
))
7238 stmt
= gimple_build_call_internal (as_internal_fn (fn
), 2, arg0
, arg1
);
7241 tree decl
= builtin_decl_implicit (as_builtin_fn (fn
));
7242 stmt
= gimple_build_call (decl
, 2, arg0
, arg1
);
7244 if (!VOID_TYPE_P (type
))
7246 res
= create_tmp_reg_or_ssa_name (type
);
7247 gimple_call_set_lhs (stmt
, res
);
7249 gimple_set_location (stmt
, loc
);
7250 gimple_seq_add_stmt_without_update (seq
, stmt
);
7255 /* Build the call FN (ARG0, ARG1, ARG2) with a result of type TYPE
7256 (or no result if TYPE is void) with location LOC,
7257 simplifying it first if possible. Returns the built
7258 expression value (or NULL_TREE if TYPE is void) and appends
7259 statements possibly defining it to SEQ. */
7262 gimple_build (gimple_seq
*seq
, location_t loc
, combined_fn fn
,
7263 tree type
, tree arg0
, tree arg1
, tree arg2
)
7265 tree res
= gimple_simplify (fn
, type
, arg0
, arg1
, arg2
,
7266 seq
, gimple_build_valueize
);
7270 if (internal_fn_p (fn
))
7271 stmt
= gimple_build_call_internal (as_internal_fn (fn
),
7272 3, arg0
, arg1
, arg2
);
7275 tree decl
= builtin_decl_implicit (as_builtin_fn (fn
));
7276 stmt
= gimple_build_call (decl
, 3, arg0
, arg1
, arg2
);
7278 if (!VOID_TYPE_P (type
))
7280 res
= create_tmp_reg_or_ssa_name (type
);
7281 gimple_call_set_lhs (stmt
, res
);
7283 gimple_set_location (stmt
, loc
);
7284 gimple_seq_add_stmt_without_update (seq
, stmt
);
7289 /* Build the conversion (TYPE) OP with a result of type TYPE
7290 with location LOC if such conversion is neccesary in GIMPLE,
7291 simplifying it first.
7292 Returns the built expression value and appends
7293 statements possibly defining it to SEQ. */
7296 gimple_convert (gimple_seq
*seq
, location_t loc
, tree type
, tree op
)
7298 if (useless_type_conversion_p (type
, TREE_TYPE (op
)))
7300 return gimple_build (seq
, loc
, NOP_EXPR
, type
, op
);
7303 /* Build the conversion (ptrofftype) OP with a result of a type
7304 compatible with ptrofftype with location LOC if such conversion
7305 is neccesary in GIMPLE, simplifying it first.
7306 Returns the built expression value and appends
7307 statements possibly defining it to SEQ. */
7310 gimple_convert_to_ptrofftype (gimple_seq
*seq
, location_t loc
, tree op
)
7312 if (ptrofftype_p (TREE_TYPE (op
)))
7314 return gimple_convert (seq
, loc
, sizetype
, op
);
7317 /* Build a vector of type TYPE in which each element has the value OP.
7318 Return a gimple value for the result, appending any new statements
7322 gimple_build_vector_from_val (gimple_seq
*seq
, location_t loc
, tree type
,
7325 if (!TYPE_VECTOR_SUBPARTS (type
).is_constant ()
7326 && !CONSTANT_CLASS_P (op
))
7327 return gimple_build (seq
, loc
, VEC_DUPLICATE_EXPR
, type
, op
);
7329 tree res
, vec
= build_vector_from_val (type
, op
);
7330 if (is_gimple_val (vec
))
7332 if (gimple_in_ssa_p (cfun
))
7333 res
= make_ssa_name (type
);
7335 res
= create_tmp_reg (type
);
7336 gimple
*stmt
= gimple_build_assign (res
, vec
);
7337 gimple_set_location (stmt
, loc
);
7338 gimple_seq_add_stmt_without_update (seq
, stmt
);
7342 /* Build a vector from BUILDER, handling the case in which some elements
7343 are non-constant. Return a gimple value for the result, appending any
7344 new instructions to SEQ.
7346 BUILDER must not have a stepped encoding on entry. This is because
7347 the function is not geared up to handle the arithmetic that would
7348 be needed in the variable case, and any code building a vector that
7349 is known to be constant should use BUILDER->build () directly. */
7352 gimple_build_vector (gimple_seq
*seq
, location_t loc
,
7353 tree_vector_builder
*builder
)
7355 gcc_assert (builder
->nelts_per_pattern () <= 2);
7356 unsigned int encoded_nelts
= builder
->encoded_nelts ();
7357 for (unsigned int i
= 0; i
< encoded_nelts
; ++i
)
7358 if (!TREE_CONSTANT ((*builder
)[i
]))
7360 tree type
= builder
->type ();
7361 unsigned int nelts
= TYPE_VECTOR_SUBPARTS (type
).to_constant ();
7362 vec
<constructor_elt
, va_gc
> *v
;
7363 vec_alloc (v
, nelts
);
7364 for (i
= 0; i
< nelts
; ++i
)
7365 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
, builder
->elt (i
));
7368 if (gimple_in_ssa_p (cfun
))
7369 res
= make_ssa_name (type
);
7371 res
= create_tmp_reg (type
);
7372 gimple
*stmt
= gimple_build_assign (res
, build_constructor (type
, v
));
7373 gimple_set_location (stmt
, loc
);
7374 gimple_seq_add_stmt_without_update (seq
, stmt
);
7377 return builder
->build ();
7380 /* Return true if the result of assignment STMT is known to be non-negative.
7381 If the return value is based on the assumption that signed overflow is
7382 undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
7383 *STRICT_OVERFLOW_P. DEPTH is the current nesting depth of the query. */
7386 gimple_assign_nonnegative_warnv_p (gimple
*stmt
, bool *strict_overflow_p
,
7389 enum tree_code code
= gimple_assign_rhs_code (stmt
);
7390 switch (get_gimple_rhs_class (code
))
7392 case GIMPLE_UNARY_RHS
:
7393 return tree_unary_nonnegative_warnv_p (gimple_assign_rhs_code (stmt
),
7394 gimple_expr_type (stmt
),
7395 gimple_assign_rhs1 (stmt
),
7396 strict_overflow_p
, depth
);
7397 case GIMPLE_BINARY_RHS
:
7398 return tree_binary_nonnegative_warnv_p (gimple_assign_rhs_code (stmt
),
7399 gimple_expr_type (stmt
),
7400 gimple_assign_rhs1 (stmt
),
7401 gimple_assign_rhs2 (stmt
),
7402 strict_overflow_p
, depth
);
7403 case GIMPLE_TERNARY_RHS
:
7405 case GIMPLE_SINGLE_RHS
:
7406 return tree_single_nonnegative_warnv_p (gimple_assign_rhs1 (stmt
),
7407 strict_overflow_p
, depth
);
7408 case GIMPLE_INVALID_RHS
:
7414 /* Return true if return value of call STMT is known to be non-negative.
7415 If the return value is based on the assumption that signed overflow is
7416 undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
7417 *STRICT_OVERFLOW_P. DEPTH is the current nesting depth of the query. */
7420 gimple_call_nonnegative_warnv_p (gimple
*stmt
, bool *strict_overflow_p
,
7423 tree arg0
= gimple_call_num_args (stmt
) > 0 ?
7424 gimple_call_arg (stmt
, 0) : NULL_TREE
;
7425 tree arg1
= gimple_call_num_args (stmt
) > 1 ?
7426 gimple_call_arg (stmt
, 1) : NULL_TREE
;
7428 return tree_call_nonnegative_warnv_p (gimple_expr_type (stmt
),
7429 gimple_call_combined_fn (stmt
),
7432 strict_overflow_p
, depth
);
7435 /* Return true if return value of call STMT is known to be non-negative.
7436 If the return value is based on the assumption that signed overflow is
7437 undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
7438 *STRICT_OVERFLOW_P. DEPTH is the current nesting depth of the query. */
7441 gimple_phi_nonnegative_warnv_p (gimple
*stmt
, bool *strict_overflow_p
,
7444 for (unsigned i
= 0; i
< gimple_phi_num_args (stmt
); ++i
)
7446 tree arg
= gimple_phi_arg_def (stmt
, i
);
7447 if (!tree_single_nonnegative_warnv_p (arg
, strict_overflow_p
, depth
+ 1))
7453 /* Return true if STMT is known to compute a non-negative value.
7454 If the return value is based on the assumption that signed overflow is
7455 undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
7456 *STRICT_OVERFLOW_P. DEPTH is the current nesting depth of the query. */
7459 gimple_stmt_nonnegative_warnv_p (gimple
*stmt
, bool *strict_overflow_p
,
7462 switch (gimple_code (stmt
))
7465 return gimple_assign_nonnegative_warnv_p (stmt
, strict_overflow_p
,
7468 return gimple_call_nonnegative_warnv_p (stmt
, strict_overflow_p
,
7471 return gimple_phi_nonnegative_warnv_p (stmt
, strict_overflow_p
,
7478 /* Return true if the floating-point value computed by assignment STMT
7479 is known to have an integer value. We also allow +Inf, -Inf and NaN
7480 to be considered integer values. Return false for signaling NaN.
7482 DEPTH is the current nesting depth of the query. */
7485 gimple_assign_integer_valued_real_p (gimple
*stmt
, int depth
)
7487 enum tree_code code
= gimple_assign_rhs_code (stmt
);
7488 switch (get_gimple_rhs_class (code
))
7490 case GIMPLE_UNARY_RHS
:
7491 return integer_valued_real_unary_p (gimple_assign_rhs_code (stmt
),
7492 gimple_assign_rhs1 (stmt
), depth
);
7493 case GIMPLE_BINARY_RHS
:
7494 return integer_valued_real_binary_p (gimple_assign_rhs_code (stmt
),
7495 gimple_assign_rhs1 (stmt
),
7496 gimple_assign_rhs2 (stmt
), depth
);
7497 case GIMPLE_TERNARY_RHS
:
7499 case GIMPLE_SINGLE_RHS
:
7500 return integer_valued_real_single_p (gimple_assign_rhs1 (stmt
), depth
);
7501 case GIMPLE_INVALID_RHS
:
7507 /* Return true if the floating-point value computed by call STMT is known
7508 to have an integer value. We also allow +Inf, -Inf and NaN to be
7509 considered integer values. Return false for signaling NaN.
7511 DEPTH is the current nesting depth of the query. */
7514 gimple_call_integer_valued_real_p (gimple
*stmt
, int depth
)
7516 tree arg0
= (gimple_call_num_args (stmt
) > 0
7517 ? gimple_call_arg (stmt
, 0)
7519 tree arg1
= (gimple_call_num_args (stmt
) > 1
7520 ? gimple_call_arg (stmt
, 1)
7522 return integer_valued_real_call_p (gimple_call_combined_fn (stmt
),
7526 /* Return true if the floating-point result of phi STMT is known to have
7527 an integer value. We also allow +Inf, -Inf and NaN to be considered
7528 integer values. Return false for signaling NaN.
7530 DEPTH is the current nesting depth of the query. */
7533 gimple_phi_integer_valued_real_p (gimple
*stmt
, int depth
)
7535 for (unsigned i
= 0; i
< gimple_phi_num_args (stmt
); ++i
)
7537 tree arg
= gimple_phi_arg_def (stmt
, i
);
7538 if (!integer_valued_real_single_p (arg
, depth
+ 1))
7544 /* Return true if the floating-point value computed by STMT is known
7545 to have an integer value. We also allow +Inf, -Inf and NaN to be
7546 considered integer values. Return false for signaling NaN.
7548 DEPTH is the current nesting depth of the query. */
7551 gimple_stmt_integer_valued_real_p (gimple
*stmt
, int depth
)
7553 switch (gimple_code (stmt
))
7556 return gimple_assign_integer_valued_real_p (stmt
, depth
);
7558 return gimple_call_integer_valued_real_p (stmt
, depth
);
7560 return gimple_phi_integer_valued_real_p (stmt
, depth
);