1 /* Statement simplification on GIMPLE.
2 Copyright (C) 2010-2015 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 "fold-const.h"
36 #include "stor-layout.h"
38 #include "gimple-fold.h"
40 #include "gimple-iterator.h"
41 #include "tree-into-ssa.h"
44 #include "tree-ssa-propagate.h"
45 #include "ipa-utils.h"
46 #include "tree-ssa-address.h"
47 #include "langhooks.h"
48 #include "gimplify-me.h"
52 #include "gimple-match.h"
53 #include "gomp-constants.h"
54 #include "optabs-query.h"
59 /* Return true when DECL can be referenced from current unit.
60 FROM_DECL (if non-null) specify constructor of variable DECL was taken from.
61 We can get declarations that are not possible to reference for various
64 1) When analyzing C++ virtual tables.
65 C++ virtual tables do have known constructors even
66 when they are keyed to other compilation unit.
67 Those tables can contain pointers to methods and vars
68 in other units. Those methods have both STATIC and EXTERNAL
70 2) In WHOPR mode devirtualization might lead to reference
71 to method that was partitioned elsehwere.
72 In this case we have static VAR_DECL or FUNCTION_DECL
73 that has no corresponding callgraph/varpool node
75 3) COMDAT functions referred by external vtables that
76 we devirtualize only during final compilation stage.
77 At this time we already decided that we will not output
78 the function body and thus we can't reference the symbol
82 can_refer_decl_in_current_unit_p (tree decl
, tree from_decl
)
85 struct cgraph_node
*node
;
88 if (DECL_ABSTRACT_P (decl
))
91 /* We are concerned only about static/external vars and functions. */
92 if ((!TREE_STATIC (decl
) && !DECL_EXTERNAL (decl
))
93 || (TREE_CODE (decl
) != VAR_DECL
&& TREE_CODE (decl
) != FUNCTION_DECL
))
96 /* Static objects can be referred only if they was not optimized out yet. */
97 if (!TREE_PUBLIC (decl
) && !DECL_EXTERNAL (decl
))
99 /* Before we start optimizing unreachable code we can be sure all
100 static objects are defined. */
101 if (symtab
->function_flags_ready
)
103 snode
= symtab_node::get (decl
);
104 if (!snode
|| !snode
->definition
)
106 node
= dyn_cast
<cgraph_node
*> (snode
);
107 return !node
|| !node
->global
.inlined_to
;
110 /* We will later output the initializer, so we can refer to it.
111 So we are concerned only when DECL comes from initializer of
112 external var or var that has been optimized out. */
114 || TREE_CODE (from_decl
) != VAR_DECL
115 || (!DECL_EXTERNAL (from_decl
)
116 && (vnode
= varpool_node::get (from_decl
)) != NULL
117 && vnode
->definition
)
119 && (vnode
= varpool_node::get (from_decl
)) != NULL
120 && vnode
->in_other_partition
))
122 /* We are folding reference from external vtable. The vtable may reffer
123 to a symbol keyed to other compilation unit. The other compilation
124 unit may be in separate DSO and the symbol may be hidden. */
125 if (DECL_VISIBILITY_SPECIFIED (decl
)
126 && DECL_EXTERNAL (decl
)
127 && DECL_VISIBILITY (decl
) != VISIBILITY_DEFAULT
128 && (!(snode
= symtab_node::get (decl
)) || !snode
->in_other_partition
))
130 /* When function is public, we always can introduce new reference.
131 Exception are the COMDAT functions where introducing a direct
132 reference imply need to include function body in the curren tunit. */
133 if (TREE_PUBLIC (decl
) && !DECL_COMDAT (decl
))
135 /* We have COMDAT. We are going to check if we still have definition
136 or if the definition is going to be output in other partition.
137 Bypass this when gimplifying; all needed functions will be produced.
139 As observed in PR20991 for already optimized out comdat virtual functions
140 it may be tempting to not necessarily give up because the copy will be
141 output elsewhere when corresponding vtable is output.
142 This is however not possible - ABI specify that COMDATs are output in
143 units where they are used and when the other unit was compiled with LTO
144 it is possible that vtable was kept public while the function itself
146 if (!symtab
->function_flags_ready
)
149 snode
= symtab_node::get (decl
);
151 || ((!snode
->definition
|| DECL_EXTERNAL (decl
))
152 && (!snode
->in_other_partition
153 || (!snode
->forced_by_abi
&& !snode
->force_output
))))
155 node
= dyn_cast
<cgraph_node
*> (snode
);
156 return !node
|| !node
->global
.inlined_to
;
159 /* CVAL is value taken from DECL_INITIAL of variable. Try to transform it into
160 acceptable form for is_gimple_min_invariant.
161 FROM_DECL (if non-NULL) specify variable whose constructor contains CVAL. */
164 canonicalize_constructor_val (tree cval
, tree from_decl
)
166 tree orig_cval
= cval
;
168 if (TREE_CODE (cval
) == POINTER_PLUS_EXPR
169 && TREE_CODE (TREE_OPERAND (cval
, 1)) == INTEGER_CST
)
171 tree ptr
= TREE_OPERAND (cval
, 0);
172 if (is_gimple_min_invariant (ptr
))
173 cval
= build1_loc (EXPR_LOCATION (cval
),
174 ADDR_EXPR
, TREE_TYPE (ptr
),
175 fold_build2 (MEM_REF
, TREE_TYPE (TREE_TYPE (ptr
)),
177 fold_convert (ptr_type_node
,
178 TREE_OPERAND (cval
, 1))));
180 if (TREE_CODE (cval
) == ADDR_EXPR
)
182 tree base
= NULL_TREE
;
183 if (TREE_CODE (TREE_OPERAND (cval
, 0)) == COMPOUND_LITERAL_EXPR
)
185 base
= COMPOUND_LITERAL_EXPR_DECL (TREE_OPERAND (cval
, 0));
187 TREE_OPERAND (cval
, 0) = base
;
190 base
= get_base_address (TREE_OPERAND (cval
, 0));
194 if ((TREE_CODE (base
) == VAR_DECL
195 || TREE_CODE (base
) == FUNCTION_DECL
)
196 && !can_refer_decl_in_current_unit_p (base
, from_decl
))
198 if (TREE_CODE (base
) == VAR_DECL
)
199 TREE_ADDRESSABLE (base
) = 1;
200 else if (TREE_CODE (base
) == FUNCTION_DECL
)
202 /* Make sure we create a cgraph node for functions we'll reference.
203 They can be non-existent if the reference comes from an entry
204 of an external vtable for example. */
205 cgraph_node::get_create (base
);
207 /* Fixup types in global initializers. */
208 if (TREE_TYPE (TREE_TYPE (cval
)) != TREE_TYPE (TREE_OPERAND (cval
, 0)))
209 cval
= build_fold_addr_expr (TREE_OPERAND (cval
, 0));
211 if (!useless_type_conversion_p (TREE_TYPE (orig_cval
), TREE_TYPE (cval
)))
212 cval
= fold_convert (TREE_TYPE (orig_cval
), cval
);
215 if (TREE_OVERFLOW_P (cval
))
216 return drop_tree_overflow (cval
);
220 /* If SYM is a constant variable with known value, return the value.
221 NULL_TREE is returned otherwise. */
224 get_symbol_constant_value (tree sym
)
226 tree val
= ctor_for_folding (sym
);
227 if (val
!= error_mark_node
)
231 val
= canonicalize_constructor_val (unshare_expr (val
), sym
);
232 if (val
&& is_gimple_min_invariant (val
))
237 /* Variables declared 'const' without an initializer
238 have zero as the initializer if they may not be
239 overridden at link or run time. */
241 && is_gimple_reg_type (TREE_TYPE (sym
)))
242 return build_zero_cst (TREE_TYPE (sym
));
250 /* Subroutine of fold_stmt. We perform several simplifications of the
251 memory reference tree EXPR and make sure to re-gimplify them properly
252 after propagation of constant addresses. IS_LHS is true if the
253 reference is supposed to be an lvalue. */
256 maybe_fold_reference (tree expr
, bool is_lhs
)
260 if ((TREE_CODE (expr
) == VIEW_CONVERT_EXPR
261 || TREE_CODE (expr
) == REALPART_EXPR
262 || TREE_CODE (expr
) == IMAGPART_EXPR
)
263 && CONSTANT_CLASS_P (TREE_OPERAND (expr
, 0)))
264 return fold_unary_loc (EXPR_LOCATION (expr
),
267 TREE_OPERAND (expr
, 0));
268 else if (TREE_CODE (expr
) == BIT_FIELD_REF
269 && CONSTANT_CLASS_P (TREE_OPERAND (expr
, 0)))
270 return fold_ternary_loc (EXPR_LOCATION (expr
),
273 TREE_OPERAND (expr
, 0),
274 TREE_OPERAND (expr
, 1),
275 TREE_OPERAND (expr
, 2));
278 && (result
= fold_const_aggregate_ref (expr
))
279 && is_gimple_min_invariant (result
))
286 /* Attempt to fold an assignment statement pointed-to by SI. Returns a
287 replacement rhs for the statement or NULL_TREE if no simplification
288 could be made. It is assumed that the operands have been previously
292 fold_gimple_assign (gimple_stmt_iterator
*si
)
294 gimple
*stmt
= gsi_stmt (*si
);
295 enum tree_code subcode
= gimple_assign_rhs_code (stmt
);
296 location_t loc
= gimple_location (stmt
);
298 tree result
= NULL_TREE
;
300 switch (get_gimple_rhs_class (subcode
))
302 case GIMPLE_SINGLE_RHS
:
304 tree rhs
= gimple_assign_rhs1 (stmt
);
306 if (TREE_CLOBBER_P (rhs
))
309 if (REFERENCE_CLASS_P (rhs
))
310 return maybe_fold_reference (rhs
, false);
312 else if (TREE_CODE (rhs
) == OBJ_TYPE_REF
)
314 tree val
= OBJ_TYPE_REF_EXPR (rhs
);
315 if (is_gimple_min_invariant (val
))
317 else if (flag_devirtualize
&& virtual_method_call_p (rhs
))
320 vec
<cgraph_node
*>targets
321 = possible_polymorphic_call_targets (rhs
, stmt
, &final
);
322 if (final
&& targets
.length () <= 1 && dbg_cnt (devirt
))
324 if (dump_enabled_p ())
326 location_t loc
= gimple_location_safe (stmt
);
327 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS
, loc
,
328 "resolving virtual function address "
329 "reference to function %s\n",
330 targets
.length () == 1
331 ? targets
[0]->name ()
334 if (targets
.length () == 1)
336 val
= fold_convert (TREE_TYPE (val
),
337 build_fold_addr_expr_loc
338 (loc
, targets
[0]->decl
));
339 STRIP_USELESS_TYPE_CONVERSION (val
);
342 /* We can not use __builtin_unreachable here because it
343 can not have address taken. */
344 val
= build_int_cst (TREE_TYPE (val
), 0);
350 else if (TREE_CODE (rhs
) == ADDR_EXPR
)
352 tree ref
= TREE_OPERAND (rhs
, 0);
353 tree tem
= maybe_fold_reference (ref
, true);
355 && TREE_CODE (tem
) == MEM_REF
356 && integer_zerop (TREE_OPERAND (tem
, 1)))
357 result
= fold_convert (TREE_TYPE (rhs
), TREE_OPERAND (tem
, 0));
359 result
= fold_convert (TREE_TYPE (rhs
),
360 build_fold_addr_expr_loc (loc
, tem
));
361 else if (TREE_CODE (ref
) == MEM_REF
362 && integer_zerop (TREE_OPERAND (ref
, 1)))
363 result
= fold_convert (TREE_TYPE (rhs
), TREE_OPERAND (ref
, 0));
367 /* Strip away useless type conversions. Both the
368 NON_LVALUE_EXPR that may have been added by fold, and
369 "useless" type conversions that might now be apparent
370 due to propagation. */
371 STRIP_USELESS_TYPE_CONVERSION (result
);
373 if (result
!= rhs
&& valid_gimple_rhs_p (result
))
378 else if (TREE_CODE (rhs
) == CONSTRUCTOR
379 && TREE_CODE (TREE_TYPE (rhs
)) == VECTOR_TYPE
)
381 /* Fold a constant vector CONSTRUCTOR to VECTOR_CST. */
385 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs
), i
, val
)
386 if (! CONSTANT_CLASS_P (val
))
389 return build_vector_from_ctor (TREE_TYPE (rhs
),
390 CONSTRUCTOR_ELTS (rhs
));
393 else if (DECL_P (rhs
))
394 return get_symbol_constant_value (rhs
);
398 case GIMPLE_UNARY_RHS
:
401 case GIMPLE_BINARY_RHS
:
404 case GIMPLE_TERNARY_RHS
:
405 result
= fold_ternary_loc (loc
, subcode
,
406 TREE_TYPE (gimple_assign_lhs (stmt
)),
407 gimple_assign_rhs1 (stmt
),
408 gimple_assign_rhs2 (stmt
),
409 gimple_assign_rhs3 (stmt
));
413 STRIP_USELESS_TYPE_CONVERSION (result
);
414 if (valid_gimple_rhs_p (result
))
419 case GIMPLE_INVALID_RHS
:
427 /* Replace a statement at *SI_P with a sequence of statements in STMTS,
428 adjusting the replacement stmts location and virtual operands.
429 If the statement has a lhs the last stmt in the sequence is expected
430 to assign to that lhs. */
433 gsi_replace_with_seq_vops (gimple_stmt_iterator
*si_p
, gimple_seq stmts
)
435 gimple
*stmt
= gsi_stmt (*si_p
);
437 if (gimple_has_location (stmt
))
438 annotate_all_with_location (stmts
, gimple_location (stmt
));
440 /* First iterate over the replacement statements backward, assigning
441 virtual operands to their defining statements. */
442 gimple
*laststore
= NULL
;
443 for (gimple_stmt_iterator i
= gsi_last (stmts
);
444 !gsi_end_p (i
); gsi_prev (&i
))
446 gimple
*new_stmt
= gsi_stmt (i
);
447 if ((gimple_assign_single_p (new_stmt
)
448 && !is_gimple_reg (gimple_assign_lhs (new_stmt
)))
449 || (is_gimple_call (new_stmt
)
450 && (gimple_call_flags (new_stmt
)
451 & (ECF_NOVOPS
| ECF_PURE
| ECF_CONST
| ECF_NORETURN
)) == 0))
455 vdef
= gimple_vdef (stmt
);
457 vdef
= make_ssa_name (gimple_vop (cfun
), new_stmt
);
458 gimple_set_vdef (new_stmt
, vdef
);
459 if (vdef
&& TREE_CODE (vdef
) == SSA_NAME
)
460 SSA_NAME_DEF_STMT (vdef
) = new_stmt
;
461 laststore
= new_stmt
;
465 /* Second iterate over the statements forward, assigning virtual
466 operands to their uses. */
467 tree reaching_vuse
= gimple_vuse (stmt
);
468 for (gimple_stmt_iterator i
= gsi_start (stmts
);
469 !gsi_end_p (i
); gsi_next (&i
))
471 gimple
*new_stmt
= gsi_stmt (i
);
472 /* If the new statement possibly has a VUSE, update it with exact SSA
473 name we know will reach this one. */
474 if (gimple_has_mem_ops (new_stmt
))
475 gimple_set_vuse (new_stmt
, reaching_vuse
);
476 gimple_set_modified (new_stmt
, true);
477 if (gimple_vdef (new_stmt
))
478 reaching_vuse
= gimple_vdef (new_stmt
);
481 /* If the new sequence does not do a store release the virtual
482 definition of the original statement. */
484 && reaching_vuse
== gimple_vuse (stmt
))
486 tree vdef
= gimple_vdef (stmt
);
488 && TREE_CODE (vdef
) == SSA_NAME
)
490 unlink_stmt_vdef (stmt
);
491 release_ssa_name (vdef
);
495 /* Finally replace the original statement with the sequence. */
496 gsi_replace_with_seq (si_p
, stmts
, false);
499 /* Convert EXPR into a GIMPLE value suitable for substitution on the
500 RHS of an assignment. Insert the necessary statements before
501 iterator *SI_P. The statement at *SI_P, which must be a GIMPLE_CALL
502 is replaced. If the call is expected to produces a result, then it
503 is replaced by an assignment of the new RHS to the result variable.
504 If the result is to be ignored, then the call is replaced by a
505 GIMPLE_NOP. A proper VDEF chain is retained by making the first
506 VUSE and the last VDEF of the whole sequence be the same as the replaced
507 statement and using new SSA names for stores in between. */
510 gimplify_and_update_call_from_tree (gimple_stmt_iterator
*si_p
, tree expr
)
513 gimple
*stmt
, *new_stmt
;
514 gimple_stmt_iterator i
;
515 gimple_seq stmts
= NULL
;
517 stmt
= gsi_stmt (*si_p
);
519 gcc_assert (is_gimple_call (stmt
));
521 push_gimplify_context (gimple_in_ssa_p (cfun
));
523 lhs
= gimple_call_lhs (stmt
);
524 if (lhs
== NULL_TREE
)
526 gimplify_and_add (expr
, &stmts
);
527 /* We can end up with folding a memcpy of an empty class assignment
528 which gets optimized away by C++ gimplification. */
529 if (gimple_seq_empty_p (stmts
))
531 pop_gimplify_context (NULL
);
532 if (gimple_in_ssa_p (cfun
))
534 unlink_stmt_vdef (stmt
);
537 gsi_replace (si_p
, gimple_build_nop (), false);
543 tree tmp
= get_initialized_tmp_var (expr
, &stmts
, NULL
);
544 new_stmt
= gimple_build_assign (lhs
, tmp
);
545 i
= gsi_last (stmts
);
546 gsi_insert_after_without_update (&i
, new_stmt
,
547 GSI_CONTINUE_LINKING
);
550 pop_gimplify_context (NULL
);
552 gsi_replace_with_seq_vops (si_p
, stmts
);
556 /* Replace the call at *GSI with the gimple value VAL. */
559 replace_call_with_value (gimple_stmt_iterator
*gsi
, tree val
)
561 gimple
*stmt
= gsi_stmt (*gsi
);
562 tree lhs
= gimple_call_lhs (stmt
);
566 if (!useless_type_conversion_p (TREE_TYPE (lhs
), TREE_TYPE (val
)))
567 val
= fold_convert (TREE_TYPE (lhs
), val
);
568 repl
= gimple_build_assign (lhs
, val
);
571 repl
= gimple_build_nop ();
572 tree vdef
= gimple_vdef (stmt
);
573 if (vdef
&& TREE_CODE (vdef
) == SSA_NAME
)
575 unlink_stmt_vdef (stmt
);
576 release_ssa_name (vdef
);
578 gsi_replace (gsi
, repl
, false);
581 /* Replace the call at *GSI with the new call REPL and fold that
585 replace_call_with_call_and_fold (gimple_stmt_iterator
*gsi
, gimple
*repl
)
587 gimple
*stmt
= gsi_stmt (*gsi
);
588 gimple_call_set_lhs (repl
, gimple_call_lhs (stmt
));
589 gimple_set_location (repl
, gimple_location (stmt
));
590 if (gimple_vdef (stmt
)
591 && TREE_CODE (gimple_vdef (stmt
)) == SSA_NAME
)
593 gimple_set_vdef (repl
, gimple_vdef (stmt
));
594 gimple_set_vuse (repl
, gimple_vuse (stmt
));
595 SSA_NAME_DEF_STMT (gimple_vdef (repl
)) = repl
;
597 gsi_replace (gsi
, repl
, false);
601 /* Return true if VAR is a VAR_DECL or a component thereof. */
604 var_decl_component_p (tree var
)
607 while (handled_component_p (inner
))
608 inner
= TREE_OPERAND (inner
, 0);
609 return SSA_VAR_P (inner
);
612 /* Fold function call to builtin mem{{,p}cpy,move}. Return
613 false if no simplification can be made.
614 If ENDP is 0, return DEST (like memcpy).
615 If ENDP is 1, return DEST+LEN (like mempcpy).
616 If ENDP is 2, return DEST+LEN-1 (like stpcpy).
617 If ENDP is 3, return DEST, additionally *SRC and *DEST may overlap
621 gimple_fold_builtin_memory_op (gimple_stmt_iterator
*gsi
,
622 tree dest
, tree src
, int endp
)
624 gimple
*stmt
= gsi_stmt (*gsi
);
625 tree lhs
= gimple_call_lhs (stmt
);
626 tree len
= gimple_call_arg (stmt
, 2);
627 tree destvar
, srcvar
;
628 location_t loc
= gimple_location (stmt
);
630 /* If the LEN parameter is zero, return DEST. */
631 if (integer_zerop (len
))
634 if (gimple_call_lhs (stmt
))
635 repl
= gimple_build_assign (gimple_call_lhs (stmt
), dest
);
637 repl
= gimple_build_nop ();
638 tree vdef
= gimple_vdef (stmt
);
639 if (vdef
&& TREE_CODE (vdef
) == SSA_NAME
)
641 unlink_stmt_vdef (stmt
);
642 release_ssa_name (vdef
);
644 gsi_replace (gsi
, repl
, false);
648 /* If SRC and DEST are the same (and not volatile), return
649 DEST{,+LEN,+LEN-1}. */
650 if (operand_equal_p (src
, dest
, 0))
652 unlink_stmt_vdef (stmt
);
653 if (gimple_vdef (stmt
) && TREE_CODE (gimple_vdef (stmt
)) == SSA_NAME
)
654 release_ssa_name (gimple_vdef (stmt
));
657 gsi_replace (gsi
, gimple_build_nop (), false);
664 tree srctype
, desttype
;
665 unsigned int src_align
, dest_align
;
668 /* Inlining of memcpy/memmove may cause bounds lost (if we copy
669 pointers as wide integer) and also may result in huge function
670 size because of inlined bounds copy. Thus don't inline for
671 functions we want to instrument. */
672 if (flag_check_pointer_bounds
673 && chkp_instrumentable_p (cfun
->decl
)
674 /* Even if data may contain pointers we can inline if copy
675 less than a pointer size. */
676 && (!tree_fits_uhwi_p (len
)
677 || compare_tree_int (len
, POINTER_SIZE_UNITS
) >= 0))
680 /* Build accesses at offset zero with a ref-all character type. */
681 off0
= build_int_cst (build_pointer_type_for_mode (char_type_node
,
684 /* If we can perform the copy efficiently with first doing all loads
685 and then all stores inline it that way. Currently efficiently
686 means that we can load all the memory into a single integer
687 register which is what MOVE_MAX gives us. */
688 src_align
= get_pointer_alignment (src
);
689 dest_align
= get_pointer_alignment (dest
);
690 if (tree_fits_uhwi_p (len
)
691 && compare_tree_int (len
, MOVE_MAX
) <= 0
692 /* ??? Don't transform copies from strings with known length this
693 confuses the tree-ssa-strlen.c. This doesn't handle
694 the case in gcc.dg/strlenopt-8.c which is XFAILed for that
696 && !c_strlen (src
, 2))
698 unsigned ilen
= tree_to_uhwi (len
);
699 if (exact_log2 (ilen
) != -1)
701 tree type
= lang_hooks
.types
.type_for_size (ilen
* 8, 1);
703 && TYPE_MODE (type
) != BLKmode
704 && (GET_MODE_SIZE (TYPE_MODE (type
)) * BITS_PER_UNIT
706 /* If the destination pointer is not aligned we must be able
707 to emit an unaligned store. */
708 && (dest_align
>= GET_MODE_ALIGNMENT (TYPE_MODE (type
))
709 || !SLOW_UNALIGNED_ACCESS (TYPE_MODE (type
), dest_align
)
710 || (optab_handler (movmisalign_optab
, TYPE_MODE (type
))
711 != CODE_FOR_nothing
)))
714 tree desttype
= type
;
715 if (src_align
< GET_MODE_ALIGNMENT (TYPE_MODE (type
)))
716 srctype
= build_aligned_type (type
, src_align
);
717 tree srcmem
= fold_build2 (MEM_REF
, srctype
, src
, off0
);
718 tree tem
= fold_const_aggregate_ref (srcmem
);
721 else if (src_align
< GET_MODE_ALIGNMENT (TYPE_MODE (type
))
722 && SLOW_UNALIGNED_ACCESS (TYPE_MODE (type
),
724 && (optab_handler (movmisalign_optab
,
726 == CODE_FOR_nothing
))
731 if (is_gimple_reg_type (TREE_TYPE (srcmem
)))
733 new_stmt
= gimple_build_assign (NULL_TREE
, srcmem
);
734 if (gimple_in_ssa_p (cfun
))
735 srcmem
= make_ssa_name (TREE_TYPE (srcmem
),
738 srcmem
= create_tmp_reg (TREE_TYPE (srcmem
));
739 gimple_assign_set_lhs (new_stmt
, srcmem
);
740 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
741 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
743 if (dest_align
< GET_MODE_ALIGNMENT (TYPE_MODE (type
)))
744 desttype
= build_aligned_type (type
, dest_align
);
746 = gimple_build_assign (fold_build2 (MEM_REF
, desttype
,
749 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
750 gimple_set_vdef (new_stmt
, gimple_vdef (stmt
));
751 if (gimple_vdef (new_stmt
)
752 && TREE_CODE (gimple_vdef (new_stmt
)) == SSA_NAME
)
753 SSA_NAME_DEF_STMT (gimple_vdef (new_stmt
)) = new_stmt
;
756 gsi_replace (gsi
, new_stmt
, false);
759 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
768 /* Both DEST and SRC must be pointer types.
769 ??? This is what old code did. Is the testing for pointer types
772 If either SRC is readonly or length is 1, we can use memcpy. */
773 if (!dest_align
|| !src_align
)
775 if (readonly_data_expr (src
)
776 || (tree_fits_uhwi_p (len
)
777 && (MIN (src_align
, dest_align
) / BITS_PER_UNIT
778 >= tree_to_uhwi (len
))))
780 tree fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
783 gimple_call_set_fndecl (stmt
, fn
);
784 gimple_call_set_arg (stmt
, 0, dest
);
785 gimple_call_set_arg (stmt
, 1, src
);
790 /* If *src and *dest can't overlap, optimize into memcpy as well. */
791 if (TREE_CODE (src
) == ADDR_EXPR
792 && TREE_CODE (dest
) == ADDR_EXPR
)
794 tree src_base
, dest_base
, fn
;
795 HOST_WIDE_INT src_offset
= 0, dest_offset
= 0;
796 HOST_WIDE_INT size
= -1;
797 HOST_WIDE_INT maxsize
= -1;
800 srcvar
= TREE_OPERAND (src
, 0);
801 src_base
= get_ref_base_and_extent (srcvar
, &src_offset
,
802 &size
, &maxsize
, &reverse
);
803 destvar
= TREE_OPERAND (dest
, 0);
804 dest_base
= get_ref_base_and_extent (destvar
, &dest_offset
,
805 &size
, &maxsize
, &reverse
);
806 if (tree_fits_uhwi_p (len
))
807 maxsize
= tree_to_uhwi (len
);
810 src_offset
/= BITS_PER_UNIT
;
811 dest_offset
/= BITS_PER_UNIT
;
812 if (SSA_VAR_P (src_base
)
813 && SSA_VAR_P (dest_base
))
815 if (operand_equal_p (src_base
, dest_base
, 0)
816 && ranges_overlap_p (src_offset
, maxsize
,
817 dest_offset
, maxsize
))
820 else if (TREE_CODE (src_base
) == MEM_REF
821 && TREE_CODE (dest_base
) == MEM_REF
)
823 if (! operand_equal_p (TREE_OPERAND (src_base
, 0),
824 TREE_OPERAND (dest_base
, 0), 0))
826 offset_int off
= mem_ref_offset (src_base
) + src_offset
;
827 if (!wi::fits_shwi_p (off
))
829 src_offset
= off
.to_shwi ();
831 off
= mem_ref_offset (dest_base
) + dest_offset
;
832 if (!wi::fits_shwi_p (off
))
834 dest_offset
= off
.to_shwi ();
835 if (ranges_overlap_p (src_offset
, maxsize
,
836 dest_offset
, maxsize
))
842 fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
845 gimple_call_set_fndecl (stmt
, fn
);
846 gimple_call_set_arg (stmt
, 0, dest
);
847 gimple_call_set_arg (stmt
, 1, src
);
852 /* If the destination and source do not alias optimize into
854 if ((is_gimple_min_invariant (dest
)
855 || TREE_CODE (dest
) == SSA_NAME
)
856 && (is_gimple_min_invariant (src
)
857 || TREE_CODE (src
) == SSA_NAME
))
860 ao_ref_init_from_ptr_and_size (&destr
, dest
, len
);
861 ao_ref_init_from_ptr_and_size (&srcr
, src
, len
);
862 if (!refs_may_alias_p_1 (&destr
, &srcr
, false))
865 fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
868 gimple_call_set_fndecl (stmt
, fn
);
869 gimple_call_set_arg (stmt
, 0, dest
);
870 gimple_call_set_arg (stmt
, 1, src
);
879 if (!tree_fits_shwi_p (len
))
882 This logic lose for arguments like (type *)malloc (sizeof (type)),
883 since we strip the casts of up to VOID return value from malloc.
884 Perhaps we ought to inherit type from non-VOID argument here? */
887 if (!POINTER_TYPE_P (TREE_TYPE (src
))
888 || !POINTER_TYPE_P (TREE_TYPE (dest
)))
890 /* In the following try to find a type that is most natural to be
891 used for the memcpy source and destination and that allows
892 the most optimization when memcpy is turned into a plain assignment
893 using that type. In theory we could always use a char[len] type
894 but that only gains us that the destination and source possibly
895 no longer will have their address taken. */
896 /* As we fold (void *)(p + CST) to (void *)p + CST undo this here. */
897 if (TREE_CODE (src
) == POINTER_PLUS_EXPR
)
899 tree tem
= TREE_OPERAND (src
, 0);
901 if (tem
!= TREE_OPERAND (src
, 0))
902 src
= build1 (NOP_EXPR
, TREE_TYPE (tem
), src
);
904 if (TREE_CODE (dest
) == POINTER_PLUS_EXPR
)
906 tree tem
= TREE_OPERAND (dest
, 0);
908 if (tem
!= TREE_OPERAND (dest
, 0))
909 dest
= build1 (NOP_EXPR
, TREE_TYPE (tem
), dest
);
911 srctype
= TREE_TYPE (TREE_TYPE (src
));
912 if (TREE_CODE (srctype
) == ARRAY_TYPE
913 && !tree_int_cst_equal (TYPE_SIZE_UNIT (srctype
), len
))
915 srctype
= TREE_TYPE (srctype
);
917 src
= build1 (NOP_EXPR
, build_pointer_type (srctype
), src
);
919 desttype
= TREE_TYPE (TREE_TYPE (dest
));
920 if (TREE_CODE (desttype
) == ARRAY_TYPE
921 && !tree_int_cst_equal (TYPE_SIZE_UNIT (desttype
), len
))
923 desttype
= TREE_TYPE (desttype
);
925 dest
= build1 (NOP_EXPR
, build_pointer_type (desttype
), dest
);
927 if (TREE_ADDRESSABLE (srctype
)
928 || TREE_ADDRESSABLE (desttype
))
931 /* Make sure we are not copying using a floating-point mode or
932 a type whose size possibly does not match its precision. */
933 if (FLOAT_MODE_P (TYPE_MODE (desttype
))
934 || TREE_CODE (desttype
) == BOOLEAN_TYPE
935 || TREE_CODE (desttype
) == ENUMERAL_TYPE
)
936 desttype
= bitwise_type_for_mode (TYPE_MODE (desttype
));
937 if (FLOAT_MODE_P (TYPE_MODE (srctype
))
938 || TREE_CODE (srctype
) == BOOLEAN_TYPE
939 || TREE_CODE (srctype
) == ENUMERAL_TYPE
)
940 srctype
= bitwise_type_for_mode (TYPE_MODE (srctype
));
948 src_align
= get_pointer_alignment (src
);
949 dest_align
= get_pointer_alignment (dest
);
950 if (dest_align
< TYPE_ALIGN (desttype
)
951 || src_align
< TYPE_ALIGN (srctype
))
955 STRIP_NOPS (destvar
);
956 if (TREE_CODE (destvar
) == ADDR_EXPR
957 && var_decl_component_p (TREE_OPERAND (destvar
, 0))
958 && tree_int_cst_equal (TYPE_SIZE_UNIT (desttype
), len
))
959 destvar
= fold_build2 (MEM_REF
, desttype
, destvar
, off0
);
965 if (TREE_CODE (srcvar
) == ADDR_EXPR
966 && var_decl_component_p (TREE_OPERAND (srcvar
, 0))
967 && tree_int_cst_equal (TYPE_SIZE_UNIT (srctype
), len
))
970 || src_align
>= TYPE_ALIGN (desttype
))
971 srcvar
= fold_build2 (MEM_REF
, destvar
? desttype
: srctype
,
973 else if (!STRICT_ALIGNMENT
)
975 srctype
= build_aligned_type (TYPE_MAIN_VARIANT (desttype
),
977 srcvar
= fold_build2 (MEM_REF
, srctype
, srcvar
, off0
);
985 if (srcvar
== NULL_TREE
&& destvar
== NULL_TREE
)
988 if (srcvar
== NULL_TREE
)
991 if (src_align
>= TYPE_ALIGN (desttype
))
992 srcvar
= fold_build2 (MEM_REF
, desttype
, src
, off0
);
995 if (STRICT_ALIGNMENT
)
997 srctype
= build_aligned_type (TYPE_MAIN_VARIANT (desttype
),
999 srcvar
= fold_build2 (MEM_REF
, srctype
, src
, off0
);
1002 else if (destvar
== NULL_TREE
)
1005 if (dest_align
>= TYPE_ALIGN (srctype
))
1006 destvar
= fold_build2 (MEM_REF
, srctype
, dest
, off0
);
1009 if (STRICT_ALIGNMENT
)
1011 desttype
= build_aligned_type (TYPE_MAIN_VARIANT (srctype
),
1013 destvar
= fold_build2 (MEM_REF
, desttype
, dest
, off0
);
1018 if (is_gimple_reg_type (TREE_TYPE (srcvar
)))
1020 new_stmt
= gimple_build_assign (NULL_TREE
, srcvar
);
1021 if (gimple_in_ssa_p (cfun
))
1022 srcvar
= make_ssa_name (TREE_TYPE (srcvar
), new_stmt
);
1024 srcvar
= create_tmp_reg (TREE_TYPE (srcvar
));
1025 gimple_assign_set_lhs (new_stmt
, srcvar
);
1026 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
1027 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
1029 new_stmt
= gimple_build_assign (destvar
, srcvar
);
1030 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
1031 gimple_set_vdef (new_stmt
, gimple_vdef (stmt
));
1032 if (gimple_vdef (new_stmt
)
1033 && TREE_CODE (gimple_vdef (new_stmt
)) == SSA_NAME
)
1034 SSA_NAME_DEF_STMT (gimple_vdef (new_stmt
)) = new_stmt
;
1037 gsi_replace (gsi
, new_stmt
, false);
1040 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
1044 gimple_seq stmts
= NULL
;
1045 if (endp
== 0 || endp
== 3)
1048 len
= gimple_build (&stmts
, loc
, MINUS_EXPR
, TREE_TYPE (len
), len
,
1050 if (endp
== 2 || endp
== 1)
1052 len
= gimple_convert_to_ptrofftype (&stmts
, loc
, len
);
1053 dest
= gimple_build (&stmts
, loc
, POINTER_PLUS_EXPR
,
1054 TREE_TYPE (dest
), dest
, len
);
1057 gsi_insert_seq_before (gsi
, stmts
, GSI_SAME_STMT
);
1058 gimple
*repl
= gimple_build_assign (lhs
, dest
);
1059 gsi_replace (gsi
, repl
, false);
1063 /* Fold function call to builtin memset or bzero at *GSI setting the
1064 memory of size LEN to VAL. Return whether a simplification was made. */
1067 gimple_fold_builtin_memset (gimple_stmt_iterator
*gsi
, tree c
, tree len
)
1069 gimple
*stmt
= gsi_stmt (*gsi
);
1071 unsigned HOST_WIDE_INT length
, cval
;
1073 /* If the LEN parameter is zero, return DEST. */
1074 if (integer_zerop (len
))
1076 replace_call_with_value (gsi
, gimple_call_arg (stmt
, 0));
1080 if (! tree_fits_uhwi_p (len
))
1083 if (TREE_CODE (c
) != INTEGER_CST
)
1086 tree dest
= gimple_call_arg (stmt
, 0);
1088 if (TREE_CODE (var
) != ADDR_EXPR
)
1091 var
= TREE_OPERAND (var
, 0);
1092 if (TREE_THIS_VOLATILE (var
))
1095 etype
= TREE_TYPE (var
);
1096 if (TREE_CODE (etype
) == ARRAY_TYPE
)
1097 etype
= TREE_TYPE (etype
);
1099 if (!INTEGRAL_TYPE_P (etype
)
1100 && !POINTER_TYPE_P (etype
))
1103 if (! var_decl_component_p (var
))
1106 length
= tree_to_uhwi (len
);
1107 if (GET_MODE_SIZE (TYPE_MODE (etype
)) != length
1108 || get_pointer_alignment (dest
) / BITS_PER_UNIT
< length
)
1111 if (length
> HOST_BITS_PER_WIDE_INT
/ BITS_PER_UNIT
)
1114 if (integer_zerop (c
))
1118 if (CHAR_BIT
!= 8 || BITS_PER_UNIT
!= 8 || HOST_BITS_PER_WIDE_INT
> 64)
1121 cval
= TREE_INT_CST_LOW (c
);
1125 cval
|= (cval
<< 31) << 1;
1128 var
= fold_build2 (MEM_REF
, etype
, dest
, build_int_cst (ptr_type_node
, 0));
1129 gimple
*store
= gimple_build_assign (var
, build_int_cst_type (etype
, cval
));
1130 gimple_set_vuse (store
, gimple_vuse (stmt
));
1131 tree vdef
= gimple_vdef (stmt
);
1132 if (vdef
&& TREE_CODE (vdef
) == SSA_NAME
)
1134 gimple_set_vdef (store
, gimple_vdef (stmt
));
1135 SSA_NAME_DEF_STMT (gimple_vdef (stmt
)) = store
;
1137 gsi_insert_before (gsi
, store
, GSI_SAME_STMT
);
1138 if (gimple_call_lhs (stmt
))
1140 gimple
*asgn
= gimple_build_assign (gimple_call_lhs (stmt
), dest
);
1141 gsi_replace (gsi
, asgn
, false);
1145 gimple_stmt_iterator gsi2
= *gsi
;
1147 gsi_remove (&gsi2
, true);
1154 /* Return the string length, maximum string length or maximum value of
1156 If ARG is an SSA name variable, follow its use-def chains. If LENGTH
1157 is not NULL and, for TYPE == 0, its value is not equal to the length
1158 we determine or if we are unable to determine the length or value,
1159 return false. VISITED is a bitmap of visited variables.
1160 TYPE is 0 if string length should be returned, 1 for maximum string
1161 length and 2 for maximum value ARG can have. */
1164 get_maxval_strlen (tree arg
, tree
*length
, bitmap
*visited
, int type
)
1169 if (TREE_CODE (arg
) != SSA_NAME
)
1171 /* We can end up with &(*iftmp_1)[0] here as well, so handle it. */
1172 if (TREE_CODE (arg
) == ADDR_EXPR
1173 && TREE_CODE (TREE_OPERAND (arg
, 0)) == ARRAY_REF
1174 && integer_zerop (TREE_OPERAND (TREE_OPERAND (arg
, 0), 1)))
1176 tree aop0
= TREE_OPERAND (TREE_OPERAND (arg
, 0), 0);
1177 if (TREE_CODE (aop0
) == INDIRECT_REF
1178 && TREE_CODE (TREE_OPERAND (aop0
, 0)) == SSA_NAME
)
1179 return get_maxval_strlen (TREE_OPERAND (aop0
, 0),
1180 length
, visited
, type
);
1186 if (TREE_CODE (val
) != INTEGER_CST
1187 || tree_int_cst_sgn (val
) < 0)
1191 val
= c_strlen (arg
, 1);
1199 if (TREE_CODE (*length
) != INTEGER_CST
1200 || TREE_CODE (val
) != INTEGER_CST
)
1203 if (tree_int_cst_lt (*length
, val
))
1207 else if (simple_cst_equal (val
, *length
) != 1)
1215 /* If ARG is registered for SSA update we cannot look at its defining
1217 if (name_registered_for_update_p (arg
))
1220 /* If we were already here, break the infinite cycle. */
1222 *visited
= BITMAP_ALLOC (NULL
);
1223 if (!bitmap_set_bit (*visited
, SSA_NAME_VERSION (arg
)))
1227 def_stmt
= SSA_NAME_DEF_STMT (var
);
1229 switch (gimple_code (def_stmt
))
1232 /* The RHS of the statement defining VAR must either have a
1233 constant length or come from another SSA_NAME with a constant
1235 if (gimple_assign_single_p (def_stmt
)
1236 || gimple_assign_unary_nop_p (def_stmt
))
1238 tree rhs
= gimple_assign_rhs1 (def_stmt
);
1239 return get_maxval_strlen (rhs
, length
, visited
, type
);
1241 else if (gimple_assign_rhs_code (def_stmt
) == COND_EXPR
)
1243 tree op2
= gimple_assign_rhs2 (def_stmt
);
1244 tree op3
= gimple_assign_rhs3 (def_stmt
);
1245 return get_maxval_strlen (op2
, length
, visited
, type
)
1246 && get_maxval_strlen (op3
, length
, visited
, type
);
1252 /* All the arguments of the PHI node must have the same constant
1256 for (i
= 0; i
< gimple_phi_num_args (def_stmt
); i
++)
1258 tree arg
= gimple_phi_arg (def_stmt
, i
)->def
;
1260 /* If this PHI has itself as an argument, we cannot
1261 determine the string length of this argument. However,
1262 if we can find a constant string length for the other
1263 PHI args then we can still be sure that this is a
1264 constant string length. So be optimistic and just
1265 continue with the next argument. */
1266 if (arg
== gimple_phi_result (def_stmt
))
1269 if (!get_maxval_strlen (arg
, length
, visited
, type
))
1281 get_maxval_strlen (tree arg
, int type
)
1283 bitmap visited
= NULL
;
1284 tree len
= NULL_TREE
;
1285 if (!get_maxval_strlen (arg
, &len
, &visited
, type
))
1288 BITMAP_FREE (visited
);
1294 /* Fold function call to builtin strcpy with arguments DEST and SRC.
1295 If LEN is not NULL, it represents the length of the string to be
1296 copied. Return NULL_TREE if no simplification can be made. */
1299 gimple_fold_builtin_strcpy (gimple_stmt_iterator
*gsi
,
1300 tree dest
, tree src
)
1302 location_t loc
= gimple_location (gsi_stmt (*gsi
));
1305 /* If SRC and DEST are the same (and not volatile), return DEST. */
1306 if (operand_equal_p (src
, dest
, 0))
1308 replace_call_with_value (gsi
, dest
);
1312 if (optimize_function_for_size_p (cfun
))
1315 fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
1319 tree len
= get_maxval_strlen (src
, 0);
1323 len
= fold_convert_loc (loc
, size_type_node
, len
);
1324 len
= size_binop_loc (loc
, PLUS_EXPR
, len
, build_int_cst (size_type_node
, 1));
1325 len
= force_gimple_operand_gsi (gsi
, len
, true,
1326 NULL_TREE
, true, GSI_SAME_STMT
);
1327 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, len
);
1328 replace_call_with_call_and_fold (gsi
, repl
);
1332 /* Fold function call to builtin strncpy with arguments DEST, SRC, and LEN.
1333 If SLEN is not NULL, it represents the length of the source string.
1334 Return NULL_TREE if no simplification can be made. */
1337 gimple_fold_builtin_strncpy (gimple_stmt_iterator
*gsi
,
1338 tree dest
, tree src
, tree len
)
1340 location_t loc
= gimple_location (gsi_stmt (*gsi
));
1343 /* If the LEN parameter is zero, return DEST. */
1344 if (integer_zerop (len
))
1346 replace_call_with_value (gsi
, dest
);
1350 /* We can't compare slen with len as constants below if len is not a
1352 if (TREE_CODE (len
) != INTEGER_CST
)
1355 /* Now, we must be passed a constant src ptr parameter. */
1356 tree slen
= get_maxval_strlen (src
, 0);
1357 if (!slen
|| TREE_CODE (slen
) != INTEGER_CST
)
1360 slen
= size_binop_loc (loc
, PLUS_EXPR
, slen
, ssize_int (1));
1362 /* We do not support simplification of this case, though we do
1363 support it when expanding trees into RTL. */
1364 /* FIXME: generate a call to __builtin_memset. */
1365 if (tree_int_cst_lt (slen
, len
))
1368 /* OK transform into builtin memcpy. */
1369 fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
1373 len
= fold_convert_loc (loc
, size_type_node
, len
);
1374 len
= force_gimple_operand_gsi (gsi
, len
, true,
1375 NULL_TREE
, true, GSI_SAME_STMT
);
1376 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, len
);
1377 replace_call_with_call_and_fold (gsi
, repl
);
1381 /* Simplify a call to the strcat builtin. DST and SRC are the arguments
1384 Return NULL_TREE if no simplification was possible, otherwise return the
1385 simplified form of the call as a tree.
1387 The simplified form may be a constant or other expression which
1388 computes the same value, but in a more efficient manner (including
1389 calls to other builtin functions).
1391 The call may contain arguments which need to be evaluated, but
1392 which are not useful to determine the result of the call. In
1393 this case we return a chain of COMPOUND_EXPRs. The LHS of each
1394 COMPOUND_EXPR will be an argument which must be evaluated.
1395 COMPOUND_EXPRs are chained through their RHS. The RHS of the last
1396 COMPOUND_EXPR in the chain will contain the tree for the simplified
1397 form of the builtin function call. */
1400 gimple_fold_builtin_strcat (gimple_stmt_iterator
*gsi
, tree dst
, tree src
)
1402 gimple
*stmt
= gsi_stmt (*gsi
);
1403 location_t loc
= gimple_location (stmt
);
1405 const char *p
= c_getstr (src
);
1407 /* If the string length is zero, return the dst parameter. */
1408 if (p
&& *p
== '\0')
1410 replace_call_with_value (gsi
, dst
);
1414 if (!optimize_bb_for_speed_p (gimple_bb (stmt
)))
1417 /* See if we can store by pieces into (dst + strlen(dst)). */
1419 tree strlen_fn
= builtin_decl_implicit (BUILT_IN_STRLEN
);
1420 tree memcpy_fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
1422 if (!strlen_fn
|| !memcpy_fn
)
1425 /* If the length of the source string isn't computable don't
1426 split strcat into strlen and memcpy. */
1427 tree len
= get_maxval_strlen (src
, 0);
1431 /* Create strlen (dst). */
1432 gimple_seq stmts
= NULL
, stmts2
;
1433 gimple
*repl
= gimple_build_call (strlen_fn
, 1, dst
);
1434 gimple_set_location (repl
, loc
);
1435 if (gimple_in_ssa_p (cfun
))
1436 newdst
= make_ssa_name (size_type_node
);
1438 newdst
= create_tmp_reg (size_type_node
);
1439 gimple_call_set_lhs (repl
, newdst
);
1440 gimple_seq_add_stmt_without_update (&stmts
, repl
);
1442 /* Create (dst p+ strlen (dst)). */
1443 newdst
= fold_build_pointer_plus_loc (loc
, dst
, newdst
);
1444 newdst
= force_gimple_operand (newdst
, &stmts2
, true, NULL_TREE
);
1445 gimple_seq_add_seq_without_update (&stmts
, stmts2
);
1447 len
= fold_convert_loc (loc
, size_type_node
, len
);
1448 len
= size_binop_loc (loc
, PLUS_EXPR
, len
,
1449 build_int_cst (size_type_node
, 1));
1450 len
= force_gimple_operand (len
, &stmts2
, true, NULL_TREE
);
1451 gimple_seq_add_seq_without_update (&stmts
, stmts2
);
1453 repl
= gimple_build_call (memcpy_fn
, 3, newdst
, src
, len
);
1454 gimple_seq_add_stmt_without_update (&stmts
, repl
);
1455 if (gimple_call_lhs (stmt
))
1457 repl
= gimple_build_assign (gimple_call_lhs (stmt
), dst
);
1458 gimple_seq_add_stmt_without_update (&stmts
, repl
);
1459 gsi_replace_with_seq_vops (gsi
, stmts
);
1460 /* gsi now points at the assignment to the lhs, get a
1461 stmt iterator to the memcpy call.
1462 ??? We can't use gsi_for_stmt as that doesn't work when the
1463 CFG isn't built yet. */
1464 gimple_stmt_iterator gsi2
= *gsi
;
1470 gsi_replace_with_seq_vops (gsi
, stmts
);
1476 /* Fold a call to the __strcat_chk builtin FNDECL. DEST, SRC, and SIZE
1477 are the arguments to the call. */
1480 gimple_fold_builtin_strcat_chk (gimple_stmt_iterator
*gsi
)
1482 gimple
*stmt
= gsi_stmt (*gsi
);
1483 tree dest
= gimple_call_arg (stmt
, 0);
1484 tree src
= gimple_call_arg (stmt
, 1);
1485 tree size
= gimple_call_arg (stmt
, 2);
1491 /* If the SRC parameter is "", return DEST. */
1492 if (p
&& *p
== '\0')
1494 replace_call_with_value (gsi
, dest
);
1498 if (! tree_fits_uhwi_p (size
) || ! integer_all_onesp (size
))
1501 /* If __builtin_strcat_chk is used, assume strcat is available. */
1502 fn
= builtin_decl_explicit (BUILT_IN_STRCAT
);
1506 gimple
*repl
= gimple_build_call (fn
, 2, dest
, src
);
1507 replace_call_with_call_and_fold (gsi
, repl
);
1511 /* Simplify a call to the strncat builtin. */
1514 gimple_fold_builtin_strncat (gimple_stmt_iterator
*gsi
)
1516 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
1517 tree dst
= gimple_call_arg (stmt
, 0);
1518 tree src
= gimple_call_arg (stmt
, 1);
1519 tree len
= gimple_call_arg (stmt
, 2);
1521 const char *p
= c_getstr (src
);
1523 /* If the requested length is zero, or the src parameter string
1524 length is zero, return the dst parameter. */
1525 if (integer_zerop (len
) || (p
&& *p
== '\0'))
1527 replace_call_with_value (gsi
, dst
);
1531 /* If the requested len is greater than or equal to the string
1532 length, call strcat. */
1533 if (TREE_CODE (len
) == INTEGER_CST
&& p
1534 && compare_tree_int (len
, strlen (p
)) >= 0)
1536 tree fn
= builtin_decl_implicit (BUILT_IN_STRCAT
);
1538 /* If the replacement _DECL isn't initialized, don't do the
1543 gcall
*repl
= gimple_build_call (fn
, 2, dst
, src
);
1544 replace_call_with_call_and_fold (gsi
, repl
);
1551 /* Fold a call to the __strncat_chk builtin with arguments DEST, SRC,
1555 gimple_fold_builtin_strncat_chk (gimple_stmt_iterator
*gsi
)
1557 gimple
*stmt
= gsi_stmt (*gsi
);
1558 tree dest
= gimple_call_arg (stmt
, 0);
1559 tree src
= gimple_call_arg (stmt
, 1);
1560 tree len
= gimple_call_arg (stmt
, 2);
1561 tree size
= gimple_call_arg (stmt
, 3);
1566 /* If the SRC parameter is "" or if LEN is 0, return DEST. */
1567 if ((p
&& *p
== '\0')
1568 || integer_zerop (len
))
1570 replace_call_with_value (gsi
, dest
);
1574 if (! tree_fits_uhwi_p (size
))
1577 if (! integer_all_onesp (size
))
1579 tree src_len
= c_strlen (src
, 1);
1581 && tree_fits_uhwi_p (src_len
)
1582 && tree_fits_uhwi_p (len
)
1583 && ! tree_int_cst_lt (len
, src_len
))
1585 /* If LEN >= strlen (SRC), optimize into __strcat_chk. */
1586 fn
= builtin_decl_explicit (BUILT_IN_STRCAT_CHK
);
1590 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, size
);
1591 replace_call_with_call_and_fold (gsi
, repl
);
1597 /* If __builtin_strncat_chk is used, assume strncat is available. */
1598 fn
= builtin_decl_explicit (BUILT_IN_STRNCAT
);
1602 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, len
);
1603 replace_call_with_call_and_fold (gsi
, repl
);
1607 /* Fold a call to the fputs builtin. ARG0 and ARG1 are the arguments
1608 to the call. IGNORE is true if the value returned
1609 by the builtin will be ignored. UNLOCKED is true is true if this
1610 actually a call to fputs_unlocked. If LEN in non-NULL, it represents
1611 the known length of the string. Return NULL_TREE if no simplification
1615 gimple_fold_builtin_fputs (gimple_stmt_iterator
*gsi
,
1616 tree arg0
, tree arg1
,
1619 gimple
*stmt
= gsi_stmt (*gsi
);
1621 /* If we're using an unlocked function, assume the other unlocked
1622 functions exist explicitly. */
1623 tree
const fn_fputc
= (unlocked
1624 ? builtin_decl_explicit (BUILT_IN_FPUTC_UNLOCKED
)
1625 : builtin_decl_implicit (BUILT_IN_FPUTC
));
1626 tree
const fn_fwrite
= (unlocked
1627 ? builtin_decl_explicit (BUILT_IN_FWRITE_UNLOCKED
)
1628 : builtin_decl_implicit (BUILT_IN_FWRITE
));
1630 /* If the return value is used, don't do the transformation. */
1631 if (gimple_call_lhs (stmt
))
1634 /* Get the length of the string passed to fputs. If the length
1635 can't be determined, punt. */
1636 tree len
= get_maxval_strlen (arg0
, 0);
1638 || TREE_CODE (len
) != INTEGER_CST
)
1641 switch (compare_tree_int (len
, 1))
1643 case -1: /* length is 0, delete the call entirely . */
1644 replace_call_with_value (gsi
, integer_zero_node
);
1647 case 0: /* length is 1, call fputc. */
1649 const char *p
= c_getstr (arg0
);
1655 gimple
*repl
= gimple_build_call (fn_fputc
, 2,
1657 (integer_type_node
, p
[0]), arg1
);
1658 replace_call_with_call_and_fold (gsi
, repl
);
1663 case 1: /* length is greater than 1, call fwrite. */
1665 /* If optimizing for size keep fputs. */
1666 if (optimize_function_for_size_p (cfun
))
1668 /* New argument list transforming fputs(string, stream) to
1669 fwrite(string, 1, len, stream). */
1673 gimple
*repl
= gimple_build_call (fn_fwrite
, 4, arg0
,
1674 size_one_node
, len
, arg1
);
1675 replace_call_with_call_and_fold (gsi
, repl
);
1684 /* Fold a call to the __mem{cpy,pcpy,move,set}_chk builtin.
1685 DEST, SRC, LEN, and SIZE are the arguments to the call.
1686 IGNORE is true, if return value can be ignored. FCODE is the BUILT_IN_*
1687 code of the builtin. If MAXLEN is not NULL, it is maximum length
1688 passed as third argument. */
1691 gimple_fold_builtin_memory_chk (gimple_stmt_iterator
*gsi
,
1692 tree dest
, tree src
, tree len
, tree size
,
1693 enum built_in_function fcode
)
1695 gimple
*stmt
= gsi_stmt (*gsi
);
1696 location_t loc
= gimple_location (stmt
);
1697 bool ignore
= gimple_call_lhs (stmt
) == NULL_TREE
;
1700 /* If SRC and DEST are the same (and not volatile), return DEST
1701 (resp. DEST+LEN for __mempcpy_chk). */
1702 if (fcode
!= BUILT_IN_MEMSET_CHK
&& operand_equal_p (src
, dest
, 0))
1704 if (fcode
!= BUILT_IN_MEMPCPY_CHK
)
1706 replace_call_with_value (gsi
, dest
);
1711 gimple_seq stmts
= NULL
;
1712 len
= gimple_convert_to_ptrofftype (&stmts
, loc
, len
);
1713 tree temp
= gimple_build (&stmts
, loc
, POINTER_PLUS_EXPR
, dest
, len
);
1714 gsi_insert_seq_before (gsi
, stmts
, GSI_SAME_STMT
);
1715 replace_call_with_value (gsi
, temp
);
1720 if (! tree_fits_uhwi_p (size
))
1723 tree maxlen
= get_maxval_strlen (len
, 2);
1724 if (! integer_all_onesp (size
))
1726 if (! tree_fits_uhwi_p (len
))
1728 /* If LEN is not constant, try MAXLEN too.
1729 For MAXLEN only allow optimizing into non-_ocs function
1730 if SIZE is >= MAXLEN, never convert to __ocs_fail (). */
1731 if (maxlen
== NULL_TREE
|| ! tree_fits_uhwi_p (maxlen
))
1733 if (fcode
== BUILT_IN_MEMPCPY_CHK
&& ignore
)
1735 /* (void) __mempcpy_chk () can be optimized into
1736 (void) __memcpy_chk (). */
1737 fn
= builtin_decl_explicit (BUILT_IN_MEMCPY_CHK
);
1741 gimple
*repl
= gimple_build_call (fn
, 4, dest
, src
, len
, size
);
1742 replace_call_with_call_and_fold (gsi
, repl
);
1751 if (tree_int_cst_lt (size
, maxlen
))
1756 /* If __builtin_mem{cpy,pcpy,move,set}_chk is used, assume
1757 mem{cpy,pcpy,move,set} is available. */
1760 case BUILT_IN_MEMCPY_CHK
:
1761 fn
= builtin_decl_explicit (BUILT_IN_MEMCPY
);
1763 case BUILT_IN_MEMPCPY_CHK
:
1764 fn
= builtin_decl_explicit (BUILT_IN_MEMPCPY
);
1766 case BUILT_IN_MEMMOVE_CHK
:
1767 fn
= builtin_decl_explicit (BUILT_IN_MEMMOVE
);
1769 case BUILT_IN_MEMSET_CHK
:
1770 fn
= builtin_decl_explicit (BUILT_IN_MEMSET
);
1779 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, len
);
1780 replace_call_with_call_and_fold (gsi
, repl
);
1784 /* Fold a call to the __st[rp]cpy_chk builtin.
1785 DEST, SRC, and SIZE are the arguments to the call.
1786 IGNORE is true if return value can be ignored. FCODE is the BUILT_IN_*
1787 code of the builtin. If MAXLEN is not NULL, it is maximum length of
1788 strings passed as second argument. */
1791 gimple_fold_builtin_stxcpy_chk (gimple_stmt_iterator
*gsi
,
1793 tree src
, tree size
,
1794 enum built_in_function fcode
)
1796 gimple
*stmt
= gsi_stmt (*gsi
);
1797 location_t loc
= gimple_location (stmt
);
1798 bool ignore
= gimple_call_lhs (stmt
) == NULL_TREE
;
1801 /* If SRC and DEST are the same (and not volatile), return DEST. */
1802 if (fcode
== BUILT_IN_STRCPY_CHK
&& operand_equal_p (src
, dest
, 0))
1804 replace_call_with_value (gsi
, dest
);
1808 if (! tree_fits_uhwi_p (size
))
1811 tree maxlen
= get_maxval_strlen (src
, 1);
1812 if (! integer_all_onesp (size
))
1814 len
= c_strlen (src
, 1);
1815 if (! len
|| ! tree_fits_uhwi_p (len
))
1817 /* If LEN is not constant, try MAXLEN too.
1818 For MAXLEN only allow optimizing into non-_ocs function
1819 if SIZE is >= MAXLEN, never convert to __ocs_fail (). */
1820 if (maxlen
== NULL_TREE
|| ! tree_fits_uhwi_p (maxlen
))
1822 if (fcode
== BUILT_IN_STPCPY_CHK
)
1827 /* If return value of __stpcpy_chk is ignored,
1828 optimize into __strcpy_chk. */
1829 fn
= builtin_decl_explicit (BUILT_IN_STRCPY_CHK
);
1833 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, size
);
1834 replace_call_with_call_and_fold (gsi
, repl
);
1838 if (! len
|| TREE_SIDE_EFFECTS (len
))
1841 /* If c_strlen returned something, but not a constant,
1842 transform __strcpy_chk into __memcpy_chk. */
1843 fn
= builtin_decl_explicit (BUILT_IN_MEMCPY_CHK
);
1847 gimple_seq stmts
= NULL
;
1848 len
= gimple_convert (&stmts
, loc
, size_type_node
, len
);
1849 len
= gimple_build (&stmts
, loc
, PLUS_EXPR
, size_type_node
, len
,
1850 build_int_cst (size_type_node
, 1));
1851 gsi_insert_seq_before (gsi
, stmts
, GSI_SAME_STMT
);
1852 gimple
*repl
= gimple_build_call (fn
, 4, dest
, src
, len
, size
);
1853 replace_call_with_call_and_fold (gsi
, repl
);
1860 if (! tree_int_cst_lt (maxlen
, size
))
1864 /* If __builtin_st{r,p}cpy_chk is used, assume st{r,p}cpy is available. */
1865 fn
= builtin_decl_explicit (fcode
== BUILT_IN_STPCPY_CHK
1866 ? BUILT_IN_STPCPY
: BUILT_IN_STRCPY
);
1870 gimple
*repl
= gimple_build_call (fn
, 2, dest
, src
);
1871 replace_call_with_call_and_fold (gsi
, repl
);
1875 /* Fold a call to the __st{r,p}ncpy_chk builtin. DEST, SRC, LEN, and SIZE
1876 are the arguments to the call. If MAXLEN is not NULL, it is maximum
1877 length passed as third argument. IGNORE is true if return value can be
1878 ignored. FCODE is the BUILT_IN_* code of the builtin. */
1881 gimple_fold_builtin_stxncpy_chk (gimple_stmt_iterator
*gsi
,
1882 tree dest
, tree src
,
1883 tree len
, tree size
,
1884 enum built_in_function fcode
)
1886 gimple
*stmt
= gsi_stmt (*gsi
);
1887 bool ignore
= gimple_call_lhs (stmt
) == NULL_TREE
;
1890 if (fcode
== BUILT_IN_STPNCPY_CHK
&& ignore
)
1892 /* If return value of __stpncpy_chk is ignored,
1893 optimize into __strncpy_chk. */
1894 fn
= builtin_decl_explicit (BUILT_IN_STRNCPY_CHK
);
1897 gimple
*repl
= gimple_build_call (fn
, 4, dest
, src
, len
, size
);
1898 replace_call_with_call_and_fold (gsi
, repl
);
1903 if (! tree_fits_uhwi_p (size
))
1906 tree maxlen
= get_maxval_strlen (len
, 2);
1907 if (! integer_all_onesp (size
))
1909 if (! tree_fits_uhwi_p (len
))
1911 /* If LEN is not constant, try MAXLEN too.
1912 For MAXLEN only allow optimizing into non-_ocs function
1913 if SIZE is >= MAXLEN, never convert to __ocs_fail (). */
1914 if (maxlen
== NULL_TREE
|| ! tree_fits_uhwi_p (maxlen
))
1920 if (tree_int_cst_lt (size
, maxlen
))
1924 /* If __builtin_st{r,p}ncpy_chk is used, assume st{r,p}ncpy is available. */
1925 fn
= builtin_decl_explicit (fcode
== BUILT_IN_STPNCPY_CHK
1926 ? BUILT_IN_STPNCPY
: BUILT_IN_STRNCPY
);
1930 gimple
*repl
= gimple_build_call (fn
, 3, dest
, src
, len
);
1931 replace_call_with_call_and_fold (gsi
, repl
);
1935 /* Fold function call to builtin stpcpy with arguments DEST and SRC.
1936 Return NULL_TREE if no simplification can be made. */
1939 gimple_fold_builtin_stpcpy (gimple_stmt_iterator
*gsi
)
1941 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
1942 location_t loc
= gimple_location (stmt
);
1943 tree dest
= gimple_call_arg (stmt
, 0);
1944 tree src
= gimple_call_arg (stmt
, 1);
1945 tree fn
, len
, lenp1
;
1947 /* If the result is unused, replace stpcpy with strcpy. */
1948 if (gimple_call_lhs (stmt
) == NULL_TREE
)
1950 tree fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
1953 gimple_call_set_fndecl (stmt
, fn
);
1958 len
= c_strlen (src
, 1);
1960 || TREE_CODE (len
) != INTEGER_CST
)
1963 if (optimize_function_for_size_p (cfun
)
1964 /* If length is zero it's small enough. */
1965 && !integer_zerop (len
))
1968 /* If the source has a known length replace stpcpy with memcpy. */
1969 fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
1973 gimple_seq stmts
= NULL
;
1974 tree tem
= gimple_convert (&stmts
, loc
, size_type_node
, len
);
1975 lenp1
= gimple_build (&stmts
, loc
, PLUS_EXPR
, size_type_node
,
1976 tem
, build_int_cst (size_type_node
, 1));
1977 gsi_insert_seq_before (gsi
, stmts
, GSI_SAME_STMT
);
1978 gcall
*repl
= gimple_build_call (fn
, 3, dest
, src
, lenp1
);
1979 gimple_set_vuse (repl
, gimple_vuse (stmt
));
1980 gimple_set_vdef (repl
, gimple_vdef (stmt
));
1981 if (gimple_vdef (repl
)
1982 && TREE_CODE (gimple_vdef (repl
)) == SSA_NAME
)
1983 SSA_NAME_DEF_STMT (gimple_vdef (repl
)) = repl
;
1984 gsi_insert_before (gsi
, repl
, GSI_SAME_STMT
);
1985 /* Replace the result with dest + len. */
1987 tem
= gimple_convert (&stmts
, loc
, sizetype
, len
);
1988 gsi_insert_seq_before (gsi
, stmts
, GSI_SAME_STMT
);
1989 gassign
*ret
= gimple_build_assign (gimple_call_lhs (stmt
),
1990 POINTER_PLUS_EXPR
, dest
, tem
);
1991 gsi_replace (gsi
, ret
, false);
1992 /* Finally fold the memcpy call. */
1993 gimple_stmt_iterator gsi2
= *gsi
;
1999 /* Fold a call EXP to {,v}snprintf having NARGS passed as ARGS. Return
2000 NULL_TREE if a normal call should be emitted rather than expanding
2001 the function inline. FCODE is either BUILT_IN_SNPRINTF_CHK or
2002 BUILT_IN_VSNPRINTF_CHK. If MAXLEN is not NULL, it is maximum length
2003 passed as second argument. */
2006 gimple_fold_builtin_snprintf_chk (gimple_stmt_iterator
*gsi
,
2007 enum built_in_function fcode
)
2009 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
2010 tree dest
, size
, len
, fn
, fmt
, flag
;
2011 const char *fmt_str
;
2013 /* Verify the required arguments in the original call. */
2014 if (gimple_call_num_args (stmt
) < 5)
2017 dest
= gimple_call_arg (stmt
, 0);
2018 len
= gimple_call_arg (stmt
, 1);
2019 flag
= gimple_call_arg (stmt
, 2);
2020 size
= gimple_call_arg (stmt
, 3);
2021 fmt
= gimple_call_arg (stmt
, 4);
2023 if (! tree_fits_uhwi_p (size
))
2026 if (! integer_all_onesp (size
))
2028 tree maxlen
= get_maxval_strlen (len
, 2);
2029 if (! tree_fits_uhwi_p (len
))
2031 /* If LEN is not constant, try MAXLEN too.
2032 For MAXLEN only allow optimizing into non-_ocs function
2033 if SIZE is >= MAXLEN, never convert to __ocs_fail (). */
2034 if (maxlen
== NULL_TREE
|| ! tree_fits_uhwi_p (maxlen
))
2040 if (tree_int_cst_lt (size
, maxlen
))
2044 if (!init_target_chars ())
2047 /* Only convert __{,v}snprintf_chk to {,v}snprintf if flag is 0
2048 or if format doesn't contain % chars or is "%s". */
2049 if (! integer_zerop (flag
))
2051 fmt_str
= c_getstr (fmt
);
2052 if (fmt_str
== NULL
)
2054 if (strchr (fmt_str
, target_percent
) != NULL
2055 && strcmp (fmt_str
, target_percent_s
))
2059 /* If __builtin_{,v}snprintf_chk is used, assume {,v}snprintf is
2061 fn
= builtin_decl_explicit (fcode
== BUILT_IN_VSNPRINTF_CHK
2062 ? BUILT_IN_VSNPRINTF
: BUILT_IN_SNPRINTF
);
2066 /* Replace the called function and the first 5 argument by 3 retaining
2067 trailing varargs. */
2068 gimple_call_set_fndecl (stmt
, fn
);
2069 gimple_call_set_fntype (stmt
, TREE_TYPE (fn
));
2070 gimple_call_set_arg (stmt
, 0, dest
);
2071 gimple_call_set_arg (stmt
, 1, len
);
2072 gimple_call_set_arg (stmt
, 2, fmt
);
2073 for (unsigned i
= 3; i
< gimple_call_num_args (stmt
) - 2; ++i
)
2074 gimple_call_set_arg (stmt
, i
, gimple_call_arg (stmt
, i
+ 2));
2075 gimple_set_num_ops (stmt
, gimple_num_ops (stmt
) - 2);
2080 /* Fold a call EXP to __{,v}sprintf_chk having NARGS passed as ARGS.
2081 Return NULL_TREE if a normal call should be emitted rather than
2082 expanding the function inline. FCODE is either BUILT_IN_SPRINTF_CHK
2083 or BUILT_IN_VSPRINTF_CHK. */
2086 gimple_fold_builtin_sprintf_chk (gimple_stmt_iterator
*gsi
,
2087 enum built_in_function fcode
)
2089 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
2090 tree dest
, size
, len
, fn
, fmt
, flag
;
2091 const char *fmt_str
;
2092 unsigned nargs
= gimple_call_num_args (stmt
);
2094 /* Verify the required arguments in the original call. */
2097 dest
= gimple_call_arg (stmt
, 0);
2098 flag
= gimple_call_arg (stmt
, 1);
2099 size
= gimple_call_arg (stmt
, 2);
2100 fmt
= gimple_call_arg (stmt
, 3);
2102 if (! tree_fits_uhwi_p (size
))
2107 if (!init_target_chars ())
2110 /* Check whether the format is a literal string constant. */
2111 fmt_str
= c_getstr (fmt
);
2112 if (fmt_str
!= NULL
)
2114 /* If the format doesn't contain % args or %%, we know the size. */
2115 if (strchr (fmt_str
, target_percent
) == 0)
2117 if (fcode
!= BUILT_IN_SPRINTF_CHK
|| nargs
== 4)
2118 len
= build_int_cstu (size_type_node
, strlen (fmt_str
));
2120 /* If the format is "%s" and first ... argument is a string literal,
2121 we know the size too. */
2122 else if (fcode
== BUILT_IN_SPRINTF_CHK
2123 && strcmp (fmt_str
, target_percent_s
) == 0)
2129 arg
= gimple_call_arg (stmt
, 4);
2130 if (POINTER_TYPE_P (TREE_TYPE (arg
)))
2132 len
= c_strlen (arg
, 1);
2133 if (! len
|| ! tree_fits_uhwi_p (len
))
2140 if (! integer_all_onesp (size
))
2142 if (! len
|| ! tree_int_cst_lt (len
, size
))
2146 /* Only convert __{,v}sprintf_chk to {,v}sprintf if flag is 0
2147 or if format doesn't contain % chars or is "%s". */
2148 if (! integer_zerop (flag
))
2150 if (fmt_str
== NULL
)
2152 if (strchr (fmt_str
, target_percent
) != NULL
2153 && strcmp (fmt_str
, target_percent_s
))
2157 /* If __builtin_{,v}sprintf_chk is used, assume {,v}sprintf is available. */
2158 fn
= builtin_decl_explicit (fcode
== BUILT_IN_VSPRINTF_CHK
2159 ? BUILT_IN_VSPRINTF
: BUILT_IN_SPRINTF
);
2163 /* Replace the called function and the first 4 argument by 2 retaining
2164 trailing varargs. */
2165 gimple_call_set_fndecl (stmt
, fn
);
2166 gimple_call_set_fntype (stmt
, TREE_TYPE (fn
));
2167 gimple_call_set_arg (stmt
, 0, dest
);
2168 gimple_call_set_arg (stmt
, 1, fmt
);
2169 for (unsigned i
= 2; i
< gimple_call_num_args (stmt
) - 2; ++i
)
2170 gimple_call_set_arg (stmt
, i
, gimple_call_arg (stmt
, i
+ 2));
2171 gimple_set_num_ops (stmt
, gimple_num_ops (stmt
) - 2);
2176 /* Simplify a call to the sprintf builtin with arguments DEST, FMT, and ORIG.
2177 ORIG may be null if this is a 2-argument call. We don't attempt to
2178 simplify calls with more than 3 arguments.
2180 Return NULL_TREE if no simplification was possible, otherwise return the
2181 simplified form of the call as a tree. If IGNORED is true, it means that
2182 the caller does not use the returned value of the function. */
2185 gimple_fold_builtin_sprintf (gimple_stmt_iterator
*gsi
)
2187 gimple
*stmt
= gsi_stmt (*gsi
);
2188 tree dest
= gimple_call_arg (stmt
, 0);
2189 tree fmt
= gimple_call_arg (stmt
, 1);
2190 tree orig
= NULL_TREE
;
2191 const char *fmt_str
= NULL
;
2193 /* Verify the required arguments in the original call. We deal with two
2194 types of sprintf() calls: 'sprintf (str, fmt)' and
2195 'sprintf (dest, "%s", orig)'. */
2196 if (gimple_call_num_args (stmt
) > 3)
2199 if (gimple_call_num_args (stmt
) == 3)
2200 orig
= gimple_call_arg (stmt
, 2);
2202 /* Check whether the format is a literal string constant. */
2203 fmt_str
= c_getstr (fmt
);
2204 if (fmt_str
== NULL
)
2207 if (!init_target_chars ())
2210 /* If the format doesn't contain % args or %%, use strcpy. */
2211 if (strchr (fmt_str
, target_percent
) == NULL
)
2213 tree fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
2218 /* Don't optimize sprintf (buf, "abc", ptr++). */
2222 /* Convert sprintf (str, fmt) into strcpy (str, fmt) when
2223 'format' is known to contain no % formats. */
2224 gimple_seq stmts
= NULL
;
2225 gimple
*repl
= gimple_build_call (fn
, 2, dest
, fmt
);
2226 gimple_seq_add_stmt_without_update (&stmts
, repl
);
2227 if (gimple_call_lhs (stmt
))
2229 repl
= gimple_build_assign (gimple_call_lhs (stmt
),
2230 build_int_cst (integer_type_node
,
2232 gimple_seq_add_stmt_without_update (&stmts
, repl
);
2233 gsi_replace_with_seq_vops (gsi
, stmts
);
2234 /* gsi now points at the assignment to the lhs, get a
2235 stmt iterator to the memcpy call.
2236 ??? We can't use gsi_for_stmt as that doesn't work when the
2237 CFG isn't built yet. */
2238 gimple_stmt_iterator gsi2
= *gsi
;
2244 gsi_replace_with_seq_vops (gsi
, stmts
);
2250 /* If the format is "%s", use strcpy if the result isn't used. */
2251 else if (fmt_str
&& strcmp (fmt_str
, target_percent_s
) == 0)
2254 fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
2259 /* Don't crash on sprintf (str1, "%s"). */
2263 tree orig_len
= NULL_TREE
;
2264 if (gimple_call_lhs (stmt
))
2266 orig_len
= get_maxval_strlen (orig
, 0);
2271 /* Convert sprintf (str1, "%s", str2) into strcpy (str1, str2). */
2272 gimple_seq stmts
= NULL
;
2273 gimple
*repl
= gimple_build_call (fn
, 2, dest
, orig
);
2274 gimple_seq_add_stmt_without_update (&stmts
, repl
);
2275 if (gimple_call_lhs (stmt
))
2277 if (!useless_type_conversion_p (integer_type_node
,
2278 TREE_TYPE (orig_len
)))
2279 orig_len
= fold_convert (integer_type_node
, orig_len
);
2280 repl
= gimple_build_assign (gimple_call_lhs (stmt
), orig_len
);
2281 gimple_seq_add_stmt_without_update (&stmts
, repl
);
2282 gsi_replace_with_seq_vops (gsi
, stmts
);
2283 /* gsi now points at the assignment to the lhs, get a
2284 stmt iterator to the memcpy call.
2285 ??? We can't use gsi_for_stmt as that doesn't work when the
2286 CFG isn't built yet. */
2287 gimple_stmt_iterator gsi2
= *gsi
;
2293 gsi_replace_with_seq_vops (gsi
, stmts
);
2301 /* Simplify a call to the snprintf builtin with arguments DEST, DESTSIZE,
2302 FMT, and ORIG. ORIG may be null if this is a 3-argument call. We don't
2303 attempt to simplify calls with more than 4 arguments.
2305 Return NULL_TREE if no simplification was possible, otherwise return the
2306 simplified form of the call as a tree. If IGNORED is true, it means that
2307 the caller does not use the returned value of the function. */
2310 gimple_fold_builtin_snprintf (gimple_stmt_iterator
*gsi
)
2312 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
2313 tree dest
= gimple_call_arg (stmt
, 0);
2314 tree destsize
= gimple_call_arg (stmt
, 1);
2315 tree fmt
= gimple_call_arg (stmt
, 2);
2316 tree orig
= NULL_TREE
;
2317 const char *fmt_str
= NULL
;
2319 if (gimple_call_num_args (stmt
) > 4)
2322 if (gimple_call_num_args (stmt
) == 4)
2323 orig
= gimple_call_arg (stmt
, 3);
2325 if (!tree_fits_uhwi_p (destsize
))
2327 unsigned HOST_WIDE_INT destlen
= tree_to_uhwi (destsize
);
2329 /* Check whether the format is a literal string constant. */
2330 fmt_str
= c_getstr (fmt
);
2331 if (fmt_str
== NULL
)
2334 if (!init_target_chars ())
2337 /* If the format doesn't contain % args or %%, use strcpy. */
2338 if (strchr (fmt_str
, target_percent
) == NULL
)
2340 tree fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
2344 /* Don't optimize snprintf (buf, 4, "abc", ptr++). */
2348 /* We could expand this as
2349 memcpy (str, fmt, cst - 1); str[cst - 1] = '\0';
2351 memcpy (str, fmt_with_nul_at_cstm1, cst);
2352 but in the former case that might increase code size
2353 and in the latter case grow .rodata section too much.
2355 size_t len
= strlen (fmt_str
);
2359 gimple_seq stmts
= NULL
;
2360 gimple
*repl
= gimple_build_call (fn
, 2, dest
, fmt
);
2361 gimple_seq_add_stmt_without_update (&stmts
, repl
);
2362 if (gimple_call_lhs (stmt
))
2364 repl
= gimple_build_assign (gimple_call_lhs (stmt
),
2365 build_int_cst (integer_type_node
, len
));
2366 gimple_seq_add_stmt_without_update (&stmts
, repl
);
2367 gsi_replace_with_seq_vops (gsi
, stmts
);
2368 /* gsi now points at the assignment to the lhs, get a
2369 stmt iterator to the memcpy call.
2370 ??? We can't use gsi_for_stmt as that doesn't work when the
2371 CFG isn't built yet. */
2372 gimple_stmt_iterator gsi2
= *gsi
;
2378 gsi_replace_with_seq_vops (gsi
, stmts
);
2384 /* If the format is "%s", use strcpy if the result isn't used. */
2385 else if (fmt_str
&& strcmp (fmt_str
, target_percent_s
) == 0)
2387 tree fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
2391 /* Don't crash on snprintf (str1, cst, "%s"). */
2395 tree orig_len
= get_maxval_strlen (orig
, 0);
2396 if (!orig_len
|| TREE_CODE (orig_len
) != INTEGER_CST
)
2399 /* We could expand this as
2400 memcpy (str1, str2, cst - 1); str1[cst - 1] = '\0';
2402 memcpy (str1, str2_with_nul_at_cstm1, cst);
2403 but in the former case that might increase code size
2404 and in the latter case grow .rodata section too much.
2406 if (compare_tree_int (orig_len
, destlen
) >= 0)
2409 /* Convert snprintf (str1, cst, "%s", str2) into
2410 strcpy (str1, str2) if strlen (str2) < cst. */
2411 gimple_seq stmts
= NULL
;
2412 gimple
*repl
= gimple_build_call (fn
, 2, dest
, orig
);
2413 gimple_seq_add_stmt_without_update (&stmts
, repl
);
2414 if (gimple_call_lhs (stmt
))
2416 if (!useless_type_conversion_p (integer_type_node
,
2417 TREE_TYPE (orig_len
)))
2418 orig_len
= fold_convert (integer_type_node
, orig_len
);
2419 repl
= gimple_build_assign (gimple_call_lhs (stmt
), orig_len
);
2420 gimple_seq_add_stmt_without_update (&stmts
, repl
);
2421 gsi_replace_with_seq_vops (gsi
, stmts
);
2422 /* gsi now points at the assignment to the lhs, get a
2423 stmt iterator to the memcpy call.
2424 ??? We can't use gsi_for_stmt as that doesn't work when the
2425 CFG isn't built yet. */
2426 gimple_stmt_iterator gsi2
= *gsi
;
2432 gsi_replace_with_seq_vops (gsi
, stmts
);
2440 /* Fold a call to the {,v}fprintf{,_unlocked} and __{,v}printf_chk builtins.
2441 FP, FMT, and ARG are the arguments to the call. We don't fold calls with
2442 more than 3 arguments, and ARG may be null in the 2-argument case.
2444 Return NULL_TREE if no simplification was possible, otherwise return the
2445 simplified form of the call as a tree. FCODE is the BUILT_IN_*
2446 code of the function to be simplified. */
2449 gimple_fold_builtin_fprintf (gimple_stmt_iterator
*gsi
,
2450 tree fp
, tree fmt
, tree arg
,
2451 enum built_in_function fcode
)
2453 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
2454 tree fn_fputc
, fn_fputs
;
2455 const char *fmt_str
= NULL
;
2457 /* If the return value is used, don't do the transformation. */
2458 if (gimple_call_lhs (stmt
) != NULL_TREE
)
2461 /* Check whether the format is a literal string constant. */
2462 fmt_str
= c_getstr (fmt
);
2463 if (fmt_str
== NULL
)
2466 if (fcode
== BUILT_IN_FPRINTF_UNLOCKED
)
2468 /* If we're using an unlocked function, assume the other
2469 unlocked functions exist explicitly. */
2470 fn_fputc
= builtin_decl_explicit (BUILT_IN_FPUTC_UNLOCKED
);
2471 fn_fputs
= builtin_decl_explicit (BUILT_IN_FPUTS_UNLOCKED
);
2475 fn_fputc
= builtin_decl_implicit (BUILT_IN_FPUTC
);
2476 fn_fputs
= builtin_decl_implicit (BUILT_IN_FPUTS
);
2479 if (!init_target_chars ())
2482 /* If the format doesn't contain % args or %%, use strcpy. */
2483 if (strchr (fmt_str
, target_percent
) == NULL
)
2485 if (fcode
!= BUILT_IN_VFPRINTF
&& fcode
!= BUILT_IN_VFPRINTF_CHK
2489 /* If the format specifier was "", fprintf does nothing. */
2490 if (fmt_str
[0] == '\0')
2492 replace_call_with_value (gsi
, NULL_TREE
);
2496 /* When "string" doesn't contain %, replace all cases of
2497 fprintf (fp, string) with fputs (string, fp). The fputs
2498 builtin will take care of special cases like length == 1. */
2501 gcall
*repl
= gimple_build_call (fn_fputs
, 2, fmt
, fp
);
2502 replace_call_with_call_and_fold (gsi
, repl
);
2507 /* The other optimizations can be done only on the non-va_list variants. */
2508 else if (fcode
== BUILT_IN_VFPRINTF
|| fcode
== BUILT_IN_VFPRINTF_CHK
)
2511 /* If the format specifier was "%s", call __builtin_fputs (arg, fp). */
2512 else if (strcmp (fmt_str
, target_percent_s
) == 0)
2514 if (!arg
|| ! POINTER_TYPE_P (TREE_TYPE (arg
)))
2518 gcall
*repl
= gimple_build_call (fn_fputs
, 2, arg
, fp
);
2519 replace_call_with_call_and_fold (gsi
, repl
);
2524 /* If the format specifier was "%c", call __builtin_fputc (arg, fp). */
2525 else if (strcmp (fmt_str
, target_percent_c
) == 0)
2528 || ! useless_type_conversion_p (integer_type_node
, TREE_TYPE (arg
)))
2532 gcall
*repl
= gimple_build_call (fn_fputc
, 2, arg
, fp
);
2533 replace_call_with_call_and_fold (gsi
, repl
);
2541 /* Fold a call to the {,v}printf{,_unlocked} and __{,v}printf_chk builtins.
2542 FMT and ARG are the arguments to the call; we don't fold cases with
2543 more than 2 arguments, and ARG may be null if this is a 1-argument case.
2545 Return NULL_TREE if no simplification was possible, otherwise return the
2546 simplified form of the call as a tree. FCODE is the BUILT_IN_*
2547 code of the function to be simplified. */
2550 gimple_fold_builtin_printf (gimple_stmt_iterator
*gsi
, tree fmt
,
2551 tree arg
, enum built_in_function fcode
)
2553 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
2554 tree fn_putchar
, fn_puts
, newarg
;
2555 const char *fmt_str
= NULL
;
2557 /* If the return value is used, don't do the transformation. */
2558 if (gimple_call_lhs (stmt
) != NULL_TREE
)
2561 /* Check whether the format is a literal string constant. */
2562 fmt_str
= c_getstr (fmt
);
2563 if (fmt_str
== NULL
)
2566 if (fcode
== BUILT_IN_PRINTF_UNLOCKED
)
2568 /* If we're using an unlocked function, assume the other
2569 unlocked functions exist explicitly. */
2570 fn_putchar
= builtin_decl_explicit (BUILT_IN_PUTCHAR_UNLOCKED
);
2571 fn_puts
= builtin_decl_explicit (BUILT_IN_PUTS_UNLOCKED
);
2575 fn_putchar
= builtin_decl_implicit (BUILT_IN_PUTCHAR
);
2576 fn_puts
= builtin_decl_implicit (BUILT_IN_PUTS
);
2579 if (!init_target_chars ())
2582 if (strcmp (fmt_str
, target_percent_s
) == 0
2583 || strchr (fmt_str
, target_percent
) == NULL
)
2587 if (strcmp (fmt_str
, target_percent_s
) == 0)
2589 if (fcode
== BUILT_IN_VPRINTF
|| fcode
== BUILT_IN_VPRINTF_CHK
)
2592 if (!arg
|| ! POINTER_TYPE_P (TREE_TYPE (arg
)))
2595 str
= c_getstr (arg
);
2601 /* The format specifier doesn't contain any '%' characters. */
2602 if (fcode
!= BUILT_IN_VPRINTF
&& fcode
!= BUILT_IN_VPRINTF_CHK
2608 /* If the string was "", printf does nothing. */
2611 replace_call_with_value (gsi
, NULL_TREE
);
2615 /* If the string has length of 1, call putchar. */
2618 /* Given printf("c"), (where c is any one character,)
2619 convert "c"[0] to an int and pass that to the replacement
2621 newarg
= build_int_cst (integer_type_node
, str
[0]);
2624 gcall
*repl
= gimple_build_call (fn_putchar
, 1, newarg
);
2625 replace_call_with_call_and_fold (gsi
, repl
);
2631 /* If the string was "string\n", call puts("string"). */
2632 size_t len
= strlen (str
);
2633 if ((unsigned char)str
[len
- 1] == target_newline
2634 && (size_t) (int) len
== len
2638 tree offset_node
, string_cst
;
2640 /* Create a NUL-terminated string that's one char shorter
2641 than the original, stripping off the trailing '\n'. */
2642 newarg
= build_string_literal (len
, str
);
2643 string_cst
= string_constant (newarg
, &offset_node
);
2644 gcc_checking_assert (string_cst
2645 && (TREE_STRING_LENGTH (string_cst
)
2647 && integer_zerop (offset_node
)
2649 TREE_STRING_POINTER (string_cst
)[len
- 1]
2651 /* build_string_literal creates a new STRING_CST,
2652 modify it in place to avoid double copying. */
2653 newstr
= CONST_CAST (char *, TREE_STRING_POINTER (string_cst
));
2654 newstr
[len
- 1] = '\0';
2657 gcall
*repl
= gimple_build_call (fn_puts
, 1, newarg
);
2658 replace_call_with_call_and_fold (gsi
, repl
);
2663 /* We'd like to arrange to call fputs(string,stdout) here,
2664 but we need stdout and don't have a way to get it yet. */
2669 /* The other optimizations can be done only on the non-va_list variants. */
2670 else if (fcode
== BUILT_IN_VPRINTF
|| fcode
== BUILT_IN_VPRINTF_CHK
)
2673 /* If the format specifier was "%s\n", call __builtin_puts(arg). */
2674 else if (strcmp (fmt_str
, target_percent_s_newline
) == 0)
2676 if (!arg
|| ! POINTER_TYPE_P (TREE_TYPE (arg
)))
2680 gcall
*repl
= gimple_build_call (fn_puts
, 1, arg
);
2681 replace_call_with_call_and_fold (gsi
, repl
);
2686 /* If the format specifier was "%c", call __builtin_putchar(arg). */
2687 else if (strcmp (fmt_str
, target_percent_c
) == 0)
2689 if (!arg
|| ! useless_type_conversion_p (integer_type_node
,
2694 gcall
*repl
= gimple_build_call (fn_putchar
, 1, arg
);
2695 replace_call_with_call_and_fold (gsi
, repl
);
2705 /* Fold a call to __builtin_strlen with known length LEN. */
2708 gimple_fold_builtin_strlen (gimple_stmt_iterator
*gsi
)
2710 gimple
*stmt
= gsi_stmt (*gsi
);
2711 tree len
= get_maxval_strlen (gimple_call_arg (stmt
, 0), 0);
2714 len
= force_gimple_operand_gsi (gsi
, len
, true, NULL
, true, GSI_SAME_STMT
);
2715 replace_call_with_value (gsi
, len
);
2719 /* Fold a call to __builtin_acc_on_device. */
2722 gimple_fold_builtin_acc_on_device (gimple_stmt_iterator
*gsi
, tree arg0
)
2724 /* Defer folding until we know which compiler we're in. */
2725 if (symtab
->state
!= EXPANSION
)
2728 unsigned val_host
= GOMP_DEVICE_HOST
;
2729 unsigned val_dev
= GOMP_DEVICE_NONE
;
2731 #ifdef ACCEL_COMPILER
2732 val_host
= GOMP_DEVICE_NOT_HOST
;
2733 val_dev
= ACCEL_COMPILER_acc_device
;
2736 location_t loc
= gimple_location (gsi_stmt (*gsi
));
2738 tree host_eq
= make_ssa_name (boolean_type_node
);
2739 gimple
*host_ass
= gimple_build_assign
2740 (host_eq
, EQ_EXPR
, arg0
, build_int_cst (TREE_TYPE (arg0
), val_host
));
2741 gimple_set_location (host_ass
, loc
);
2742 gsi_insert_before (gsi
, host_ass
, GSI_SAME_STMT
);
2744 tree dev_eq
= make_ssa_name (boolean_type_node
);
2745 gimple
*dev_ass
= gimple_build_assign
2746 (dev_eq
, EQ_EXPR
, arg0
, build_int_cst (TREE_TYPE (arg0
), val_dev
));
2747 gimple_set_location (dev_ass
, loc
);
2748 gsi_insert_before (gsi
, dev_ass
, GSI_SAME_STMT
);
2750 tree result
= make_ssa_name (boolean_type_node
);
2751 gimple
*result_ass
= gimple_build_assign
2752 (result
, BIT_IOR_EXPR
, host_eq
, dev_eq
);
2753 gimple_set_location (result_ass
, loc
);
2754 gsi_insert_before (gsi
, result_ass
, GSI_SAME_STMT
);
2756 replace_call_with_value (gsi
, result
);
2761 /* Fold the non-target builtin at *GSI and return whether any simplification
2765 gimple_fold_builtin (gimple_stmt_iterator
*gsi
)
2767 gcall
*stmt
= as_a
<gcall
*>(gsi_stmt (*gsi
));
2768 tree callee
= gimple_call_fndecl (stmt
);
2770 /* Give up for always_inline inline builtins until they are
2772 if (avoid_folding_inline_builtin (callee
))
2775 unsigned n
= gimple_call_num_args (stmt
);
2776 enum built_in_function fcode
= DECL_FUNCTION_CODE (callee
);
2779 case BUILT_IN_BZERO
:
2780 return gimple_fold_builtin_memset (gsi
, integer_zero_node
,
2781 gimple_call_arg (stmt
, 1));
2782 case BUILT_IN_MEMSET
:
2783 return gimple_fold_builtin_memset (gsi
,
2784 gimple_call_arg (stmt
, 1),
2785 gimple_call_arg (stmt
, 2));
2786 case BUILT_IN_BCOPY
:
2787 return gimple_fold_builtin_memory_op (gsi
, gimple_call_arg (stmt
, 1),
2788 gimple_call_arg (stmt
, 0), 3);
2789 case BUILT_IN_MEMCPY
:
2790 return gimple_fold_builtin_memory_op (gsi
, gimple_call_arg (stmt
, 0),
2791 gimple_call_arg (stmt
, 1), 0);
2792 case BUILT_IN_MEMPCPY
:
2793 return gimple_fold_builtin_memory_op (gsi
, gimple_call_arg (stmt
, 0),
2794 gimple_call_arg (stmt
, 1), 1);
2795 case BUILT_IN_MEMMOVE
:
2796 return gimple_fold_builtin_memory_op (gsi
, gimple_call_arg (stmt
, 0),
2797 gimple_call_arg (stmt
, 1), 3);
2798 case BUILT_IN_SPRINTF_CHK
:
2799 case BUILT_IN_VSPRINTF_CHK
:
2800 return gimple_fold_builtin_sprintf_chk (gsi
, fcode
);
2801 case BUILT_IN_STRCAT_CHK
:
2802 return gimple_fold_builtin_strcat_chk (gsi
);
2803 case BUILT_IN_STRNCAT_CHK
:
2804 return gimple_fold_builtin_strncat_chk (gsi
);
2805 case BUILT_IN_STRLEN
:
2806 return gimple_fold_builtin_strlen (gsi
);
2807 case BUILT_IN_STRCPY
:
2808 return gimple_fold_builtin_strcpy (gsi
,
2809 gimple_call_arg (stmt
, 0),
2810 gimple_call_arg (stmt
, 1));
2811 case BUILT_IN_STRNCPY
:
2812 return gimple_fold_builtin_strncpy (gsi
,
2813 gimple_call_arg (stmt
, 0),
2814 gimple_call_arg (stmt
, 1),
2815 gimple_call_arg (stmt
, 2));
2816 case BUILT_IN_STRCAT
:
2817 return gimple_fold_builtin_strcat (gsi
, gimple_call_arg (stmt
, 0),
2818 gimple_call_arg (stmt
, 1));
2819 case BUILT_IN_STRNCAT
:
2820 return gimple_fold_builtin_strncat (gsi
);
2821 case BUILT_IN_FPUTS
:
2822 return gimple_fold_builtin_fputs (gsi
, gimple_call_arg (stmt
, 0),
2823 gimple_call_arg (stmt
, 1), false);
2824 case BUILT_IN_FPUTS_UNLOCKED
:
2825 return gimple_fold_builtin_fputs (gsi
, gimple_call_arg (stmt
, 0),
2826 gimple_call_arg (stmt
, 1), true);
2827 case BUILT_IN_MEMCPY_CHK
:
2828 case BUILT_IN_MEMPCPY_CHK
:
2829 case BUILT_IN_MEMMOVE_CHK
:
2830 case BUILT_IN_MEMSET_CHK
:
2831 return gimple_fold_builtin_memory_chk (gsi
,
2832 gimple_call_arg (stmt
, 0),
2833 gimple_call_arg (stmt
, 1),
2834 gimple_call_arg (stmt
, 2),
2835 gimple_call_arg (stmt
, 3),
2837 case BUILT_IN_STPCPY
:
2838 return gimple_fold_builtin_stpcpy (gsi
);
2839 case BUILT_IN_STRCPY_CHK
:
2840 case BUILT_IN_STPCPY_CHK
:
2841 return gimple_fold_builtin_stxcpy_chk (gsi
,
2842 gimple_call_arg (stmt
, 0),
2843 gimple_call_arg (stmt
, 1),
2844 gimple_call_arg (stmt
, 2),
2846 case BUILT_IN_STRNCPY_CHK
:
2847 case BUILT_IN_STPNCPY_CHK
:
2848 return gimple_fold_builtin_stxncpy_chk (gsi
,
2849 gimple_call_arg (stmt
, 0),
2850 gimple_call_arg (stmt
, 1),
2851 gimple_call_arg (stmt
, 2),
2852 gimple_call_arg (stmt
, 3),
2854 case BUILT_IN_SNPRINTF_CHK
:
2855 case BUILT_IN_VSNPRINTF_CHK
:
2856 return gimple_fold_builtin_snprintf_chk (gsi
, fcode
);
2857 case BUILT_IN_SNPRINTF
:
2858 return gimple_fold_builtin_snprintf (gsi
);
2859 case BUILT_IN_SPRINTF
:
2860 return gimple_fold_builtin_sprintf (gsi
);
2861 case BUILT_IN_FPRINTF
:
2862 case BUILT_IN_FPRINTF_UNLOCKED
:
2863 case BUILT_IN_VFPRINTF
:
2864 if (n
== 2 || n
== 3)
2865 return gimple_fold_builtin_fprintf (gsi
,
2866 gimple_call_arg (stmt
, 0),
2867 gimple_call_arg (stmt
, 1),
2869 ? gimple_call_arg (stmt
, 2)
2873 case BUILT_IN_FPRINTF_CHK
:
2874 case BUILT_IN_VFPRINTF_CHK
:
2875 if (n
== 3 || n
== 4)
2876 return gimple_fold_builtin_fprintf (gsi
,
2877 gimple_call_arg (stmt
, 0),
2878 gimple_call_arg (stmt
, 2),
2880 ? gimple_call_arg (stmt
, 3)
2884 case BUILT_IN_PRINTF
:
2885 case BUILT_IN_PRINTF_UNLOCKED
:
2886 case BUILT_IN_VPRINTF
:
2887 if (n
== 1 || n
== 2)
2888 return gimple_fold_builtin_printf (gsi
, gimple_call_arg (stmt
, 0),
2890 ? gimple_call_arg (stmt
, 1)
2891 : NULL_TREE
, fcode
);
2893 case BUILT_IN_PRINTF_CHK
:
2894 case BUILT_IN_VPRINTF_CHK
:
2895 if (n
== 2 || n
== 3)
2896 return gimple_fold_builtin_printf (gsi
, gimple_call_arg (stmt
, 1),
2898 ? gimple_call_arg (stmt
, 2)
2899 : NULL_TREE
, fcode
);
2901 case BUILT_IN_ACC_ON_DEVICE
:
2902 return gimple_fold_builtin_acc_on_device (gsi
,
2903 gimple_call_arg (stmt
, 0));
2907 /* Try the generic builtin folder. */
2908 bool ignore
= (gimple_call_lhs (stmt
) == NULL
);
2909 tree result
= fold_call_stmt (stmt
, ignore
);
2913 STRIP_NOPS (result
);
2915 result
= fold_convert (gimple_call_return_type (stmt
), result
);
2916 if (!update_call_from_tree (gsi
, result
))
2917 gimplify_and_update_call_from_tree (gsi
, result
);
2924 /* Transform IFN_GOACC_DIM_SIZE and IFN_GOACC_DIM_POS internal
2925 function calls to constants, where possible. */
2928 fold_internal_goacc_dim (const gimple
*call
)
2930 int axis
= get_oacc_ifn_dim_arg (call
);
2931 int size
= get_oacc_fn_dim_size (current_function_decl
, axis
);
2932 bool is_pos
= gimple_call_internal_fn (call
) == IFN_GOACC_DIM_POS
;
2933 tree result
= NULL_TREE
;
2935 /* If the size is 1, or we only want the size and it is not dynamic,
2936 we know the answer. */
2937 if (size
== 1 || (!is_pos
&& size
))
2939 tree type
= TREE_TYPE (gimple_call_lhs (call
));
2940 result
= build_int_cst (type
, size
- is_pos
);
2946 /* Return true if ARG0 CODE ARG1 in infinite signed precision operation
2947 doesn't fit into TYPE. The test for overflow should be regardless of
2948 -fwrapv, and even for unsigned types. */
2951 arith_overflowed_p (enum tree_code code
, const_tree type
,
2952 const_tree arg0
, const_tree arg1
)
2954 typedef FIXED_WIDE_INT (WIDE_INT_MAX_PRECISION
* 2) widest2_int
;
2955 typedef generic_wide_int
<wi::extended_tree
<WIDE_INT_MAX_PRECISION
* 2> >
2957 widest2_int warg0
= widest2_int_cst (arg0
);
2958 widest2_int warg1
= widest2_int_cst (arg1
);
2962 case PLUS_EXPR
: wres
= wi::add (warg0
, warg1
); break;
2963 case MINUS_EXPR
: wres
= wi::sub (warg0
, warg1
); break;
2964 case MULT_EXPR
: wres
= wi::mul (warg0
, warg1
); break;
2965 default: gcc_unreachable ();
2967 signop sign
= TYPE_SIGN (type
);
2968 if (sign
== UNSIGNED
&& wi::neg_p (wres
))
2970 return wi::min_precision (wres
, sign
) > TYPE_PRECISION (type
);
2973 /* Attempt to fold a call statement referenced by the statement iterator GSI.
2974 The statement may be replaced by another statement, e.g., if the call
2975 simplifies to a constant value. Return true if any changes were made.
2976 It is assumed that the operands have been previously folded. */
2979 gimple_fold_call (gimple_stmt_iterator
*gsi
, bool inplace
)
2981 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
2983 bool changed
= false;
2986 /* Fold *& in call arguments. */
2987 for (i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
2988 if (REFERENCE_CLASS_P (gimple_call_arg (stmt
, i
)))
2990 tree tmp
= maybe_fold_reference (gimple_call_arg (stmt
, i
), false);
2993 gimple_call_set_arg (stmt
, i
, tmp
);
2998 /* Check for virtual calls that became direct calls. */
2999 callee
= gimple_call_fn (stmt
);
3000 if (callee
&& TREE_CODE (callee
) == OBJ_TYPE_REF
)
3002 if (gimple_call_addr_fndecl (OBJ_TYPE_REF_EXPR (callee
)) != NULL_TREE
)
3004 if (dump_file
&& virtual_method_call_p (callee
)
3005 && !possible_polymorphic_call_target_p
3006 (callee
, stmt
, cgraph_node::get (gimple_call_addr_fndecl
3007 (OBJ_TYPE_REF_EXPR (callee
)))))
3010 "Type inheritance inconsistent devirtualization of ");
3011 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
3012 fprintf (dump_file
, " to ");
3013 print_generic_expr (dump_file
, callee
, TDF_SLIM
);
3014 fprintf (dump_file
, "\n");
3017 gimple_call_set_fn (stmt
, OBJ_TYPE_REF_EXPR (callee
));
3020 else if (flag_devirtualize
&& !inplace
&& virtual_method_call_p (callee
))
3023 vec
<cgraph_node
*>targets
3024 = possible_polymorphic_call_targets (callee
, stmt
, &final
);
3025 if (final
&& targets
.length () <= 1 && dbg_cnt (devirt
))
3027 tree lhs
= gimple_call_lhs (stmt
);
3028 if (dump_enabled_p ())
3030 location_t loc
= gimple_location_safe (stmt
);
3031 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS
, loc
,
3032 "folding virtual function call to %s\n",
3033 targets
.length () == 1
3034 ? targets
[0]->name ()
3035 : "__builtin_unreachable");
3037 if (targets
.length () == 1)
3039 gimple_call_set_fndecl (stmt
, targets
[0]->decl
);
3041 /* If the call becomes noreturn, remove the lhs. */
3042 if (lhs
&& (gimple_call_flags (stmt
) & ECF_NORETURN
))
3044 if (TREE_CODE (lhs
) == SSA_NAME
)
3046 tree var
= create_tmp_var (TREE_TYPE (lhs
));
3047 tree def
= get_or_create_ssa_default_def (cfun
, var
);
3048 gimple
*new_stmt
= gimple_build_assign (lhs
, def
);
3049 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
3051 gimple_call_set_lhs (stmt
, NULL_TREE
);
3053 maybe_remove_unused_call_args (cfun
, stmt
);
3057 tree fndecl
= builtin_decl_implicit (BUILT_IN_UNREACHABLE
);
3058 gimple
*new_stmt
= gimple_build_call (fndecl
, 0);
3059 gimple_set_location (new_stmt
, gimple_location (stmt
));
3060 if (lhs
&& TREE_CODE (lhs
) == SSA_NAME
)
3062 tree var
= create_tmp_var (TREE_TYPE (lhs
));
3063 tree def
= get_or_create_ssa_default_def (cfun
, var
);
3065 /* To satisfy condition for
3066 cgraph_update_edges_for_call_stmt_node,
3067 we need to preserve GIMPLE_CALL statement
3068 at position of GSI iterator. */
3069 update_call_from_tree (gsi
, def
);
3070 gsi_insert_before (gsi
, new_stmt
, GSI_NEW_STMT
);
3074 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
3075 gimple_set_vdef (new_stmt
, gimple_vdef (stmt
));
3076 gsi_replace (gsi
, new_stmt
, false);
3084 /* Check for indirect calls that became direct calls, and then
3085 no longer require a static chain. */
3086 if (gimple_call_chain (stmt
))
3088 tree fn
= gimple_call_fndecl (stmt
);
3089 if (fn
&& !DECL_STATIC_CHAIN (fn
))
3091 gimple_call_set_chain (stmt
, NULL
);
3096 tree tmp
= maybe_fold_reference (gimple_call_chain (stmt
), false);
3099 gimple_call_set_chain (stmt
, tmp
);
3108 /* Check for builtins that CCP can handle using information not
3109 available in the generic fold routines. */
3110 if (gimple_call_builtin_p (stmt
, BUILT_IN_NORMAL
))
3112 if (gimple_fold_builtin (gsi
))
3115 else if (gimple_call_builtin_p (stmt
, BUILT_IN_MD
))
3117 changed
|= targetm
.gimple_fold_builtin (gsi
);
3119 else if (gimple_call_internal_p (stmt
))
3121 enum tree_code subcode
= ERROR_MARK
;
3122 tree result
= NULL_TREE
;
3123 bool cplx_result
= false;
3124 tree overflow
= NULL_TREE
;
3125 switch (gimple_call_internal_fn (stmt
))
3127 case IFN_BUILTIN_EXPECT
:
3128 result
= fold_builtin_expect (gimple_location (stmt
),
3129 gimple_call_arg (stmt
, 0),
3130 gimple_call_arg (stmt
, 1),
3131 gimple_call_arg (stmt
, 2));
3133 case IFN_UBSAN_OBJECT_SIZE
:
3134 if (integer_all_onesp (gimple_call_arg (stmt
, 2))
3135 || (TREE_CODE (gimple_call_arg (stmt
, 1)) == INTEGER_CST
3136 && TREE_CODE (gimple_call_arg (stmt
, 2)) == INTEGER_CST
3137 && tree_int_cst_le (gimple_call_arg (stmt
, 1),
3138 gimple_call_arg (stmt
, 2))))
3140 gsi_replace (gsi
, gimple_build_nop (), false);
3141 unlink_stmt_vdef (stmt
);
3142 release_defs (stmt
);
3146 case IFN_GOACC_DIM_SIZE
:
3147 case IFN_GOACC_DIM_POS
:
3148 result
= fold_internal_goacc_dim (stmt
);
3150 case IFN_UBSAN_CHECK_ADD
:
3151 subcode
= PLUS_EXPR
;
3153 case IFN_UBSAN_CHECK_SUB
:
3154 subcode
= MINUS_EXPR
;
3156 case IFN_UBSAN_CHECK_MUL
:
3157 subcode
= MULT_EXPR
;
3159 case IFN_ADD_OVERFLOW
:
3160 subcode
= PLUS_EXPR
;
3163 case IFN_SUB_OVERFLOW
:
3164 subcode
= MINUS_EXPR
;
3167 case IFN_MUL_OVERFLOW
:
3168 subcode
= MULT_EXPR
;
3174 if (subcode
!= ERROR_MARK
)
3176 tree arg0
= gimple_call_arg (stmt
, 0);
3177 tree arg1
= gimple_call_arg (stmt
, 1);
3178 tree type
= TREE_TYPE (arg0
);
3181 tree lhs
= gimple_call_lhs (stmt
);
3182 if (lhs
== NULL_TREE
)
3185 type
= TREE_TYPE (TREE_TYPE (lhs
));
3187 if (type
== NULL_TREE
)
3189 /* x = y + 0; x = y - 0; x = y * 0; */
3190 else if (integer_zerop (arg1
))
3191 result
= subcode
== MULT_EXPR
? integer_zero_node
: arg0
;
3192 /* x = 0 + y; x = 0 * y; */
3193 else if (subcode
!= MINUS_EXPR
&& integer_zerop (arg0
))
3194 result
= subcode
== MULT_EXPR
? integer_zero_node
: arg1
;
3196 else if (subcode
== MINUS_EXPR
&& operand_equal_p (arg0
, arg1
, 0))
3197 result
= integer_zero_node
;
3198 /* x = y * 1; x = 1 * y; */
3199 else if (subcode
== MULT_EXPR
&& integer_onep (arg1
))
3201 else if (subcode
== MULT_EXPR
&& integer_onep (arg0
))
3203 else if (TREE_CODE (arg0
) == INTEGER_CST
3204 && TREE_CODE (arg1
) == INTEGER_CST
)
3207 result
= int_const_binop (subcode
, fold_convert (type
, arg0
),
3208 fold_convert (type
, arg1
));
3210 result
= int_const_binop (subcode
, arg0
, arg1
);
3211 if (result
&& arith_overflowed_p (subcode
, type
, arg0
, arg1
))
3214 overflow
= build_one_cst (type
);
3221 if (result
== integer_zero_node
)
3222 result
= build_zero_cst (type
);
3223 else if (cplx_result
&& TREE_TYPE (result
) != type
)
3225 if (TREE_CODE (result
) == INTEGER_CST
)
3227 if (arith_overflowed_p (PLUS_EXPR
, type
, result
,
3229 overflow
= build_one_cst (type
);
3231 else if ((!TYPE_UNSIGNED (TREE_TYPE (result
))
3232 && TYPE_UNSIGNED (type
))
3233 || (TYPE_PRECISION (type
)
3234 < (TYPE_PRECISION (TREE_TYPE (result
))
3235 + (TYPE_UNSIGNED (TREE_TYPE (result
))
3236 && !TYPE_UNSIGNED (type
)))))
3239 result
= fold_convert (type
, result
);
3246 if (TREE_CODE (result
) == INTEGER_CST
&& TREE_OVERFLOW (result
))
3247 result
= drop_tree_overflow (result
);
3250 if (overflow
== NULL_TREE
)
3251 overflow
= build_zero_cst (TREE_TYPE (result
));
3252 tree ctype
= build_complex_type (TREE_TYPE (result
));
3253 if (TREE_CODE (result
) == INTEGER_CST
3254 && TREE_CODE (overflow
) == INTEGER_CST
)
3255 result
= build_complex (ctype
, result
, overflow
);
3257 result
= build2_loc (gimple_location (stmt
), COMPLEX_EXPR
,
3258 ctype
, result
, overflow
);
3260 if (!update_call_from_tree (gsi
, result
))
3261 gimplify_and_update_call_from_tree (gsi
, result
);
3270 /* Return true whether NAME has a use on STMT. */
3273 has_use_on_stmt (tree name
, gimple
*stmt
)
3275 imm_use_iterator iter
;
3276 use_operand_p use_p
;
3277 FOR_EACH_IMM_USE_FAST (use_p
, iter
, name
)
3278 if (USE_STMT (use_p
) == stmt
)
3283 /* Worker for fold_stmt_1 dispatch to pattern based folding with
3286 Replaces *GSI with the simplification result in RCODE and OPS
3287 and the associated statements in *SEQ. Does the replacement
3288 according to INPLACE and returns true if the operation succeeded. */
3291 replace_stmt_with_simplification (gimple_stmt_iterator
*gsi
,
3292 code_helper rcode
, tree
*ops
,
3293 gimple_seq
*seq
, bool inplace
)
3295 gimple
*stmt
= gsi_stmt (*gsi
);
3297 /* Play safe and do not allow abnormals to be mentioned in
3298 newly created statements. See also maybe_push_res_to_seq.
3299 As an exception allow such uses if there was a use of the
3300 same SSA name on the old stmt. */
3301 if ((TREE_CODE (ops
[0]) == SSA_NAME
3302 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops
[0])
3303 && !has_use_on_stmt (ops
[0], stmt
))
3305 && TREE_CODE (ops
[1]) == SSA_NAME
3306 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops
[1])
3307 && !has_use_on_stmt (ops
[1], stmt
))
3309 && TREE_CODE (ops
[2]) == SSA_NAME
3310 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops
[2])
3311 && !has_use_on_stmt (ops
[2], stmt
)))
3314 /* Don't insert new statements when INPLACE is true, even if we could
3315 reuse STMT for the final statement. */
3316 if (inplace
&& !gimple_seq_empty_p (*seq
))
3319 if (gcond
*cond_stmt
= dyn_cast
<gcond
*> (stmt
))
3321 gcc_assert (rcode
.is_tree_code ());
3322 if (TREE_CODE_CLASS ((enum tree_code
)rcode
) == tcc_comparison
3323 /* GIMPLE_CONDs condition may not throw. */
3324 && (!flag_exceptions
3325 || !cfun
->can_throw_non_call_exceptions
3326 || !operation_could_trap_p (rcode
,
3327 FLOAT_TYPE_P (TREE_TYPE (ops
[0])),
3329 gimple_cond_set_condition (cond_stmt
, rcode
, ops
[0], ops
[1]);
3330 else if (rcode
== SSA_NAME
)
3331 gimple_cond_set_condition (cond_stmt
, NE_EXPR
, ops
[0],
3332 build_zero_cst (TREE_TYPE (ops
[0])));
3333 else if (rcode
== INTEGER_CST
)
3335 if (integer_zerop (ops
[0]))
3336 gimple_cond_make_false (cond_stmt
);
3338 gimple_cond_make_true (cond_stmt
);
3342 tree res
= maybe_push_res_to_seq (rcode
, boolean_type_node
,
3346 gimple_cond_set_condition (cond_stmt
, NE_EXPR
, res
,
3347 build_zero_cst (TREE_TYPE (res
)));
3351 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3353 fprintf (dump_file
, "gimple_simplified to ");
3354 if (!gimple_seq_empty_p (*seq
))
3355 print_gimple_seq (dump_file
, *seq
, 0, TDF_SLIM
);
3356 print_gimple_stmt (dump_file
, gsi_stmt (*gsi
),
3359 gsi_insert_seq_before (gsi
, *seq
, GSI_SAME_STMT
);
3362 else if (is_gimple_assign (stmt
)
3363 && rcode
.is_tree_code ())
3366 || gimple_num_ops (stmt
) > get_gimple_rhs_num_ops (rcode
))
3368 maybe_build_generic_op (rcode
,
3369 TREE_TYPE (gimple_assign_lhs (stmt
)),
3370 &ops
[0], ops
[1], ops
[2]);
3371 gimple_assign_set_rhs_with_ops (gsi
, rcode
, ops
[0], ops
[1], ops
[2]);
3372 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3374 fprintf (dump_file
, "gimple_simplified to ");
3375 if (!gimple_seq_empty_p (*seq
))
3376 print_gimple_seq (dump_file
, *seq
, 0, TDF_SLIM
);
3377 print_gimple_stmt (dump_file
, gsi_stmt (*gsi
),
3380 gsi_insert_seq_before (gsi
, *seq
, GSI_SAME_STMT
);
3384 else if (rcode
.is_fn_code ()
3385 && gimple_call_combined_fn (stmt
) == rcode
)
3388 for (i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
3390 gcc_assert (ops
[i
] != NULL_TREE
);
3391 gimple_call_set_arg (stmt
, i
, ops
[i
]);
3394 gcc_assert (ops
[i
] == NULL_TREE
);
3395 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3397 fprintf (dump_file
, "gimple_simplified to ");
3398 if (!gimple_seq_empty_p (*seq
))
3399 print_gimple_seq (dump_file
, *seq
, 0, TDF_SLIM
);
3400 print_gimple_stmt (dump_file
, gsi_stmt (*gsi
), 0, TDF_SLIM
);
3402 gsi_insert_seq_before (gsi
, *seq
, GSI_SAME_STMT
);
3407 if (gimple_has_lhs (stmt
))
3409 tree lhs
= gimple_get_lhs (stmt
);
3410 if (!maybe_push_res_to_seq (rcode
, TREE_TYPE (lhs
),
3413 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3415 fprintf (dump_file
, "gimple_simplified to ");
3416 print_gimple_seq (dump_file
, *seq
, 0, TDF_SLIM
);
3418 gsi_replace_with_seq_vops (gsi
, *seq
);
3428 /* Canonicalize MEM_REFs invariant address operand after propagation. */
3431 maybe_canonicalize_mem_ref_addr (tree
*t
)
3435 if (TREE_CODE (*t
) == ADDR_EXPR
)
3436 t
= &TREE_OPERAND (*t
, 0);
3438 while (handled_component_p (*t
))
3439 t
= &TREE_OPERAND (*t
, 0);
3441 /* Canonicalize MEM [&foo.bar, 0] which appears after propagating
3442 of invariant addresses into a SSA name MEM_REF address. */
3443 if (TREE_CODE (*t
) == MEM_REF
3444 || TREE_CODE (*t
) == TARGET_MEM_REF
)
3446 tree addr
= TREE_OPERAND (*t
, 0);
3447 if (TREE_CODE (addr
) == ADDR_EXPR
3448 && (TREE_CODE (TREE_OPERAND (addr
, 0)) == MEM_REF
3449 || handled_component_p (TREE_OPERAND (addr
, 0))))
3452 HOST_WIDE_INT coffset
;
3453 base
= get_addr_base_and_unit_offset (TREE_OPERAND (addr
, 0),
3458 TREE_OPERAND (*t
, 0) = build_fold_addr_expr (base
);
3459 TREE_OPERAND (*t
, 1) = int_const_binop (PLUS_EXPR
,
3460 TREE_OPERAND (*t
, 1),
3461 size_int (coffset
));
3464 gcc_checking_assert (TREE_CODE (TREE_OPERAND (*t
, 0)) == DEBUG_EXPR_DECL
3465 || is_gimple_mem_ref_addr (TREE_OPERAND (*t
, 0)));
3468 /* Canonicalize back MEM_REFs to plain reference trees if the object
3469 accessed is a decl that has the same access semantics as the MEM_REF. */
3470 if (TREE_CODE (*t
) == MEM_REF
3471 && TREE_CODE (TREE_OPERAND (*t
, 0)) == ADDR_EXPR
3472 && integer_zerop (TREE_OPERAND (*t
, 1))
3473 && MR_DEPENDENCE_CLIQUE (*t
) == 0)
3475 tree decl
= TREE_OPERAND (TREE_OPERAND (*t
, 0), 0);
3476 tree alias_type
= TREE_TYPE (TREE_OPERAND (*t
, 1));
3477 if (/* Same volatile qualification. */
3478 TREE_THIS_VOLATILE (*t
) == TREE_THIS_VOLATILE (decl
)
3479 /* Same TBAA behavior with -fstrict-aliasing. */
3480 && !TYPE_REF_CAN_ALIAS_ALL (alias_type
)
3481 && (TYPE_MAIN_VARIANT (TREE_TYPE (decl
))
3482 == TYPE_MAIN_VARIANT (TREE_TYPE (alias_type
)))
3483 /* Same alignment. */
3484 && TYPE_ALIGN (TREE_TYPE (decl
)) == TYPE_ALIGN (TREE_TYPE (*t
))
3485 /* We have to look out here to not drop a required conversion
3486 from the rhs to the lhs if *t appears on the lhs or vice-versa
3487 if it appears on the rhs. Thus require strict type
3489 && types_compatible_p (TREE_TYPE (*t
), TREE_TYPE (decl
)))
3491 *t
= TREE_OPERAND (TREE_OPERAND (*t
, 0), 0);
3496 /* Canonicalize TARGET_MEM_REF in particular with respect to
3497 the indexes becoming constant. */
3498 else if (TREE_CODE (*t
) == TARGET_MEM_REF
)
3500 tree tem
= maybe_fold_tmr (*t
);
3511 /* Worker for both fold_stmt and fold_stmt_inplace. The INPLACE argument
3512 distinguishes both cases. */
3515 fold_stmt_1 (gimple_stmt_iterator
*gsi
, bool inplace
, tree (*valueize
) (tree
))
3517 bool changed
= false;
3518 gimple
*stmt
= gsi_stmt (*gsi
);
3521 /* First do required canonicalization of [TARGET_]MEM_REF addresses
3523 ??? This shouldn't be done in generic folding but in the
3524 propagation helpers which also know whether an address was
3526 Also canonicalize operand order. */
3527 switch (gimple_code (stmt
))
3530 if (gimple_assign_rhs_class (stmt
) == GIMPLE_SINGLE_RHS
)
3532 tree
*rhs
= gimple_assign_rhs1_ptr (stmt
);
3533 if ((REFERENCE_CLASS_P (*rhs
)
3534 || TREE_CODE (*rhs
) == ADDR_EXPR
)
3535 && maybe_canonicalize_mem_ref_addr (rhs
))
3537 tree
*lhs
= gimple_assign_lhs_ptr (stmt
);
3538 if (REFERENCE_CLASS_P (*lhs
)
3539 && maybe_canonicalize_mem_ref_addr (lhs
))
3544 /* Canonicalize operand order. */
3545 enum tree_code code
= gimple_assign_rhs_code (stmt
);
3546 if (TREE_CODE_CLASS (code
) == tcc_comparison
3547 || commutative_tree_code (code
)
3548 || commutative_ternary_tree_code (code
))
3550 tree rhs1
= gimple_assign_rhs1 (stmt
);
3551 tree rhs2
= gimple_assign_rhs2 (stmt
);
3552 if (tree_swap_operands_p (rhs1
, rhs2
, false))
3554 gimple_assign_set_rhs1 (stmt
, rhs2
);
3555 gimple_assign_set_rhs2 (stmt
, rhs1
);
3556 if (TREE_CODE_CLASS (code
) == tcc_comparison
)
3557 gimple_assign_set_rhs_code (stmt
,
3558 swap_tree_comparison (code
));
3566 for (i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
3568 tree
*arg
= gimple_call_arg_ptr (stmt
, i
);
3569 if (REFERENCE_CLASS_P (*arg
)
3570 && maybe_canonicalize_mem_ref_addr (arg
))
3573 tree
*lhs
= gimple_call_lhs_ptr (stmt
);
3575 && REFERENCE_CLASS_P (*lhs
)
3576 && maybe_canonicalize_mem_ref_addr (lhs
))
3582 gasm
*asm_stmt
= as_a
<gasm
*> (stmt
);
3583 for (i
= 0; i
< gimple_asm_noutputs (asm_stmt
); ++i
)
3585 tree link
= gimple_asm_output_op (asm_stmt
, i
);
3586 tree op
= TREE_VALUE (link
);
3587 if (REFERENCE_CLASS_P (op
)
3588 && maybe_canonicalize_mem_ref_addr (&TREE_VALUE (link
)))
3591 for (i
= 0; i
< gimple_asm_ninputs (asm_stmt
); ++i
)
3593 tree link
= gimple_asm_input_op (asm_stmt
, i
);
3594 tree op
= TREE_VALUE (link
);
3595 if ((REFERENCE_CLASS_P (op
)
3596 || TREE_CODE (op
) == ADDR_EXPR
)
3597 && maybe_canonicalize_mem_ref_addr (&TREE_VALUE (link
)))
3603 if (gimple_debug_bind_p (stmt
))
3605 tree
*val
= gimple_debug_bind_get_value_ptr (stmt
);
3607 && (REFERENCE_CLASS_P (*val
)
3608 || TREE_CODE (*val
) == ADDR_EXPR
)
3609 && maybe_canonicalize_mem_ref_addr (val
))
3615 /* Canonicalize operand order. */
3616 tree lhs
= gimple_cond_lhs (stmt
);
3617 tree rhs
= gimple_cond_rhs (stmt
);
3618 if (tree_swap_operands_p (lhs
, rhs
, false))
3620 gcond
*gc
= as_a
<gcond
*> (stmt
);
3621 gimple_cond_set_lhs (gc
, rhs
);
3622 gimple_cond_set_rhs (gc
, lhs
);
3623 gimple_cond_set_code (gc
,
3624 swap_tree_comparison (gimple_cond_code (gc
)));
3631 /* Dispatch to pattern-based folding. */
3633 || is_gimple_assign (stmt
)
3634 || gimple_code (stmt
) == GIMPLE_COND
)
3636 gimple_seq seq
= NULL
;
3639 if (gimple_simplify (stmt
, &rcode
, ops
, inplace
? NULL
: &seq
,
3640 valueize
, valueize
))
3642 if (replace_stmt_with_simplification (gsi
, rcode
, ops
, &seq
, inplace
))
3645 gimple_seq_discard (seq
);
3649 stmt
= gsi_stmt (*gsi
);
3651 /* Fold the main computation performed by the statement. */
3652 switch (gimple_code (stmt
))
3656 /* Try to canonicalize for boolean-typed X the comparisons
3657 X == 0, X == 1, X != 0, and X != 1. */
3658 if (gimple_assign_rhs_code (stmt
) == EQ_EXPR
3659 || gimple_assign_rhs_code (stmt
) == NE_EXPR
)
3661 tree lhs
= gimple_assign_lhs (stmt
);
3662 tree op1
= gimple_assign_rhs1 (stmt
);
3663 tree op2
= gimple_assign_rhs2 (stmt
);
3664 tree type
= TREE_TYPE (op1
);
3666 /* Check whether the comparison operands are of the same boolean
3667 type as the result type is.
3668 Check that second operand is an integer-constant with value
3670 if (TREE_CODE (op2
) == INTEGER_CST
3671 && (integer_zerop (op2
) || integer_onep (op2
))
3672 && useless_type_conversion_p (TREE_TYPE (lhs
), type
))
3674 enum tree_code cmp_code
= gimple_assign_rhs_code (stmt
);
3675 bool is_logical_not
= false;
3677 /* X == 0 and X != 1 is a logical-not.of X
3678 X == 1 and X != 0 is X */
3679 if ((cmp_code
== EQ_EXPR
&& integer_zerop (op2
))
3680 || (cmp_code
== NE_EXPR
&& integer_onep (op2
)))
3681 is_logical_not
= true;
3683 if (is_logical_not
== false)
3684 gimple_assign_set_rhs_with_ops (gsi
, TREE_CODE (op1
), op1
);
3685 /* Only for one-bit precision typed X the transformation
3686 !X -> ~X is valied. */
3687 else if (TYPE_PRECISION (type
) == 1)
3688 gimple_assign_set_rhs_with_ops (gsi
, BIT_NOT_EXPR
, op1
);
3689 /* Otherwise we use !X -> X ^ 1. */
3691 gimple_assign_set_rhs_with_ops (gsi
, BIT_XOR_EXPR
, op1
,
3692 build_int_cst (type
, 1));
3698 unsigned old_num_ops
= gimple_num_ops (stmt
);
3699 tree lhs
= gimple_assign_lhs (stmt
);
3700 tree new_rhs
= fold_gimple_assign (gsi
);
3702 && !useless_type_conversion_p (TREE_TYPE (lhs
),
3703 TREE_TYPE (new_rhs
)))
3704 new_rhs
= fold_convert (TREE_TYPE (lhs
), new_rhs
);
3707 || get_gimple_rhs_num_ops (TREE_CODE (new_rhs
)) < old_num_ops
))
3709 gimple_assign_set_rhs_from_tree (gsi
, new_rhs
);
3716 changed
|= gimple_fold_call (gsi
, inplace
);
3720 /* Fold *& in asm operands. */
3722 gasm
*asm_stmt
= as_a
<gasm
*> (stmt
);
3724 const char **oconstraints
;
3725 const char *constraint
;
3726 bool allows_mem
, allows_reg
;
3728 noutputs
= gimple_asm_noutputs (asm_stmt
);
3729 oconstraints
= XALLOCAVEC (const char *, noutputs
);
3731 for (i
= 0; i
< gimple_asm_noutputs (asm_stmt
); ++i
)
3733 tree link
= gimple_asm_output_op (asm_stmt
, i
);
3734 tree op
= TREE_VALUE (link
);
3736 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link
)));
3737 if (REFERENCE_CLASS_P (op
)
3738 && (op
= maybe_fold_reference (op
, true)) != NULL_TREE
)
3740 TREE_VALUE (link
) = op
;
3744 for (i
= 0; i
< gimple_asm_ninputs (asm_stmt
); ++i
)
3746 tree link
= gimple_asm_input_op (asm_stmt
, i
);
3747 tree op
= TREE_VALUE (link
);
3749 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link
)));
3750 parse_input_constraint (&constraint
, 0, 0, noutputs
, 0,
3751 oconstraints
, &allows_mem
, &allows_reg
);
3752 if (REFERENCE_CLASS_P (op
)
3753 && (op
= maybe_fold_reference (op
, !allows_reg
&& allows_mem
))
3756 TREE_VALUE (link
) = op
;
3764 if (gimple_debug_bind_p (stmt
))
3766 tree val
= gimple_debug_bind_get_value (stmt
);
3768 && REFERENCE_CLASS_P (val
))
3770 tree tem
= maybe_fold_reference (val
, false);
3773 gimple_debug_bind_set_value (stmt
, tem
);
3778 && TREE_CODE (val
) == ADDR_EXPR
)
3780 tree ref
= TREE_OPERAND (val
, 0);
3781 tree tem
= maybe_fold_reference (ref
, false);
3784 tem
= build_fold_addr_expr_with_type (tem
, TREE_TYPE (val
));
3785 gimple_debug_bind_set_value (stmt
, tem
);
3795 stmt
= gsi_stmt (*gsi
);
3797 /* Fold *& on the lhs. */
3798 if (gimple_has_lhs (stmt
))
3800 tree lhs
= gimple_get_lhs (stmt
);
3801 if (lhs
&& REFERENCE_CLASS_P (lhs
))
3803 tree new_lhs
= maybe_fold_reference (lhs
, true);
3806 gimple_set_lhs (stmt
, new_lhs
);
3815 /* Valueziation callback that ends up not following SSA edges. */
3818 no_follow_ssa_edges (tree
)
3823 /* Valueization callback that ends up following single-use SSA edges only. */
3826 follow_single_use_edges (tree val
)
3828 if (TREE_CODE (val
) == SSA_NAME
3829 && !has_single_use (val
))
3834 /* Fold the statement pointed to by GSI. In some cases, this function may
3835 replace the whole statement with a new one. Returns true iff folding
3837 The statement pointed to by GSI should be in valid gimple form but may
3838 be in unfolded state as resulting from for example constant propagation
3839 which can produce *&x = 0. */
3842 fold_stmt (gimple_stmt_iterator
*gsi
)
3844 return fold_stmt_1 (gsi
, false, no_follow_ssa_edges
);
3848 fold_stmt (gimple_stmt_iterator
*gsi
, tree (*valueize
) (tree
))
3850 return fold_stmt_1 (gsi
, false, valueize
);
3853 /* Perform the minimal folding on statement *GSI. Only operations like
3854 *&x created by constant propagation are handled. The statement cannot
3855 be replaced with a new one. Return true if the statement was
3856 changed, false otherwise.
3857 The statement *GSI should be in valid gimple form but may
3858 be in unfolded state as resulting from for example constant propagation
3859 which can produce *&x = 0. */
3862 fold_stmt_inplace (gimple_stmt_iterator
*gsi
)
3864 gimple
*stmt
= gsi_stmt (*gsi
);
3865 bool changed
= fold_stmt_1 (gsi
, true, no_follow_ssa_edges
);
3866 gcc_assert (gsi_stmt (*gsi
) == stmt
);
3870 /* Canonicalize and possibly invert the boolean EXPR; return NULL_TREE
3871 if EXPR is null or we don't know how.
3872 If non-null, the result always has boolean type. */
3875 canonicalize_bool (tree expr
, bool invert
)
3881 if (integer_nonzerop (expr
))
3882 return boolean_false_node
;
3883 else if (integer_zerop (expr
))
3884 return boolean_true_node
;
3885 else if (TREE_CODE (expr
) == SSA_NAME
)
3886 return fold_build2 (EQ_EXPR
, boolean_type_node
, expr
,
3887 build_int_cst (TREE_TYPE (expr
), 0));
3888 else if (COMPARISON_CLASS_P (expr
))
3889 return fold_build2 (invert_tree_comparison (TREE_CODE (expr
), false),
3891 TREE_OPERAND (expr
, 0),
3892 TREE_OPERAND (expr
, 1));
3898 if (TREE_CODE (TREE_TYPE (expr
)) == BOOLEAN_TYPE
)
3900 if (integer_nonzerop (expr
))
3901 return boolean_true_node
;
3902 else if (integer_zerop (expr
))
3903 return boolean_false_node
;
3904 else if (TREE_CODE (expr
) == SSA_NAME
)
3905 return fold_build2 (NE_EXPR
, boolean_type_node
, expr
,
3906 build_int_cst (TREE_TYPE (expr
), 0));
3907 else if (COMPARISON_CLASS_P (expr
))
3908 return fold_build2 (TREE_CODE (expr
),
3910 TREE_OPERAND (expr
, 0),
3911 TREE_OPERAND (expr
, 1));
3917 /* Check to see if a boolean expression EXPR is logically equivalent to the
3918 comparison (OP1 CODE OP2). Check for various identities involving
3922 same_bool_comparison_p (const_tree expr
, enum tree_code code
,
3923 const_tree op1
, const_tree op2
)
3927 /* The obvious case. */
3928 if (TREE_CODE (expr
) == code
3929 && operand_equal_p (TREE_OPERAND (expr
, 0), op1
, 0)
3930 && operand_equal_p (TREE_OPERAND (expr
, 1), op2
, 0))
3933 /* Check for comparing (name, name != 0) and the case where expr
3934 is an SSA_NAME with a definition matching the comparison. */
3935 if (TREE_CODE (expr
) == SSA_NAME
3936 && TREE_CODE (TREE_TYPE (expr
)) == BOOLEAN_TYPE
)
3938 if (operand_equal_p (expr
, op1
, 0))
3939 return ((code
== NE_EXPR
&& integer_zerop (op2
))
3940 || (code
== EQ_EXPR
&& integer_nonzerop (op2
)));
3941 s
= SSA_NAME_DEF_STMT (expr
);
3942 if (is_gimple_assign (s
)
3943 && gimple_assign_rhs_code (s
) == code
3944 && operand_equal_p (gimple_assign_rhs1 (s
), op1
, 0)
3945 && operand_equal_p (gimple_assign_rhs2 (s
), op2
, 0))
3949 /* If op1 is of the form (name != 0) or (name == 0), and the definition
3950 of name is a comparison, recurse. */
3951 if (TREE_CODE (op1
) == SSA_NAME
3952 && TREE_CODE (TREE_TYPE (op1
)) == BOOLEAN_TYPE
)
3954 s
= SSA_NAME_DEF_STMT (op1
);
3955 if (is_gimple_assign (s
)
3956 && TREE_CODE_CLASS (gimple_assign_rhs_code (s
)) == tcc_comparison
)
3958 enum tree_code c
= gimple_assign_rhs_code (s
);
3959 if ((c
== NE_EXPR
&& integer_zerop (op2
))
3960 || (c
== EQ_EXPR
&& integer_nonzerop (op2
)))
3961 return same_bool_comparison_p (expr
, c
,
3962 gimple_assign_rhs1 (s
),
3963 gimple_assign_rhs2 (s
));
3964 if ((c
== EQ_EXPR
&& integer_zerop (op2
))
3965 || (c
== NE_EXPR
&& integer_nonzerop (op2
)))
3966 return same_bool_comparison_p (expr
,
3967 invert_tree_comparison (c
, false),
3968 gimple_assign_rhs1 (s
),
3969 gimple_assign_rhs2 (s
));
3975 /* Check to see if two boolean expressions OP1 and OP2 are logically
3979 same_bool_result_p (const_tree op1
, const_tree op2
)
3981 /* Simple cases first. */
3982 if (operand_equal_p (op1
, op2
, 0))
3985 /* Check the cases where at least one of the operands is a comparison.
3986 These are a bit smarter than operand_equal_p in that they apply some
3987 identifies on SSA_NAMEs. */
3988 if (COMPARISON_CLASS_P (op2
)
3989 && same_bool_comparison_p (op1
, TREE_CODE (op2
),
3990 TREE_OPERAND (op2
, 0),
3991 TREE_OPERAND (op2
, 1)))
3993 if (COMPARISON_CLASS_P (op1
)
3994 && same_bool_comparison_p (op2
, TREE_CODE (op1
),
3995 TREE_OPERAND (op1
, 0),
3996 TREE_OPERAND (op1
, 1)))
4003 /* Forward declarations for some mutually recursive functions. */
4006 and_comparisons_1 (enum tree_code code1
, tree op1a
, tree op1b
,
4007 enum tree_code code2
, tree op2a
, tree op2b
);
4009 and_var_with_comparison (tree var
, bool invert
,
4010 enum tree_code code2
, tree op2a
, tree op2b
);
4012 and_var_with_comparison_1 (gimple
*stmt
,
4013 enum tree_code code2
, tree op2a
, tree op2b
);
4015 or_comparisons_1 (enum tree_code code1
, tree op1a
, tree op1b
,
4016 enum tree_code code2
, tree op2a
, tree op2b
);
4018 or_var_with_comparison (tree var
, bool invert
,
4019 enum tree_code code2
, tree op2a
, tree op2b
);
4021 or_var_with_comparison_1 (gimple
*stmt
,
4022 enum tree_code code2
, tree op2a
, tree op2b
);
4024 /* Helper function for and_comparisons_1: try to simplify the AND of the
4025 ssa variable VAR with the comparison specified by (OP2A CODE2 OP2B).
4026 If INVERT is true, invert the value of the VAR before doing the AND.
4027 Return NULL_EXPR if we can't simplify this to a single expression. */
4030 and_var_with_comparison (tree var
, bool invert
,
4031 enum tree_code code2
, tree op2a
, tree op2b
)
4034 gimple
*stmt
= SSA_NAME_DEF_STMT (var
);
4036 /* We can only deal with variables whose definitions are assignments. */
4037 if (!is_gimple_assign (stmt
))
4040 /* If we have an inverted comparison, apply DeMorgan's law and rewrite
4041 !var AND (op2a code2 op2b) => !(var OR !(op2a code2 op2b))
4042 Then we only have to consider the simpler non-inverted cases. */
4044 t
= or_var_with_comparison_1 (stmt
,
4045 invert_tree_comparison (code2
, false),
4048 t
= and_var_with_comparison_1 (stmt
, code2
, op2a
, op2b
);
4049 return canonicalize_bool (t
, invert
);
4052 /* Try to simplify the AND of the ssa variable defined by the assignment
4053 STMT with the comparison specified by (OP2A CODE2 OP2B).
4054 Return NULL_EXPR if we can't simplify this to a single expression. */
4057 and_var_with_comparison_1 (gimple
*stmt
,
4058 enum tree_code code2
, tree op2a
, tree op2b
)
4060 tree var
= gimple_assign_lhs (stmt
);
4061 tree true_test_var
= NULL_TREE
;
4062 tree false_test_var
= NULL_TREE
;
4063 enum tree_code innercode
= gimple_assign_rhs_code (stmt
);
4065 /* Check for identities like (var AND (var == 0)) => false. */
4066 if (TREE_CODE (op2a
) == SSA_NAME
4067 && TREE_CODE (TREE_TYPE (var
)) == BOOLEAN_TYPE
)
4069 if ((code2
== NE_EXPR
&& integer_zerop (op2b
))
4070 || (code2
== EQ_EXPR
&& integer_nonzerop (op2b
)))
4072 true_test_var
= op2a
;
4073 if (var
== true_test_var
)
4076 else if ((code2
== EQ_EXPR
&& integer_zerop (op2b
))
4077 || (code2
== NE_EXPR
&& integer_nonzerop (op2b
)))
4079 false_test_var
= op2a
;
4080 if (var
== false_test_var
)
4081 return boolean_false_node
;
4085 /* If the definition is a comparison, recurse on it. */
4086 if (TREE_CODE_CLASS (innercode
) == tcc_comparison
)
4088 tree t
= and_comparisons_1 (innercode
,
4089 gimple_assign_rhs1 (stmt
),
4090 gimple_assign_rhs2 (stmt
),
4098 /* If the definition is an AND or OR expression, we may be able to
4099 simplify by reassociating. */
4100 if (TREE_CODE (TREE_TYPE (var
)) == BOOLEAN_TYPE
4101 && (innercode
== BIT_AND_EXPR
|| innercode
== BIT_IOR_EXPR
))
4103 tree inner1
= gimple_assign_rhs1 (stmt
);
4104 tree inner2
= gimple_assign_rhs2 (stmt
);
4107 tree partial
= NULL_TREE
;
4108 bool is_and
= (innercode
== BIT_AND_EXPR
);
4110 /* Check for boolean identities that don't require recursive examination
4112 inner1 AND (inner1 AND inner2) => inner1 AND inner2 => var
4113 inner1 AND (inner1 OR inner2) => inner1
4114 !inner1 AND (inner1 AND inner2) => false
4115 !inner1 AND (inner1 OR inner2) => !inner1 AND inner2
4116 Likewise for similar cases involving inner2. */
4117 if (inner1
== true_test_var
)
4118 return (is_and
? var
: inner1
);
4119 else if (inner2
== true_test_var
)
4120 return (is_and
? var
: inner2
);
4121 else if (inner1
== false_test_var
)
4123 ? boolean_false_node
4124 : and_var_with_comparison (inner2
, false, code2
, op2a
, op2b
));
4125 else if (inner2
== false_test_var
)
4127 ? boolean_false_node
4128 : and_var_with_comparison (inner1
, false, code2
, op2a
, op2b
));
4130 /* Next, redistribute/reassociate the AND across the inner tests.
4131 Compute the first partial result, (inner1 AND (op2a code op2b)) */
4132 if (TREE_CODE (inner1
) == SSA_NAME
4133 && is_gimple_assign (s
= SSA_NAME_DEF_STMT (inner1
))
4134 && TREE_CODE_CLASS (gimple_assign_rhs_code (s
)) == tcc_comparison
4135 && (t
= maybe_fold_and_comparisons (gimple_assign_rhs_code (s
),
4136 gimple_assign_rhs1 (s
),
4137 gimple_assign_rhs2 (s
),
4138 code2
, op2a
, op2b
)))
4140 /* Handle the AND case, where we are reassociating:
4141 (inner1 AND inner2) AND (op2a code2 op2b)
4143 If the partial result t is a constant, we win. Otherwise
4144 continue on to try reassociating with the other inner test. */
4147 if (integer_onep (t
))
4149 else if (integer_zerop (t
))
4150 return boolean_false_node
;
4153 /* Handle the OR case, where we are redistributing:
4154 (inner1 OR inner2) AND (op2a code2 op2b)
4155 => (t OR (inner2 AND (op2a code2 op2b))) */
4156 else if (integer_onep (t
))
4157 return boolean_true_node
;
4159 /* Save partial result for later. */
4163 /* Compute the second partial result, (inner2 AND (op2a code op2b)) */
4164 if (TREE_CODE (inner2
) == SSA_NAME
4165 && is_gimple_assign (s
= SSA_NAME_DEF_STMT (inner2
))
4166 && TREE_CODE_CLASS (gimple_assign_rhs_code (s
)) == tcc_comparison
4167 && (t
= maybe_fold_and_comparisons (gimple_assign_rhs_code (s
),
4168 gimple_assign_rhs1 (s
),
4169 gimple_assign_rhs2 (s
),
4170 code2
, op2a
, op2b
)))
4172 /* Handle the AND case, where we are reassociating:
4173 (inner1 AND inner2) AND (op2a code2 op2b)
4174 => (inner1 AND t) */
4177 if (integer_onep (t
))
4179 else if (integer_zerop (t
))
4180 return boolean_false_node
;
4181 /* If both are the same, we can apply the identity
4183 else if (partial
&& same_bool_result_p (t
, partial
))
4187 /* Handle the OR case. where we are redistributing:
4188 (inner1 OR inner2) AND (op2a code2 op2b)
4189 => (t OR (inner1 AND (op2a code2 op2b)))
4190 => (t OR partial) */
4193 if (integer_onep (t
))
4194 return boolean_true_node
;
4197 /* We already got a simplification for the other
4198 operand to the redistributed OR expression. The
4199 interesting case is when at least one is false.
4200 Or, if both are the same, we can apply the identity
4202 if (integer_zerop (partial
))
4204 else if (integer_zerop (t
))
4206 else if (same_bool_result_p (t
, partial
))
4215 /* Try to simplify the AND of two comparisons defined by
4216 (OP1A CODE1 OP1B) and (OP2A CODE2 OP2B), respectively.
4217 If this can be done without constructing an intermediate value,
4218 return the resulting tree; otherwise NULL_TREE is returned.
4219 This function is deliberately asymmetric as it recurses on SSA_DEFs
4220 in the first comparison but not the second. */
4223 and_comparisons_1 (enum tree_code code1
, tree op1a
, tree op1b
,
4224 enum tree_code code2
, tree op2a
, tree op2b
)
4226 tree truth_type
= truth_type_for (TREE_TYPE (op1a
));
4228 /* First check for ((x CODE1 y) AND (x CODE2 y)). */
4229 if (operand_equal_p (op1a
, op2a
, 0)
4230 && operand_equal_p (op1b
, op2b
, 0))
4232 /* Result will be either NULL_TREE, or a combined comparison. */
4233 tree t
= combine_comparisons (UNKNOWN_LOCATION
,
4234 TRUTH_ANDIF_EXPR
, code1
, code2
,
4235 truth_type
, op1a
, op1b
);
4240 /* Likewise the swapped case of the above. */
4241 if (operand_equal_p (op1a
, op2b
, 0)
4242 && operand_equal_p (op1b
, op2a
, 0))
4244 /* Result will be either NULL_TREE, or a combined comparison. */
4245 tree t
= combine_comparisons (UNKNOWN_LOCATION
,
4246 TRUTH_ANDIF_EXPR
, code1
,
4247 swap_tree_comparison (code2
),
4248 truth_type
, op1a
, op1b
);
4253 /* If both comparisons are of the same value against constants, we might
4254 be able to merge them. */
4255 if (operand_equal_p (op1a
, op2a
, 0)
4256 && TREE_CODE (op1b
) == INTEGER_CST
4257 && TREE_CODE (op2b
) == INTEGER_CST
)
4259 int cmp
= tree_int_cst_compare (op1b
, op2b
);
4261 /* If we have (op1a == op1b), we should either be able to
4262 return that or FALSE, depending on whether the constant op1b
4263 also satisfies the other comparison against op2b. */
4264 if (code1
== EQ_EXPR
)
4270 case EQ_EXPR
: val
= (cmp
== 0); break;
4271 case NE_EXPR
: val
= (cmp
!= 0); break;
4272 case LT_EXPR
: val
= (cmp
< 0); break;
4273 case GT_EXPR
: val
= (cmp
> 0); break;
4274 case LE_EXPR
: val
= (cmp
<= 0); break;
4275 case GE_EXPR
: val
= (cmp
>= 0); break;
4276 default: done
= false;
4281 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
4283 return boolean_false_node
;
4286 /* Likewise if the second comparison is an == comparison. */
4287 else if (code2
== EQ_EXPR
)
4293 case EQ_EXPR
: val
= (cmp
== 0); break;
4294 case NE_EXPR
: val
= (cmp
!= 0); break;
4295 case LT_EXPR
: val
= (cmp
> 0); break;
4296 case GT_EXPR
: val
= (cmp
< 0); break;
4297 case LE_EXPR
: val
= (cmp
>= 0); break;
4298 case GE_EXPR
: val
= (cmp
<= 0); break;
4299 default: done
= false;
4304 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
4306 return boolean_false_node
;
4310 /* Same business with inequality tests. */
4311 else if (code1
== NE_EXPR
)
4316 case EQ_EXPR
: val
= (cmp
!= 0); break;
4317 case NE_EXPR
: val
= (cmp
== 0); break;
4318 case LT_EXPR
: val
= (cmp
>= 0); break;
4319 case GT_EXPR
: val
= (cmp
<= 0); break;
4320 case LE_EXPR
: val
= (cmp
> 0); break;
4321 case GE_EXPR
: val
= (cmp
< 0); break;
4326 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
4328 else if (code2
== NE_EXPR
)
4333 case EQ_EXPR
: val
= (cmp
== 0); break;
4334 case NE_EXPR
: val
= (cmp
!= 0); break;
4335 case LT_EXPR
: val
= (cmp
<= 0); break;
4336 case GT_EXPR
: val
= (cmp
>= 0); break;
4337 case LE_EXPR
: val
= (cmp
< 0); break;
4338 case GE_EXPR
: val
= (cmp
> 0); break;
4343 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
4346 /* Chose the more restrictive of two < or <= comparisons. */
4347 else if ((code1
== LT_EXPR
|| code1
== LE_EXPR
)
4348 && (code2
== LT_EXPR
|| code2
== LE_EXPR
))
4350 if ((cmp
< 0) || (cmp
== 0 && code1
== LT_EXPR
))
4351 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
4353 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
4356 /* Likewise chose the more restrictive of two > or >= comparisons. */
4357 else if ((code1
== GT_EXPR
|| code1
== GE_EXPR
)
4358 && (code2
== GT_EXPR
|| code2
== GE_EXPR
))
4360 if ((cmp
> 0) || (cmp
== 0 && code1
== GT_EXPR
))
4361 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
4363 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
4366 /* Check for singleton ranges. */
4368 && ((code1
== LE_EXPR
&& code2
== GE_EXPR
)
4369 || (code1
== GE_EXPR
&& code2
== LE_EXPR
)))
4370 return fold_build2 (EQ_EXPR
, boolean_type_node
, op1a
, op2b
);
4372 /* Check for disjoint ranges. */
4374 && (code1
== LT_EXPR
|| code1
== LE_EXPR
)
4375 && (code2
== GT_EXPR
|| code2
== GE_EXPR
))
4376 return boolean_false_node
;
4378 && (code1
== GT_EXPR
|| code1
== GE_EXPR
)
4379 && (code2
== LT_EXPR
|| code2
== LE_EXPR
))
4380 return boolean_false_node
;
4383 /* Perhaps the first comparison is (NAME != 0) or (NAME == 1) where
4384 NAME's definition is a truth value. See if there are any simplifications
4385 that can be done against the NAME's definition. */
4386 if (TREE_CODE (op1a
) == SSA_NAME
4387 && (code1
== NE_EXPR
|| code1
== EQ_EXPR
)
4388 && (integer_zerop (op1b
) || integer_onep (op1b
)))
4390 bool invert
= ((code1
== EQ_EXPR
&& integer_zerop (op1b
))
4391 || (code1
== NE_EXPR
&& integer_onep (op1b
)));
4392 gimple
*stmt
= SSA_NAME_DEF_STMT (op1a
);
4393 switch (gimple_code (stmt
))
4396 /* Try to simplify by copy-propagating the definition. */
4397 return and_var_with_comparison (op1a
, invert
, code2
, op2a
, op2b
);
4400 /* If every argument to the PHI produces the same result when
4401 ANDed with the second comparison, we win.
4402 Do not do this unless the type is bool since we need a bool
4403 result here anyway. */
4404 if (TREE_CODE (TREE_TYPE (op1a
)) == BOOLEAN_TYPE
)
4406 tree result
= NULL_TREE
;
4408 for (i
= 0; i
< gimple_phi_num_args (stmt
); i
++)
4410 tree arg
= gimple_phi_arg_def (stmt
, i
);
4412 /* If this PHI has itself as an argument, ignore it.
4413 If all the other args produce the same result,
4415 if (arg
== gimple_phi_result (stmt
))
4417 else if (TREE_CODE (arg
) == INTEGER_CST
)
4419 if (invert
? integer_nonzerop (arg
) : integer_zerop (arg
))
4422 result
= boolean_false_node
;
4423 else if (!integer_zerop (result
))
4427 result
= fold_build2 (code2
, boolean_type_node
,
4429 else if (!same_bool_comparison_p (result
,
4433 else if (TREE_CODE (arg
) == SSA_NAME
4434 && !SSA_NAME_IS_DEFAULT_DEF (arg
))
4437 gimple
*def_stmt
= SSA_NAME_DEF_STMT (arg
);
4438 /* In simple cases we can look through PHI nodes,
4439 but we have to be careful with loops.
4441 if (! dom_info_available_p (CDI_DOMINATORS
)
4442 || gimple_bb (def_stmt
) == gimple_bb (stmt
)
4443 || dominated_by_p (CDI_DOMINATORS
,
4444 gimple_bb (def_stmt
),
4447 temp
= and_var_with_comparison (arg
, invert
, code2
,
4453 else if (!same_bool_result_p (result
, temp
))
4469 /* Try to simplify the AND of two comparisons, specified by
4470 (OP1A CODE1 OP1B) and (OP2B CODE2 OP2B), respectively.
4471 If this can be simplified to a single expression (without requiring
4472 introducing more SSA variables to hold intermediate values),
4473 return the resulting tree. Otherwise return NULL_TREE.
4474 If the result expression is non-null, it has boolean type. */
4477 maybe_fold_and_comparisons (enum tree_code code1
, tree op1a
, tree op1b
,
4478 enum tree_code code2
, tree op2a
, tree op2b
)
4480 tree t
= and_comparisons_1 (code1
, op1a
, op1b
, code2
, op2a
, op2b
);
4484 return and_comparisons_1 (code2
, op2a
, op2b
, code1
, op1a
, op1b
);
4487 /* Helper function for or_comparisons_1: try to simplify the OR of the
4488 ssa variable VAR with the comparison specified by (OP2A CODE2 OP2B).
4489 If INVERT is true, invert the value of VAR before doing the OR.
4490 Return NULL_EXPR if we can't simplify this to a single expression. */
4493 or_var_with_comparison (tree var
, bool invert
,
4494 enum tree_code code2
, tree op2a
, tree op2b
)
4497 gimple
*stmt
= SSA_NAME_DEF_STMT (var
);
4499 /* We can only deal with variables whose definitions are assignments. */
4500 if (!is_gimple_assign (stmt
))
4503 /* If we have an inverted comparison, apply DeMorgan's law and rewrite
4504 !var OR (op2a code2 op2b) => !(var AND !(op2a code2 op2b))
4505 Then we only have to consider the simpler non-inverted cases. */
4507 t
= and_var_with_comparison_1 (stmt
,
4508 invert_tree_comparison (code2
, false),
4511 t
= or_var_with_comparison_1 (stmt
, code2
, op2a
, op2b
);
4512 return canonicalize_bool (t
, invert
);
4515 /* Try to simplify the OR of the ssa variable defined by the assignment
4516 STMT with the comparison specified by (OP2A CODE2 OP2B).
4517 Return NULL_EXPR if we can't simplify this to a single expression. */
4520 or_var_with_comparison_1 (gimple
*stmt
,
4521 enum tree_code code2
, tree op2a
, tree op2b
)
4523 tree var
= gimple_assign_lhs (stmt
);
4524 tree true_test_var
= NULL_TREE
;
4525 tree false_test_var
= NULL_TREE
;
4526 enum tree_code innercode
= gimple_assign_rhs_code (stmt
);
4528 /* Check for identities like (var OR (var != 0)) => true . */
4529 if (TREE_CODE (op2a
) == SSA_NAME
4530 && TREE_CODE (TREE_TYPE (var
)) == BOOLEAN_TYPE
)
4532 if ((code2
== NE_EXPR
&& integer_zerop (op2b
))
4533 || (code2
== EQ_EXPR
&& integer_nonzerop (op2b
)))
4535 true_test_var
= op2a
;
4536 if (var
== true_test_var
)
4539 else if ((code2
== EQ_EXPR
&& integer_zerop (op2b
))
4540 || (code2
== NE_EXPR
&& integer_nonzerop (op2b
)))
4542 false_test_var
= op2a
;
4543 if (var
== false_test_var
)
4544 return boolean_true_node
;
4548 /* If the definition is a comparison, recurse on it. */
4549 if (TREE_CODE_CLASS (innercode
) == tcc_comparison
)
4551 tree t
= or_comparisons_1 (innercode
,
4552 gimple_assign_rhs1 (stmt
),
4553 gimple_assign_rhs2 (stmt
),
4561 /* If the definition is an AND or OR expression, we may be able to
4562 simplify by reassociating. */
4563 if (TREE_CODE (TREE_TYPE (var
)) == BOOLEAN_TYPE
4564 && (innercode
== BIT_AND_EXPR
|| innercode
== BIT_IOR_EXPR
))
4566 tree inner1
= gimple_assign_rhs1 (stmt
);
4567 tree inner2
= gimple_assign_rhs2 (stmt
);
4570 tree partial
= NULL_TREE
;
4571 bool is_or
= (innercode
== BIT_IOR_EXPR
);
4573 /* Check for boolean identities that don't require recursive examination
4575 inner1 OR (inner1 OR inner2) => inner1 OR inner2 => var
4576 inner1 OR (inner1 AND inner2) => inner1
4577 !inner1 OR (inner1 OR inner2) => true
4578 !inner1 OR (inner1 AND inner2) => !inner1 OR inner2
4580 if (inner1
== true_test_var
)
4581 return (is_or
? var
: inner1
);
4582 else if (inner2
== true_test_var
)
4583 return (is_or
? var
: inner2
);
4584 else if (inner1
== false_test_var
)
4587 : or_var_with_comparison (inner2
, false, code2
, op2a
, op2b
));
4588 else if (inner2
== false_test_var
)
4591 : or_var_with_comparison (inner1
, false, code2
, op2a
, op2b
));
4593 /* Next, redistribute/reassociate the OR across the inner tests.
4594 Compute the first partial result, (inner1 OR (op2a code op2b)) */
4595 if (TREE_CODE (inner1
) == SSA_NAME
4596 && is_gimple_assign (s
= SSA_NAME_DEF_STMT (inner1
))
4597 && TREE_CODE_CLASS (gimple_assign_rhs_code (s
)) == tcc_comparison
4598 && (t
= maybe_fold_or_comparisons (gimple_assign_rhs_code (s
),
4599 gimple_assign_rhs1 (s
),
4600 gimple_assign_rhs2 (s
),
4601 code2
, op2a
, op2b
)))
4603 /* Handle the OR case, where we are reassociating:
4604 (inner1 OR inner2) OR (op2a code2 op2b)
4606 If the partial result t is a constant, we win. Otherwise
4607 continue on to try reassociating with the other inner test. */
4610 if (integer_onep (t
))
4611 return boolean_true_node
;
4612 else if (integer_zerop (t
))
4616 /* Handle the AND case, where we are redistributing:
4617 (inner1 AND inner2) OR (op2a code2 op2b)
4618 => (t AND (inner2 OR (op2a code op2b))) */
4619 else if (integer_zerop (t
))
4620 return boolean_false_node
;
4622 /* Save partial result for later. */
4626 /* Compute the second partial result, (inner2 OR (op2a code op2b)) */
4627 if (TREE_CODE (inner2
) == SSA_NAME
4628 && is_gimple_assign (s
= SSA_NAME_DEF_STMT (inner2
))
4629 && TREE_CODE_CLASS (gimple_assign_rhs_code (s
)) == tcc_comparison
4630 && (t
= maybe_fold_or_comparisons (gimple_assign_rhs_code (s
),
4631 gimple_assign_rhs1 (s
),
4632 gimple_assign_rhs2 (s
),
4633 code2
, op2a
, op2b
)))
4635 /* Handle the OR case, where we are reassociating:
4636 (inner1 OR inner2) OR (op2a code2 op2b)
4638 => (t OR partial) */
4641 if (integer_zerop (t
))
4643 else if (integer_onep (t
))
4644 return boolean_true_node
;
4645 /* If both are the same, we can apply the identity
4647 else if (partial
&& same_bool_result_p (t
, partial
))
4651 /* Handle the AND case, where we are redistributing:
4652 (inner1 AND inner2) OR (op2a code2 op2b)
4653 => (t AND (inner1 OR (op2a code2 op2b)))
4654 => (t AND partial) */
4657 if (integer_zerop (t
))
4658 return boolean_false_node
;
4661 /* We already got a simplification for the other
4662 operand to the redistributed AND expression. The
4663 interesting case is when at least one is true.
4664 Or, if both are the same, we can apply the identity
4666 if (integer_onep (partial
))
4668 else if (integer_onep (t
))
4670 else if (same_bool_result_p (t
, partial
))
4679 /* Try to simplify the OR of two comparisons defined by
4680 (OP1A CODE1 OP1B) and (OP2A CODE2 OP2B), respectively.
4681 If this can be done without constructing an intermediate value,
4682 return the resulting tree; otherwise NULL_TREE is returned.
4683 This function is deliberately asymmetric as it recurses on SSA_DEFs
4684 in the first comparison but not the second. */
4687 or_comparisons_1 (enum tree_code code1
, tree op1a
, tree op1b
,
4688 enum tree_code code2
, tree op2a
, tree op2b
)
4690 tree truth_type
= truth_type_for (TREE_TYPE (op1a
));
4692 /* First check for ((x CODE1 y) OR (x CODE2 y)). */
4693 if (operand_equal_p (op1a
, op2a
, 0)
4694 && operand_equal_p (op1b
, op2b
, 0))
4696 /* Result will be either NULL_TREE, or a combined comparison. */
4697 tree t
= combine_comparisons (UNKNOWN_LOCATION
,
4698 TRUTH_ORIF_EXPR
, code1
, code2
,
4699 truth_type
, op1a
, op1b
);
4704 /* Likewise the swapped case of the above. */
4705 if (operand_equal_p (op1a
, op2b
, 0)
4706 && operand_equal_p (op1b
, op2a
, 0))
4708 /* Result will be either NULL_TREE, or a combined comparison. */
4709 tree t
= combine_comparisons (UNKNOWN_LOCATION
,
4710 TRUTH_ORIF_EXPR
, code1
,
4711 swap_tree_comparison (code2
),
4712 truth_type
, op1a
, op1b
);
4717 /* If both comparisons are of the same value against constants, we might
4718 be able to merge them. */
4719 if (operand_equal_p (op1a
, op2a
, 0)
4720 && TREE_CODE (op1b
) == INTEGER_CST
4721 && TREE_CODE (op2b
) == INTEGER_CST
)
4723 int cmp
= tree_int_cst_compare (op1b
, op2b
);
4725 /* If we have (op1a != op1b), we should either be able to
4726 return that or TRUE, depending on whether the constant op1b
4727 also satisfies the other comparison against op2b. */
4728 if (code1
== NE_EXPR
)
4734 case EQ_EXPR
: val
= (cmp
== 0); break;
4735 case NE_EXPR
: val
= (cmp
!= 0); break;
4736 case LT_EXPR
: val
= (cmp
< 0); break;
4737 case GT_EXPR
: val
= (cmp
> 0); break;
4738 case LE_EXPR
: val
= (cmp
<= 0); break;
4739 case GE_EXPR
: val
= (cmp
>= 0); break;
4740 default: done
= false;
4745 return boolean_true_node
;
4747 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
4750 /* Likewise if the second comparison is a != comparison. */
4751 else if (code2
== NE_EXPR
)
4757 case EQ_EXPR
: val
= (cmp
== 0); break;
4758 case NE_EXPR
: val
= (cmp
!= 0); break;
4759 case LT_EXPR
: val
= (cmp
> 0); break;
4760 case GT_EXPR
: val
= (cmp
< 0); break;
4761 case LE_EXPR
: val
= (cmp
>= 0); break;
4762 case GE_EXPR
: val
= (cmp
<= 0); break;
4763 default: done
= false;
4768 return boolean_true_node
;
4770 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
4774 /* See if an equality test is redundant with the other comparison. */
4775 else if (code1
== EQ_EXPR
)
4780 case EQ_EXPR
: val
= (cmp
== 0); break;
4781 case NE_EXPR
: val
= (cmp
!= 0); break;
4782 case LT_EXPR
: val
= (cmp
< 0); break;
4783 case GT_EXPR
: val
= (cmp
> 0); break;
4784 case LE_EXPR
: val
= (cmp
<= 0); break;
4785 case GE_EXPR
: val
= (cmp
>= 0); break;
4790 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
4792 else if (code2
== EQ_EXPR
)
4797 case EQ_EXPR
: val
= (cmp
== 0); break;
4798 case NE_EXPR
: val
= (cmp
!= 0); break;
4799 case LT_EXPR
: val
= (cmp
> 0); break;
4800 case GT_EXPR
: val
= (cmp
< 0); break;
4801 case LE_EXPR
: val
= (cmp
>= 0); break;
4802 case GE_EXPR
: val
= (cmp
<= 0); break;
4807 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
4810 /* Chose the less restrictive of two < or <= comparisons. */
4811 else if ((code1
== LT_EXPR
|| code1
== LE_EXPR
)
4812 && (code2
== LT_EXPR
|| code2
== LE_EXPR
))
4814 if ((cmp
< 0) || (cmp
== 0 && code1
== LT_EXPR
))
4815 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
4817 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
4820 /* Likewise chose the less restrictive of two > or >= comparisons. */
4821 else if ((code1
== GT_EXPR
|| code1
== GE_EXPR
)
4822 && (code2
== GT_EXPR
|| code2
== GE_EXPR
))
4824 if ((cmp
> 0) || (cmp
== 0 && code1
== GT_EXPR
))
4825 return fold_build2 (code2
, boolean_type_node
, op2a
, op2b
);
4827 return fold_build2 (code1
, boolean_type_node
, op1a
, op1b
);
4830 /* Check for singleton ranges. */
4832 && ((code1
== LT_EXPR
&& code2
== GT_EXPR
)
4833 || (code1
== GT_EXPR
&& code2
== LT_EXPR
)))
4834 return fold_build2 (NE_EXPR
, boolean_type_node
, op1a
, op2b
);
4836 /* Check for less/greater pairs that don't restrict the range at all. */
4838 && (code1
== LT_EXPR
|| code1
== LE_EXPR
)
4839 && (code2
== GT_EXPR
|| code2
== GE_EXPR
))
4840 return boolean_true_node
;
4842 && (code1
== GT_EXPR
|| code1
== GE_EXPR
)
4843 && (code2
== LT_EXPR
|| code2
== LE_EXPR
))
4844 return boolean_true_node
;
4847 /* Perhaps the first comparison is (NAME != 0) or (NAME == 1) where
4848 NAME's definition is a truth value. See if there are any simplifications
4849 that can be done against the NAME's definition. */
4850 if (TREE_CODE (op1a
) == SSA_NAME
4851 && (code1
== NE_EXPR
|| code1
== EQ_EXPR
)
4852 && (integer_zerop (op1b
) || integer_onep (op1b
)))
4854 bool invert
= ((code1
== EQ_EXPR
&& integer_zerop (op1b
))
4855 || (code1
== NE_EXPR
&& integer_onep (op1b
)));
4856 gimple
*stmt
= SSA_NAME_DEF_STMT (op1a
);
4857 switch (gimple_code (stmt
))
4860 /* Try to simplify by copy-propagating the definition. */
4861 return or_var_with_comparison (op1a
, invert
, code2
, op2a
, op2b
);
4864 /* If every argument to the PHI produces the same result when
4865 ORed with the second comparison, we win.
4866 Do not do this unless the type is bool since we need a bool
4867 result here anyway. */
4868 if (TREE_CODE (TREE_TYPE (op1a
)) == BOOLEAN_TYPE
)
4870 tree result
= NULL_TREE
;
4872 for (i
= 0; i
< gimple_phi_num_args (stmt
); i
++)
4874 tree arg
= gimple_phi_arg_def (stmt
, i
);
4876 /* If this PHI has itself as an argument, ignore it.
4877 If all the other args produce the same result,
4879 if (arg
== gimple_phi_result (stmt
))
4881 else if (TREE_CODE (arg
) == INTEGER_CST
)
4883 if (invert
? integer_zerop (arg
) : integer_nonzerop (arg
))
4886 result
= boolean_true_node
;
4887 else if (!integer_onep (result
))
4891 result
= fold_build2 (code2
, boolean_type_node
,
4893 else if (!same_bool_comparison_p (result
,
4897 else if (TREE_CODE (arg
) == SSA_NAME
4898 && !SSA_NAME_IS_DEFAULT_DEF (arg
))
4901 gimple
*def_stmt
= SSA_NAME_DEF_STMT (arg
);
4902 /* In simple cases we can look through PHI nodes,
4903 but we have to be careful with loops.
4905 if (! dom_info_available_p (CDI_DOMINATORS
)
4906 || gimple_bb (def_stmt
) == gimple_bb (stmt
)
4907 || dominated_by_p (CDI_DOMINATORS
,
4908 gimple_bb (def_stmt
),
4911 temp
= or_var_with_comparison (arg
, invert
, code2
,
4917 else if (!same_bool_result_p (result
, temp
))
4933 /* Try to simplify the OR of two comparisons, specified by
4934 (OP1A CODE1 OP1B) and (OP2B CODE2 OP2B), respectively.
4935 If this can be simplified to a single expression (without requiring
4936 introducing more SSA variables to hold intermediate values),
4937 return the resulting tree. Otherwise return NULL_TREE.
4938 If the result expression is non-null, it has boolean type. */
4941 maybe_fold_or_comparisons (enum tree_code code1
, tree op1a
, tree op1b
,
4942 enum tree_code code2
, tree op2a
, tree op2b
)
4944 tree t
= or_comparisons_1 (code1
, op1a
, op1b
, code2
, op2a
, op2b
);
4948 return or_comparisons_1 (code2
, op2a
, op2b
, code1
, op1a
, op1b
);
4952 /* Fold STMT to a constant using VALUEIZE to valueize SSA names.
4954 Either NULL_TREE, a simplified but non-constant or a constant
4957 ??? This should go into a gimple-fold-inline.h file to be eventually
4958 privatized with the single valueize function used in the various TUs
4959 to avoid the indirect function call overhead. */
4962 gimple_fold_stmt_to_constant_1 (gimple
*stmt
, tree (*valueize
) (tree
),
4963 tree (*gvalueize
) (tree
))
4967 /* ??? The SSA propagators do not correctly deal with following SSA use-def
4968 edges if there are intermediate VARYING defs. For this reason
4969 do not follow SSA edges here even though SCCVN can technically
4970 just deal fine with that. */
4971 if (gimple_simplify (stmt
, &rcode
, ops
, NULL
, gvalueize
, valueize
))
4973 tree res
= NULL_TREE
;
4974 if (gimple_simplified_result_is_gimple_val (rcode
, ops
))
4976 else if (mprts_hook
)
4977 res
= mprts_hook (rcode
, gimple_expr_type (stmt
), ops
);
4980 if (dump_file
&& dump_flags
& TDF_DETAILS
)
4982 fprintf (dump_file
, "Match-and-simplified ");
4983 print_gimple_expr (dump_file
, stmt
, 0, TDF_SLIM
);
4984 fprintf (dump_file
, " to ");
4985 print_generic_expr (dump_file
, res
, 0);
4986 fprintf (dump_file
, "\n");
4992 location_t loc
= gimple_location (stmt
);
4993 switch (gimple_code (stmt
))
4997 enum tree_code subcode
= gimple_assign_rhs_code (stmt
);
4999 switch (get_gimple_rhs_class (subcode
))
5001 case GIMPLE_SINGLE_RHS
:
5003 tree rhs
= gimple_assign_rhs1 (stmt
);
5004 enum tree_code_class kind
= TREE_CODE_CLASS (subcode
);
5006 if (TREE_CODE (rhs
) == SSA_NAME
)
5008 /* If the RHS is an SSA_NAME, return its known constant value,
5010 return (*valueize
) (rhs
);
5012 /* Handle propagating invariant addresses into address
5014 else if (TREE_CODE (rhs
) == ADDR_EXPR
5015 && !is_gimple_min_invariant (rhs
))
5017 HOST_WIDE_INT offset
= 0;
5019 base
= get_addr_base_and_unit_offset_1 (TREE_OPERAND (rhs
, 0),
5023 && (CONSTANT_CLASS_P (base
)
5024 || decl_address_invariant_p (base
)))
5025 return build_invariant_address (TREE_TYPE (rhs
),
5028 else if (TREE_CODE (rhs
) == CONSTRUCTOR
5029 && TREE_CODE (TREE_TYPE (rhs
)) == VECTOR_TYPE
5030 && (CONSTRUCTOR_NELTS (rhs
)
5031 == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs
))))
5036 vec
= XALLOCAVEC (tree
,
5037 TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs
)));
5038 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs
), i
, val
)
5040 val
= (*valueize
) (val
);
5041 if (TREE_CODE (val
) == INTEGER_CST
5042 || TREE_CODE (val
) == REAL_CST
5043 || TREE_CODE (val
) == FIXED_CST
)
5049 return build_vector (TREE_TYPE (rhs
), vec
);
5051 if (subcode
== OBJ_TYPE_REF
)
5053 tree val
= (*valueize
) (OBJ_TYPE_REF_EXPR (rhs
));
5054 /* If callee is constant, we can fold away the wrapper. */
5055 if (is_gimple_min_invariant (val
))
5059 if (kind
== tcc_reference
)
5061 if ((TREE_CODE (rhs
) == VIEW_CONVERT_EXPR
5062 || TREE_CODE (rhs
) == REALPART_EXPR
5063 || TREE_CODE (rhs
) == IMAGPART_EXPR
)
5064 && TREE_CODE (TREE_OPERAND (rhs
, 0)) == SSA_NAME
)
5066 tree val
= (*valueize
) (TREE_OPERAND (rhs
, 0));
5067 return fold_unary_loc (EXPR_LOCATION (rhs
),
5069 TREE_TYPE (rhs
), val
);
5071 else if (TREE_CODE (rhs
) == BIT_FIELD_REF
5072 && TREE_CODE (TREE_OPERAND (rhs
, 0)) == SSA_NAME
)
5074 tree val
= (*valueize
) (TREE_OPERAND (rhs
, 0));
5075 return fold_ternary_loc (EXPR_LOCATION (rhs
),
5077 TREE_TYPE (rhs
), val
,
5078 TREE_OPERAND (rhs
, 1),
5079 TREE_OPERAND (rhs
, 2));
5081 else if (TREE_CODE (rhs
) == MEM_REF
5082 && TREE_CODE (TREE_OPERAND (rhs
, 0)) == SSA_NAME
)
5084 tree val
= (*valueize
) (TREE_OPERAND (rhs
, 0));
5085 if (TREE_CODE (val
) == ADDR_EXPR
5086 && is_gimple_min_invariant (val
))
5088 tree tem
= fold_build2 (MEM_REF
, TREE_TYPE (rhs
),
5090 TREE_OPERAND (rhs
, 1));
5095 return fold_const_aggregate_ref_1 (rhs
, valueize
);
5097 else if (kind
== tcc_declaration
)
5098 return get_symbol_constant_value (rhs
);
5102 case GIMPLE_UNARY_RHS
:
5105 case GIMPLE_BINARY_RHS
:
5106 /* Translate &x + CST into an invariant form suitable for
5107 further propagation. */
5108 if (subcode
== POINTER_PLUS_EXPR
)
5110 tree op0
= (*valueize
) (gimple_assign_rhs1 (stmt
));
5111 tree op1
= (*valueize
) (gimple_assign_rhs2 (stmt
));
5112 if (TREE_CODE (op0
) == ADDR_EXPR
5113 && TREE_CODE (op1
) == INTEGER_CST
)
5115 tree off
= fold_convert (ptr_type_node
, op1
);
5116 return build_fold_addr_expr_loc
5118 fold_build2 (MEM_REF
,
5119 TREE_TYPE (TREE_TYPE (op0
)),
5120 unshare_expr (op0
), off
));
5123 /* Canonicalize bool != 0 and bool == 0 appearing after
5124 valueization. While gimple_simplify handles this
5125 it can get confused by the ~X == 1 -> X == 0 transform
5126 which we cant reduce to a SSA name or a constant
5127 (and we have no way to tell gimple_simplify to not
5128 consider those transforms in the first place). */
5129 else if (subcode
== EQ_EXPR
5130 || subcode
== NE_EXPR
)
5132 tree lhs
= gimple_assign_lhs (stmt
);
5133 tree op0
= gimple_assign_rhs1 (stmt
);
5134 if (useless_type_conversion_p (TREE_TYPE (lhs
),
5137 tree op1
= (*valueize
) (gimple_assign_rhs2 (stmt
));
5138 op0
= (*valueize
) (op0
);
5139 if (TREE_CODE (op0
) == INTEGER_CST
)
5140 std::swap (op0
, op1
);
5141 if (TREE_CODE (op1
) == INTEGER_CST
5142 && ((subcode
== NE_EXPR
&& integer_zerop (op1
))
5143 || (subcode
== EQ_EXPR
&& integer_onep (op1
))))
5149 case GIMPLE_TERNARY_RHS
:
5151 /* Handle ternary operators that can appear in GIMPLE form. */
5152 tree op0
= (*valueize
) (gimple_assign_rhs1 (stmt
));
5153 tree op1
= (*valueize
) (gimple_assign_rhs2 (stmt
));
5154 tree op2
= (*valueize
) (gimple_assign_rhs3 (stmt
));
5155 return fold_ternary_loc (loc
, subcode
,
5156 gimple_expr_type (stmt
), op0
, op1
, op2
);
5167 gcall
*call_stmt
= as_a
<gcall
*> (stmt
);
5169 if (gimple_call_internal_p (stmt
))
5171 enum tree_code subcode
= ERROR_MARK
;
5172 switch (gimple_call_internal_fn (stmt
))
5174 case IFN_UBSAN_CHECK_ADD
:
5175 subcode
= PLUS_EXPR
;
5177 case IFN_UBSAN_CHECK_SUB
:
5178 subcode
= MINUS_EXPR
;
5180 case IFN_UBSAN_CHECK_MUL
:
5181 subcode
= MULT_EXPR
;
5186 tree arg0
= gimple_call_arg (stmt
, 0);
5187 tree arg1
= gimple_call_arg (stmt
, 1);
5188 tree op0
= (*valueize
) (arg0
);
5189 tree op1
= (*valueize
) (arg1
);
5191 if (TREE_CODE (op0
) != INTEGER_CST
5192 || TREE_CODE (op1
) != INTEGER_CST
)
5197 /* x * 0 = 0 * x = 0 without overflow. */
5198 if (integer_zerop (op0
) || integer_zerop (op1
))
5199 return build_zero_cst (TREE_TYPE (arg0
));
5202 /* y - y = 0 without overflow. */
5203 if (operand_equal_p (op0
, op1
, 0))
5204 return build_zero_cst (TREE_TYPE (arg0
));
5211 = fold_binary_loc (loc
, subcode
, TREE_TYPE (arg0
), op0
, op1
);
5213 && TREE_CODE (res
) == INTEGER_CST
5214 && !TREE_OVERFLOW (res
))
5219 fn
= (*valueize
) (gimple_call_fn (stmt
));
5220 if (TREE_CODE (fn
) == ADDR_EXPR
5221 && TREE_CODE (TREE_OPERAND (fn
, 0)) == FUNCTION_DECL
5222 && DECL_BUILT_IN (TREE_OPERAND (fn
, 0))
5223 && gimple_builtin_call_types_compatible_p (stmt
,
5224 TREE_OPERAND (fn
, 0)))
5226 tree
*args
= XALLOCAVEC (tree
, gimple_call_num_args (stmt
));
5229 for (i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
5230 args
[i
] = (*valueize
) (gimple_call_arg (stmt
, i
));
5231 retval
= fold_builtin_call_array (loc
,
5232 gimple_call_return_type (call_stmt
),
5233 fn
, gimple_call_num_args (stmt
), args
);
5236 /* fold_call_expr wraps the result inside a NOP_EXPR. */
5237 STRIP_NOPS (retval
);
5238 retval
= fold_convert (gimple_call_return_type (call_stmt
),
5251 /* Fold STMT to a constant using VALUEIZE to valueize SSA names.
5252 Returns NULL_TREE if folding to a constant is not possible, otherwise
5253 returns a constant according to is_gimple_min_invariant. */
5256 gimple_fold_stmt_to_constant (gimple
*stmt
, tree (*valueize
) (tree
))
5258 tree res
= gimple_fold_stmt_to_constant_1 (stmt
, valueize
);
5259 if (res
&& is_gimple_min_invariant (res
))
5265 /* The following set of functions are supposed to fold references using
5266 their constant initializers. */
5268 /* See if we can find constructor defining value of BASE.
5269 When we know the consructor with constant offset (such as
5270 base is array[40] and we do know constructor of array), then
5271 BIT_OFFSET is adjusted accordingly.
5273 As a special case, return error_mark_node when constructor
5274 is not explicitly available, but it is known to be zero
5275 such as 'static const int a;'. */
5277 get_base_constructor (tree base
, HOST_WIDE_INT
*bit_offset
,
5278 tree (*valueize
)(tree
))
5280 HOST_WIDE_INT bit_offset2
, size
, max_size
;
5283 if (TREE_CODE (base
) == MEM_REF
)
5285 if (!integer_zerop (TREE_OPERAND (base
, 1)))
5287 if (!tree_fits_shwi_p (TREE_OPERAND (base
, 1)))
5289 *bit_offset
+= (mem_ref_offset (base
).to_short_addr ()
5294 && TREE_CODE (TREE_OPERAND (base
, 0)) == SSA_NAME
)
5295 base
= valueize (TREE_OPERAND (base
, 0));
5296 if (!base
|| TREE_CODE (base
) != ADDR_EXPR
)
5298 base
= TREE_OPERAND (base
, 0);
5301 /* Get a CONSTRUCTOR. If BASE is a VAR_DECL, get its
5302 DECL_INITIAL. If BASE is a nested reference into another
5303 ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
5304 the inner reference. */
5305 switch (TREE_CODE (base
))
5310 tree init
= ctor_for_folding (base
);
5312 /* Our semantic is exact opposite of ctor_for_folding;
5313 NULL means unknown, while error_mark_node is 0. */
5314 if (init
== error_mark_node
)
5317 return error_mark_node
;
5323 base
= get_ref_base_and_extent (base
, &bit_offset2
, &size
, &max_size
,
5325 if (max_size
== -1 || size
!= max_size
)
5327 *bit_offset
+= bit_offset2
;
5328 return get_base_constructor (base
, bit_offset
, valueize
);
5339 /* CTOR is CONSTRUCTOR of an array type. Fold reference of type TYPE and size
5340 SIZE to the memory at bit OFFSET. */
5343 fold_array_ctor_reference (tree type
, tree ctor
,
5344 unsigned HOST_WIDE_INT offset
,
5345 unsigned HOST_WIDE_INT size
,
5348 offset_int low_bound
;
5349 offset_int elt_size
;
5350 offset_int access_index
;
5351 tree domain_type
= NULL_TREE
;
5352 HOST_WIDE_INT inner_offset
;
5354 /* Compute low bound and elt size. */
5355 if (TREE_CODE (TREE_TYPE (ctor
)) == ARRAY_TYPE
)
5356 domain_type
= TYPE_DOMAIN (TREE_TYPE (ctor
));
5357 if (domain_type
&& TYPE_MIN_VALUE (domain_type
))
5359 /* Static constructors for variably sized objects makes no sense. */
5360 gcc_assert (TREE_CODE (TYPE_MIN_VALUE (domain_type
)) == INTEGER_CST
);
5361 low_bound
= wi::to_offset (TYPE_MIN_VALUE (domain_type
));
5365 /* Static constructors for variably sized objects makes no sense. */
5366 gcc_assert (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor
))))
5368 elt_size
= wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor
))));
5370 /* We can handle only constantly sized accesses that are known to not
5371 be larger than size of array element. */
5372 if (!TYPE_SIZE_UNIT (type
)
5373 || TREE_CODE (TYPE_SIZE_UNIT (type
)) != INTEGER_CST
5374 || wi::lts_p (elt_size
, wi::to_offset (TYPE_SIZE_UNIT (type
)))
5378 /* Compute the array index we look for. */
5379 access_index
= wi::udiv_trunc (offset_int (offset
/ BITS_PER_UNIT
),
5381 access_index
+= low_bound
;
5383 /* And offset within the access. */
5384 inner_offset
= offset
% (elt_size
.to_uhwi () * BITS_PER_UNIT
);
5386 /* See if the array field is large enough to span whole access. We do not
5387 care to fold accesses spanning multiple array indexes. */
5388 if (inner_offset
+ size
> elt_size
.to_uhwi () * BITS_PER_UNIT
)
5390 if (tree val
= get_array_ctor_element_at_index (ctor
, access_index
))
5391 return fold_ctor_reference (type
, val
, inner_offset
, size
, from_decl
);
5393 /* When memory is not explicitely mentioned in constructor,
5394 it is 0 (or out of range). */
5395 return build_zero_cst (type
);
5398 /* CTOR is CONSTRUCTOR of an aggregate or vector.
5399 Fold reference of type TYPE and size SIZE to the memory at bit OFFSET. */
5402 fold_nonarray_ctor_reference (tree type
, tree ctor
,
5403 unsigned HOST_WIDE_INT offset
,
5404 unsigned HOST_WIDE_INT size
,
5407 unsigned HOST_WIDE_INT cnt
;
5410 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor
), cnt
, cfield
,
5413 tree byte_offset
= DECL_FIELD_OFFSET (cfield
);
5414 tree field_offset
= DECL_FIELD_BIT_OFFSET (cfield
);
5415 tree field_size
= DECL_SIZE (cfield
);
5416 offset_int bitoffset
;
5417 offset_int bitoffset_end
, access_end
;
5419 /* Variable sized objects in static constructors makes no sense,
5420 but field_size can be NULL for flexible array members. */
5421 gcc_assert (TREE_CODE (field_offset
) == INTEGER_CST
5422 && TREE_CODE (byte_offset
) == INTEGER_CST
5423 && (field_size
!= NULL_TREE
5424 ? TREE_CODE (field_size
) == INTEGER_CST
5425 : TREE_CODE (TREE_TYPE (cfield
)) == ARRAY_TYPE
));
5427 /* Compute bit offset of the field. */
5428 bitoffset
= (wi::to_offset (field_offset
)
5429 + wi::lshift (wi::to_offset (byte_offset
),
5430 LOG2_BITS_PER_UNIT
));
5431 /* Compute bit offset where the field ends. */
5432 if (field_size
!= NULL_TREE
)
5433 bitoffset_end
= bitoffset
+ wi::to_offset (field_size
);
5437 access_end
= offset_int (offset
) + size
;
5439 /* Is there any overlap between [OFFSET, OFFSET+SIZE) and
5440 [BITOFFSET, BITOFFSET_END)? */
5441 if (wi::cmps (access_end
, bitoffset
) > 0
5442 && (field_size
== NULL_TREE
5443 || wi::lts_p (offset
, bitoffset_end
)))
5445 offset_int inner_offset
= offset_int (offset
) - bitoffset
;
5446 /* We do have overlap. Now see if field is large enough to
5447 cover the access. Give up for accesses spanning multiple
5449 if (wi::cmps (access_end
, bitoffset_end
) > 0)
5451 if (wi::lts_p (offset
, bitoffset
))
5453 return fold_ctor_reference (type
, cval
,
5454 inner_offset
.to_uhwi (), size
,
5458 /* When memory is not explicitely mentioned in constructor, it is 0. */
5459 return build_zero_cst (type
);
5462 /* CTOR is value initializing memory, fold reference of type TYPE and size SIZE
5463 to the memory at bit OFFSET. */
5466 fold_ctor_reference (tree type
, tree ctor
, unsigned HOST_WIDE_INT offset
,
5467 unsigned HOST_WIDE_INT size
, tree from_decl
)
5471 /* We found the field with exact match. */
5472 if (useless_type_conversion_p (type
, TREE_TYPE (ctor
))
5474 return canonicalize_constructor_val (unshare_expr (ctor
), from_decl
);
5476 /* We are at the end of walk, see if we can view convert the
5478 if (!AGGREGATE_TYPE_P (TREE_TYPE (ctor
)) && !offset
5479 /* VIEW_CONVERT_EXPR is defined only for matching sizes. */
5480 && !compare_tree_int (TYPE_SIZE (type
), size
)
5481 && !compare_tree_int (TYPE_SIZE (TREE_TYPE (ctor
)), size
))
5483 ret
= canonicalize_constructor_val (unshare_expr (ctor
), from_decl
);
5484 ret
= fold_unary (VIEW_CONVERT_EXPR
, type
, ret
);
5486 STRIP_USELESS_TYPE_CONVERSION (ret
);
5489 /* For constants and byte-aligned/sized reads try to go through
5490 native_encode/interpret. */
5491 if (CONSTANT_CLASS_P (ctor
)
5492 && BITS_PER_UNIT
== 8
5493 && offset
% BITS_PER_UNIT
== 0
5494 && size
% BITS_PER_UNIT
== 0
5495 && size
<= MAX_BITSIZE_MODE_ANY_MODE
)
5497 unsigned char buf
[MAX_BITSIZE_MODE_ANY_MODE
/ BITS_PER_UNIT
];
5498 if (native_encode_expr (ctor
, buf
, size
/ BITS_PER_UNIT
,
5499 offset
/ BITS_PER_UNIT
) > 0)
5500 return native_interpret_expr (type
, buf
, size
/ BITS_PER_UNIT
);
5502 if (TREE_CODE (ctor
) == CONSTRUCTOR
)
5505 if (TREE_CODE (TREE_TYPE (ctor
)) == ARRAY_TYPE
5506 || TREE_CODE (TREE_TYPE (ctor
)) == VECTOR_TYPE
)
5507 return fold_array_ctor_reference (type
, ctor
, offset
, size
,
5510 return fold_nonarray_ctor_reference (type
, ctor
, offset
, size
,
5517 /* Return the tree representing the element referenced by T if T is an
5518 ARRAY_REF or COMPONENT_REF into constant aggregates valuezing SSA
5519 names using VALUEIZE. Return NULL_TREE otherwise. */
5522 fold_const_aggregate_ref_1 (tree t
, tree (*valueize
) (tree
))
5524 tree ctor
, idx
, base
;
5525 HOST_WIDE_INT offset
, size
, max_size
;
5529 if (TREE_THIS_VOLATILE (t
))
5533 return get_symbol_constant_value (t
);
5535 tem
= fold_read_from_constant_string (t
);
5539 switch (TREE_CODE (t
))
5542 case ARRAY_RANGE_REF
:
5543 /* Constant indexes are handled well by get_base_constructor.
5544 Only special case variable offsets.
5545 FIXME: This code can't handle nested references with variable indexes
5546 (they will be handled only by iteration of ccp). Perhaps we can bring
5547 get_ref_base_and_extent here and make it use a valueize callback. */
5548 if (TREE_CODE (TREE_OPERAND (t
, 1)) == SSA_NAME
5550 && (idx
= (*valueize
) (TREE_OPERAND (t
, 1)))
5551 && TREE_CODE (idx
) == INTEGER_CST
)
5553 tree low_bound
, unit_size
;
5555 /* If the resulting bit-offset is constant, track it. */
5556 if ((low_bound
= array_ref_low_bound (t
),
5557 TREE_CODE (low_bound
) == INTEGER_CST
)
5558 && (unit_size
= array_ref_element_size (t
),
5559 tree_fits_uhwi_p (unit_size
)))
5562 = wi::sext (wi::to_offset (idx
) - wi::to_offset (low_bound
),
5563 TYPE_PRECISION (TREE_TYPE (idx
)));
5565 if (wi::fits_shwi_p (woffset
))
5567 offset
= woffset
.to_shwi ();
5568 /* TODO: This code seems wrong, multiply then check
5569 to see if it fits. */
5570 offset
*= tree_to_uhwi (unit_size
);
5571 offset
*= BITS_PER_UNIT
;
5573 base
= TREE_OPERAND (t
, 0);
5574 ctor
= get_base_constructor (base
, &offset
, valueize
);
5575 /* Empty constructor. Always fold to 0. */
5576 if (ctor
== error_mark_node
)
5577 return build_zero_cst (TREE_TYPE (t
));
5578 /* Out of bound array access. Value is undefined,
5582 /* We can not determine ctor. */
5585 return fold_ctor_reference (TREE_TYPE (t
), ctor
, offset
,
5586 tree_to_uhwi (unit_size
)
5596 case TARGET_MEM_REF
:
5598 base
= get_ref_base_and_extent (t
, &offset
, &size
, &max_size
, &reverse
);
5599 ctor
= get_base_constructor (base
, &offset
, valueize
);
5601 /* Empty constructor. Always fold to 0. */
5602 if (ctor
== error_mark_node
)
5603 return build_zero_cst (TREE_TYPE (t
));
5604 /* We do not know precise address. */
5605 if (max_size
== -1 || max_size
!= size
)
5607 /* We can not determine ctor. */
5611 /* Out of bound array access. Value is undefined, but don't fold. */
5615 return fold_ctor_reference (TREE_TYPE (t
), ctor
, offset
, size
,
5621 tree c
= fold_const_aggregate_ref_1 (TREE_OPERAND (t
, 0), valueize
);
5622 if (c
&& TREE_CODE (c
) == COMPLEX_CST
)
5623 return fold_build1_loc (EXPR_LOCATION (t
),
5624 TREE_CODE (t
), TREE_TYPE (t
), c
);
5636 fold_const_aggregate_ref (tree t
)
5638 return fold_const_aggregate_ref_1 (t
, NULL
);
5641 /* Lookup virtual method with index TOKEN in a virtual table V
5643 Set CAN_REFER if non-NULL to false if method
5644 is not referable or if the virtual table is ill-formed (such as rewriten
5645 by non-C++ produced symbol). Otherwise just return NULL in that calse. */
5648 gimple_get_virt_method_for_vtable (HOST_WIDE_INT token
,
5650 unsigned HOST_WIDE_INT offset
,
5653 tree vtable
= v
, init
, fn
;
5654 unsigned HOST_WIDE_INT size
;
5655 unsigned HOST_WIDE_INT elt_size
, access_index
;
5661 /* First of all double check we have virtual table. */
5662 if (TREE_CODE (v
) != VAR_DECL
5663 || !DECL_VIRTUAL_P (v
))
5665 /* Pass down that we lost track of the target. */
5671 init
= ctor_for_folding (v
);
5673 /* The virtual tables should always be born with constructors
5674 and we always should assume that they are avaialble for
5675 folding. At the moment we do not stream them in all cases,
5676 but it should never happen that ctor seem unreachable. */
5678 if (init
== error_mark_node
)
5680 gcc_assert (in_lto_p
);
5681 /* Pass down that we lost track of the target. */
5686 gcc_checking_assert (TREE_CODE (TREE_TYPE (v
)) == ARRAY_TYPE
);
5687 size
= tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (v
))));
5688 offset
*= BITS_PER_UNIT
;
5689 offset
+= token
* size
;
5691 /* Lookup the value in the constructor that is assumed to be array.
5692 This is equivalent to
5693 fn = fold_ctor_reference (TREE_TYPE (TREE_TYPE (v)), init,
5694 offset, size, NULL);
5695 but in a constant time. We expect that frontend produced a simple
5696 array without indexed initializers. */
5698 gcc_checking_assert (TREE_CODE (TREE_TYPE (init
)) == ARRAY_TYPE
);
5699 domain_type
= TYPE_DOMAIN (TREE_TYPE (init
));
5700 gcc_checking_assert (integer_zerop (TYPE_MIN_VALUE (domain_type
)));
5701 elt_size
= tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (init
))));
5703 access_index
= offset
/ BITS_PER_UNIT
/ elt_size
;
5704 gcc_checking_assert (offset
% (elt_size
* BITS_PER_UNIT
) == 0);
5706 /* This code makes an assumption that there are no
5707 indexed fileds produced by C++ FE, so we can directly index the array. */
5708 if (access_index
< CONSTRUCTOR_NELTS (init
))
5710 fn
= CONSTRUCTOR_ELT (init
, access_index
)->value
;
5711 gcc_checking_assert (!CONSTRUCTOR_ELT (init
, access_index
)->index
);
5717 /* For type inconsistent program we may end up looking up virtual method
5718 in virtual table that does not contain TOKEN entries. We may overrun
5719 the virtual table and pick up a constant or RTTI info pointer.
5720 In any case the call is undefined. */
5722 || (TREE_CODE (fn
) != ADDR_EXPR
&& TREE_CODE (fn
) != FDESC_EXPR
)
5723 || TREE_CODE (TREE_OPERAND (fn
, 0)) != FUNCTION_DECL
)
5724 fn
= builtin_decl_implicit (BUILT_IN_UNREACHABLE
);
5727 fn
= TREE_OPERAND (fn
, 0);
5729 /* When cgraph node is missing and function is not public, we cannot
5730 devirtualize. This can happen in WHOPR when the actual method
5731 ends up in other partition, because we found devirtualization
5732 possibility too late. */
5733 if (!can_refer_decl_in_current_unit_p (fn
, vtable
))
5744 /* Make sure we create a cgraph node for functions we'll reference.
5745 They can be non-existent if the reference comes from an entry
5746 of an external vtable for example. */
5747 cgraph_node::get_create (fn
);
5752 /* Return a declaration of a function which an OBJ_TYPE_REF references. TOKEN
5753 is integer form of OBJ_TYPE_REF_TOKEN of the reference expression.
5754 KNOWN_BINFO carries the binfo describing the true type of
5755 OBJ_TYPE_REF_OBJECT(REF).
5756 Set CAN_REFER if non-NULL to false if method
5757 is not referable or if the virtual table is ill-formed (such as rewriten
5758 by non-C++ produced symbol). Otherwise just return NULL in that calse. */
5761 gimple_get_virt_method_for_binfo (HOST_WIDE_INT token
, tree known_binfo
,
5764 unsigned HOST_WIDE_INT offset
;
5767 v
= BINFO_VTABLE (known_binfo
);
5768 /* If there is no virtual methods table, leave the OBJ_TYPE_REF alone. */
5772 if (!vtable_pointer_value_to_vtable (v
, &v
, &offset
))
5778 return gimple_get_virt_method_for_vtable (token
, v
, offset
, can_refer
);
5781 /* Given a pointer value OP0, return a simplified version of an
5782 indirection through OP0, or NULL_TREE if no simplification is
5783 possible. Note that the resulting type may be different from
5784 the type pointed to in the sense that it is still compatible
5785 from the langhooks point of view. */
5788 gimple_fold_indirect_ref (tree t
)
5790 tree ptype
= TREE_TYPE (t
), type
= TREE_TYPE (ptype
);
5795 subtype
= TREE_TYPE (sub
);
5796 if (!POINTER_TYPE_P (subtype
))
5799 if (TREE_CODE (sub
) == ADDR_EXPR
)
5801 tree op
= TREE_OPERAND (sub
, 0);
5802 tree optype
= TREE_TYPE (op
);
5804 if (useless_type_conversion_p (type
, optype
))
5807 /* *(foo *)&fooarray => fooarray[0] */
5808 if (TREE_CODE (optype
) == ARRAY_TYPE
5809 && TREE_CODE (TYPE_SIZE (TREE_TYPE (optype
))) == INTEGER_CST
5810 && useless_type_conversion_p (type
, TREE_TYPE (optype
)))
5812 tree type_domain
= TYPE_DOMAIN (optype
);
5813 tree min_val
= size_zero_node
;
5814 if (type_domain
&& TYPE_MIN_VALUE (type_domain
))
5815 min_val
= TYPE_MIN_VALUE (type_domain
);
5816 if (TREE_CODE (min_val
) == INTEGER_CST
)
5817 return build4 (ARRAY_REF
, type
, op
, min_val
, NULL_TREE
, NULL_TREE
);
5819 /* *(foo *)&complexfoo => __real__ complexfoo */
5820 else if (TREE_CODE (optype
) == COMPLEX_TYPE
5821 && useless_type_conversion_p (type
, TREE_TYPE (optype
)))
5822 return fold_build1 (REALPART_EXPR
, type
, op
);
5823 /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
5824 else if (TREE_CODE (optype
) == VECTOR_TYPE
5825 && useless_type_conversion_p (type
, TREE_TYPE (optype
)))
5827 tree part_width
= TYPE_SIZE (type
);
5828 tree index
= bitsize_int (0);
5829 return fold_build3 (BIT_FIELD_REF
, type
, op
, part_width
, index
);
5833 /* *(p + CST) -> ... */
5834 if (TREE_CODE (sub
) == POINTER_PLUS_EXPR
5835 && TREE_CODE (TREE_OPERAND (sub
, 1)) == INTEGER_CST
)
5837 tree addr
= TREE_OPERAND (sub
, 0);
5838 tree off
= TREE_OPERAND (sub
, 1);
5842 addrtype
= TREE_TYPE (addr
);
5844 /* ((foo*)&vectorfoo)[1] -> BIT_FIELD_REF<vectorfoo,...> */
5845 if (TREE_CODE (addr
) == ADDR_EXPR
5846 && TREE_CODE (TREE_TYPE (addrtype
)) == VECTOR_TYPE
5847 && useless_type_conversion_p (type
, TREE_TYPE (TREE_TYPE (addrtype
)))
5848 && tree_fits_uhwi_p (off
))
5850 unsigned HOST_WIDE_INT offset
= tree_to_uhwi (off
);
5851 tree part_width
= TYPE_SIZE (type
);
5852 unsigned HOST_WIDE_INT part_widthi
5853 = tree_to_shwi (part_width
) / BITS_PER_UNIT
;
5854 unsigned HOST_WIDE_INT indexi
= offset
* BITS_PER_UNIT
;
5855 tree index
= bitsize_int (indexi
);
5856 if (offset
/ part_widthi
5857 < TYPE_VECTOR_SUBPARTS (TREE_TYPE (addrtype
)))
5858 return fold_build3 (BIT_FIELD_REF
, type
, TREE_OPERAND (addr
, 0),
5862 /* ((foo*)&complexfoo)[1] -> __imag__ complexfoo */
5863 if (TREE_CODE (addr
) == ADDR_EXPR
5864 && TREE_CODE (TREE_TYPE (addrtype
)) == COMPLEX_TYPE
5865 && useless_type_conversion_p (type
, TREE_TYPE (TREE_TYPE (addrtype
))))
5867 tree size
= TYPE_SIZE_UNIT (type
);
5868 if (tree_int_cst_equal (size
, off
))
5869 return fold_build1 (IMAGPART_EXPR
, type
, TREE_OPERAND (addr
, 0));
5872 /* *(p + CST) -> MEM_REF <p, CST>. */
5873 if (TREE_CODE (addr
) != ADDR_EXPR
5874 || DECL_P (TREE_OPERAND (addr
, 0)))
5875 return fold_build2 (MEM_REF
, type
,
5877 wide_int_to_tree (ptype
, off
));
5880 /* *(foo *)fooarrptr => (*fooarrptr)[0] */
5881 if (TREE_CODE (TREE_TYPE (subtype
)) == ARRAY_TYPE
5882 && TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (subtype
)))) == INTEGER_CST
5883 && useless_type_conversion_p (type
, TREE_TYPE (TREE_TYPE (subtype
))))
5886 tree min_val
= size_zero_node
;
5888 sub
= gimple_fold_indirect_ref (sub
);
5890 sub
= build1 (INDIRECT_REF
, TREE_TYPE (subtype
), osub
);
5891 type_domain
= TYPE_DOMAIN (TREE_TYPE (sub
));
5892 if (type_domain
&& TYPE_MIN_VALUE (type_domain
))
5893 min_val
= TYPE_MIN_VALUE (type_domain
);
5894 if (TREE_CODE (min_val
) == INTEGER_CST
)
5895 return build4 (ARRAY_REF
, type
, sub
, min_val
, NULL_TREE
, NULL_TREE
);
5901 /* Return true if CODE is an operation that when operating on signed
5902 integer types involves undefined behavior on overflow and the
5903 operation can be expressed with unsigned arithmetic. */
5906 arith_code_with_undefined_signed_overflow (tree_code code
)
5914 case POINTER_PLUS_EXPR
:
5921 /* Rewrite STMT, an assignment with a signed integer or pointer arithmetic
5922 operation that can be transformed to unsigned arithmetic by converting
5923 its operand, carrying out the operation in the corresponding unsigned
5924 type and converting the result back to the original type.
5926 Returns a sequence of statements that replace STMT and also contain
5927 a modified form of STMT itself. */
5930 rewrite_to_defined_overflow (gimple
*stmt
)
5932 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
5934 fprintf (dump_file
, "rewriting stmt with undefined signed "
5936 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
5939 tree lhs
= gimple_assign_lhs (stmt
);
5940 tree type
= unsigned_type_for (TREE_TYPE (lhs
));
5941 gimple_seq stmts
= NULL
;
5942 for (unsigned i
= 1; i
< gimple_num_ops (stmt
); ++i
)
5944 tree op
= gimple_op (stmt
, i
);
5945 op
= gimple_convert (&stmts
, type
, op
);
5946 gimple_set_op (stmt
, i
, op
);
5948 gimple_assign_set_lhs (stmt
, make_ssa_name (type
, stmt
));
5949 if (gimple_assign_rhs_code (stmt
) == POINTER_PLUS_EXPR
)
5950 gimple_assign_set_rhs_code (stmt
, PLUS_EXPR
);
5951 gimple_seq_add_stmt (&stmts
, stmt
);
5952 gimple
*cvt
= gimple_build_assign (lhs
, NOP_EXPR
, gimple_assign_lhs (stmt
));
5953 gimple_seq_add_stmt (&stmts
, cvt
);
5959 /* The valueization hook we use for the gimple_build API simplification.
5960 This makes us match fold_buildN behavior by only combining with
5961 statements in the sequence(s) we are currently building. */
5964 gimple_build_valueize (tree op
)
5966 if (gimple_bb (SSA_NAME_DEF_STMT (op
)) == NULL
)
5971 /* Build the expression CODE OP0 of type TYPE with location LOC,
5972 simplifying it first if possible. Returns the built
5973 expression value and appends statements possibly defining it
5977 gimple_build (gimple_seq
*seq
, location_t loc
,
5978 enum tree_code code
, tree type
, tree op0
)
5980 tree res
= gimple_simplify (code
, type
, op0
, seq
, gimple_build_valueize
);
5983 if (gimple_in_ssa_p (cfun
))
5984 res
= make_ssa_name (type
);
5986 res
= create_tmp_reg (type
);
5988 if (code
== REALPART_EXPR
5989 || code
== IMAGPART_EXPR
5990 || code
== VIEW_CONVERT_EXPR
)
5991 stmt
= gimple_build_assign (res
, code
, build1 (code
, type
, op0
));
5993 stmt
= gimple_build_assign (res
, code
, op0
);
5994 gimple_set_location (stmt
, loc
);
5995 gimple_seq_add_stmt_without_update (seq
, stmt
);
6000 /* Build the expression OP0 CODE OP1 of type TYPE with location LOC,
6001 simplifying it first if possible. Returns the built
6002 expression value and appends statements possibly defining it
6006 gimple_build (gimple_seq
*seq
, location_t loc
,
6007 enum tree_code code
, tree type
, tree op0
, tree op1
)
6009 tree res
= gimple_simplify (code
, type
, op0
, op1
, seq
, gimple_build_valueize
);
6012 if (gimple_in_ssa_p (cfun
))
6013 res
= make_ssa_name (type
);
6015 res
= create_tmp_reg (type
);
6016 gimple
*stmt
= gimple_build_assign (res
, code
, op0
, op1
);
6017 gimple_set_location (stmt
, loc
);
6018 gimple_seq_add_stmt_without_update (seq
, stmt
);
6023 /* Build the expression (CODE OP0 OP1 OP2) of type TYPE with location LOC,
6024 simplifying it first if possible. Returns the built
6025 expression value and appends statements possibly defining it
6029 gimple_build (gimple_seq
*seq
, location_t loc
,
6030 enum tree_code code
, tree type
, tree op0
, tree op1
, tree op2
)
6032 tree res
= gimple_simplify (code
, type
, op0
, op1
, op2
,
6033 seq
, gimple_build_valueize
);
6036 if (gimple_in_ssa_p (cfun
))
6037 res
= make_ssa_name (type
);
6039 res
= create_tmp_reg (type
);
6041 if (code
== BIT_FIELD_REF
)
6042 stmt
= gimple_build_assign (res
, code
,
6043 build3 (code
, type
, op0
, op1
, op2
));
6045 stmt
= gimple_build_assign (res
, code
, op0
, op1
, op2
);
6046 gimple_set_location (stmt
, loc
);
6047 gimple_seq_add_stmt_without_update (seq
, stmt
);
6052 /* Build the call FN (ARG0) with a result of type TYPE
6053 (or no result if TYPE is void) with location LOC,
6054 simplifying it first if possible. Returns the built
6055 expression value (or NULL_TREE if TYPE is void) and appends
6056 statements possibly defining it to SEQ. */
6059 gimple_build (gimple_seq
*seq
, location_t loc
,
6060 enum built_in_function fn
, tree type
, tree arg0
)
6062 tree res
= gimple_simplify (fn
, type
, arg0
, seq
, gimple_build_valueize
);
6065 tree decl
= builtin_decl_implicit (fn
);
6066 gimple
*stmt
= gimple_build_call (decl
, 1, arg0
);
6067 if (!VOID_TYPE_P (type
))
6069 if (gimple_in_ssa_p (cfun
))
6070 res
= make_ssa_name (type
);
6072 res
= create_tmp_reg (type
);
6073 gimple_call_set_lhs (stmt
, res
);
6075 gimple_set_location (stmt
, loc
);
6076 gimple_seq_add_stmt_without_update (seq
, stmt
);
6081 /* Build the call FN (ARG0, ARG1) with a result of type TYPE
6082 (or no result if TYPE is void) with location LOC,
6083 simplifying it first if possible. Returns the built
6084 expression value (or NULL_TREE if TYPE is void) and appends
6085 statements possibly defining it to SEQ. */
6088 gimple_build (gimple_seq
*seq
, location_t loc
,
6089 enum built_in_function fn
, tree type
, tree arg0
, tree arg1
)
6091 tree res
= gimple_simplify (fn
, type
, arg0
, arg1
, seq
, gimple_build_valueize
);
6094 tree decl
= builtin_decl_implicit (fn
);
6095 gimple
*stmt
= gimple_build_call (decl
, 2, arg0
, arg1
);
6096 if (!VOID_TYPE_P (type
))
6098 if (gimple_in_ssa_p (cfun
))
6099 res
= make_ssa_name (type
);
6101 res
= create_tmp_reg (type
);
6102 gimple_call_set_lhs (stmt
, res
);
6104 gimple_set_location (stmt
, loc
);
6105 gimple_seq_add_stmt_without_update (seq
, stmt
);
6110 /* Build the call FN (ARG0, ARG1, ARG2) with a result of type TYPE
6111 (or no result if TYPE is void) with location LOC,
6112 simplifying it first if possible. Returns the built
6113 expression value (or NULL_TREE if TYPE is void) and appends
6114 statements possibly defining it to SEQ. */
6117 gimple_build (gimple_seq
*seq
, location_t loc
,
6118 enum built_in_function fn
, tree type
,
6119 tree arg0
, tree arg1
, tree arg2
)
6121 tree res
= gimple_simplify (fn
, type
, arg0
, arg1
, arg2
,
6122 seq
, gimple_build_valueize
);
6125 tree decl
= builtin_decl_implicit (fn
);
6126 gimple
*stmt
= gimple_build_call (decl
, 3, arg0
, arg1
, arg2
);
6127 if (!VOID_TYPE_P (type
))
6129 if (gimple_in_ssa_p (cfun
))
6130 res
= make_ssa_name (type
);
6132 res
= create_tmp_reg (type
);
6133 gimple_call_set_lhs (stmt
, res
);
6135 gimple_set_location (stmt
, loc
);
6136 gimple_seq_add_stmt_without_update (seq
, stmt
);
6141 /* Build the conversion (TYPE) OP with a result of type TYPE
6142 with location LOC if such conversion is neccesary in GIMPLE,
6143 simplifying it first.
6144 Returns the built expression value and appends
6145 statements possibly defining it to SEQ. */
6148 gimple_convert (gimple_seq
*seq
, location_t loc
, tree type
, tree op
)
6150 if (useless_type_conversion_p (type
, TREE_TYPE (op
)))
6152 return gimple_build (seq
, loc
, NOP_EXPR
, type
, op
);
6155 /* Build the conversion (ptrofftype) OP with a result of a type
6156 compatible with ptrofftype with location LOC if such conversion
6157 is neccesary in GIMPLE, simplifying it first.
6158 Returns the built expression value and appends
6159 statements possibly defining it to SEQ. */
6162 gimple_convert_to_ptrofftype (gimple_seq
*seq
, location_t loc
, tree op
)
6164 if (ptrofftype_p (TREE_TYPE (op
)))
6166 return gimple_convert (seq
, loc
, sizetype
, op
);
6169 /* Return true if the result of assignment STMT is known to be non-negative.
6170 If the return value is based on the assumption that signed overflow is
6171 undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
6172 *STRICT_OVERFLOW_P. DEPTH is the current nesting depth of the query. */
6175 gimple_assign_nonnegative_warnv_p (gimple
*stmt
, bool *strict_overflow_p
,
6178 enum tree_code code
= gimple_assign_rhs_code (stmt
);
6179 switch (get_gimple_rhs_class (code
))
6181 case GIMPLE_UNARY_RHS
:
6182 return tree_unary_nonnegative_warnv_p (gimple_assign_rhs_code (stmt
),
6183 gimple_expr_type (stmt
),
6184 gimple_assign_rhs1 (stmt
),
6185 strict_overflow_p
, depth
);
6186 case GIMPLE_BINARY_RHS
:
6187 return tree_binary_nonnegative_warnv_p (gimple_assign_rhs_code (stmt
),
6188 gimple_expr_type (stmt
),
6189 gimple_assign_rhs1 (stmt
),
6190 gimple_assign_rhs2 (stmt
),
6191 strict_overflow_p
, depth
);
6192 case GIMPLE_TERNARY_RHS
:
6194 case GIMPLE_SINGLE_RHS
:
6195 return tree_single_nonnegative_warnv_p (gimple_assign_rhs1 (stmt
),
6196 strict_overflow_p
, depth
);
6197 case GIMPLE_INVALID_RHS
:
6203 /* Return true if return value of call STMT is known to be non-negative.
6204 If the return value is based on the assumption that signed overflow is
6205 undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
6206 *STRICT_OVERFLOW_P. DEPTH is the current nesting depth of the query. */
6209 gimple_call_nonnegative_warnv_p (gimple
*stmt
, bool *strict_overflow_p
,
6212 tree arg0
= gimple_call_num_args (stmt
) > 0 ?
6213 gimple_call_arg (stmt
, 0) : NULL_TREE
;
6214 tree arg1
= gimple_call_num_args (stmt
) > 1 ?
6215 gimple_call_arg (stmt
, 1) : NULL_TREE
;
6217 return tree_call_nonnegative_warnv_p (gimple_expr_type (stmt
),
6218 gimple_call_combined_fn (stmt
),
6221 strict_overflow_p
, depth
);
6224 /* Return true if return value of call STMT is known to be non-negative.
6225 If the return value is based on the assumption that signed overflow is
6226 undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
6227 *STRICT_OVERFLOW_P. DEPTH is the current nesting depth of the query. */
6230 gimple_phi_nonnegative_warnv_p (gimple
*stmt
, bool *strict_overflow_p
,
6233 for (unsigned i
= 0; i
< gimple_phi_num_args (stmt
); ++i
)
6235 tree arg
= gimple_phi_arg_def (stmt
, i
);
6236 if (!tree_single_nonnegative_warnv_p (arg
, strict_overflow_p
, depth
+ 1))
6242 /* Return true if STMT is known to compute a non-negative value.
6243 If the return value is based on the assumption that signed overflow is
6244 undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
6245 *STRICT_OVERFLOW_P. DEPTH is the current nesting depth of the query. */
6248 gimple_stmt_nonnegative_warnv_p (gimple
*stmt
, bool *strict_overflow_p
,
6251 switch (gimple_code (stmt
))
6254 return gimple_assign_nonnegative_warnv_p (stmt
, strict_overflow_p
,
6257 return gimple_call_nonnegative_warnv_p (stmt
, strict_overflow_p
,
6260 return gimple_phi_nonnegative_warnv_p (stmt
, strict_overflow_p
,
6267 /* Return true if the floating-point value computed by assignment STMT
6268 is known to have an integer value. We also allow +Inf, -Inf and NaN
6269 to be considered integer values.
6271 DEPTH is the current nesting depth of the query. */
6274 gimple_assign_integer_valued_real_p (gimple
*stmt
, int depth
)
6276 enum tree_code code
= gimple_assign_rhs_code (stmt
);
6277 switch (get_gimple_rhs_class (code
))
6279 case GIMPLE_UNARY_RHS
:
6280 return integer_valued_real_unary_p (gimple_assign_rhs_code (stmt
),
6281 gimple_assign_rhs1 (stmt
), depth
);
6282 case GIMPLE_BINARY_RHS
:
6283 return integer_valued_real_binary_p (gimple_assign_rhs_code (stmt
),
6284 gimple_assign_rhs1 (stmt
),
6285 gimple_assign_rhs2 (stmt
), depth
);
6286 case GIMPLE_TERNARY_RHS
:
6288 case GIMPLE_SINGLE_RHS
:
6289 return integer_valued_real_single_p (gimple_assign_rhs1 (stmt
), depth
);
6290 case GIMPLE_INVALID_RHS
:
6296 /* Return true if the floating-point value computed by call STMT is known
6297 to have an integer value. We also allow +Inf, -Inf and NaN to be
6298 considered integer values.
6300 DEPTH is the current nesting depth of the query. */
6303 gimple_call_integer_valued_real_p (gimple
*stmt
, int depth
)
6305 tree arg0
= (gimple_call_num_args (stmt
) > 0
6306 ? gimple_call_arg (stmt
, 0)
6308 tree arg1
= (gimple_call_num_args (stmt
) > 1
6309 ? gimple_call_arg (stmt
, 1)
6311 return integer_valued_real_call_p (gimple_call_combined_fn (stmt
),
6315 /* Return true if the floating-point result of phi STMT is known to have
6316 an integer value. We also allow +Inf, -Inf and NaN to be considered
6319 DEPTH is the current nesting depth of the query. */
6322 gimple_phi_integer_valued_real_p (gimple
*stmt
, int depth
)
6324 for (unsigned i
= 0; i
< gimple_phi_num_args (stmt
); ++i
)
6326 tree arg
= gimple_phi_arg_def (stmt
, i
);
6327 if (!integer_valued_real_single_p (arg
, depth
+ 1))
6333 /* Return true if the floating-point value computed by STMT is known
6334 to have an integer value. We also allow +Inf, -Inf and NaN to be
6335 considered integer values.
6337 DEPTH is the current nesting depth of the query. */
6340 gimple_stmt_integer_valued_real_p (gimple
*stmt
, int depth
)
6342 switch (gimple_code (stmt
))
6345 return gimple_assign_integer_valued_real_p (stmt
, depth
);
6347 return gimple_call_integer_valued_real_p (stmt
, depth
);
6349 return gimple_phi_integer_valued_real_p (stmt
, depth
);