1 /* Callgraph based analysis of static variables.
2 Copyright (C) 2004-2018 Free Software Foundation, Inc.
3 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 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/>. */
21 /* This file marks functions as being either const (TREE_READONLY) or
22 pure (DECL_PURE_P). It can also set a variant of these that
23 are allowed to loop indefinitely (DECL_LOOPING_CONST_PURE_P).
25 This must be run after inlining decisions have been made since
26 otherwise, the local sets will not contain information that is
27 consistent with post inlined state. The global sets are not prone
28 to this problem since they are by definition transitive. */
30 /* The code in this module is called by the ipa pass manager. It
31 should be one of the later passes since it's information is used by
32 the rest of the compilation. */
36 #include "coretypes.h"
41 #include "tree-pass.h"
42 #include "tree-streamer.h"
44 #include "diagnostic.h"
48 #include "gimple-iterator.h"
49 #include "gimple-walk.h"
51 #include "tree-ssa-loop-niter.h"
52 #include "langhooks.h"
53 #include "ipa-utils.h"
54 #include "gimple-pretty-print.h"
56 #include "tree-scalar-evolution.h"
60 #include "alloc-pool.h"
61 #include "symbol-summary.h"
63 #include "ipa-fnsummary.h"
65 /* Lattice values for const and pure functions. Everything starts out
66 being const, then may drop to pure and then neither depending on
68 enum pure_const_state_e
75 static const char *pure_const_names
[3] = {"const", "pure", "neither"};
84 static const char *malloc_state_names
[] = {"malloc_top", "malloc", "malloc_bottom"};
86 /* Holder for the const_state. There is one of these per function
91 enum pure_const_state_e pure_const_state
;
92 /* What user set here; we can be always sure about this. */
93 enum pure_const_state_e state_previously_known
;
94 bool looping_previously_known
;
96 /* True if the function could possibly infinite loop. There are a
97 lot of ways that this could be determined. We are pretty
98 conservative here. While it is possible to cse pure and const
99 calls, it is not legal to have dce get rid of the call if there
100 is a possibility that the call could infinite loop since this is
101 a behavioral change. */
106 /* If function can call free, munmap or otherwise make previously
107 non-trapping memory accesses trapping. */
110 enum malloc_state_e malloc_state
;
113 /* State used when we know nothing about function. */
114 static struct funct_state_d varying_state
115 = { IPA_NEITHER
, IPA_NEITHER
, true, true, true, true, STATE_MALLOC_BOTTOM
};
118 typedef struct funct_state_d
* funct_state
;
120 /* The storage of the funct_state is abstracted because there is the
121 possibility that it may be desirable to move this to the cgraph
124 /* Array, indexed by cgraph node uid, of function states. */
126 static vec
<funct_state
> funct_state_vec
;
128 static bool gate_pure_const (void);
132 const pass_data pass_data_ipa_pure_const
=
135 "pure-const", /* name */
136 OPTGROUP_NONE
, /* optinfo_flags */
137 TV_IPA_PURE_CONST
, /* tv_id */
138 0, /* properties_required */
139 0, /* properties_provided */
140 0, /* properties_destroyed */
141 0, /* todo_flags_start */
142 0, /* todo_flags_finish */
145 class pass_ipa_pure_const
: public ipa_opt_pass_d
148 pass_ipa_pure_const(gcc::context
*ctxt
);
150 /* opt_pass methods: */
151 bool gate (function
*) { return gate_pure_const (); }
152 unsigned int execute (function
*fun
);
154 void register_hooks (void);
159 /* Holders of ipa cgraph hooks: */
160 struct cgraph_node_hook_list
*function_insertion_hook_holder
;
161 struct cgraph_2node_hook_list
*node_duplication_hook_holder
;
162 struct cgraph_node_hook_list
*node_removal_hook_holder
;
164 }; // class pass_ipa_pure_const
168 /* Try to guess if function body will always be visible to compiler
169 when compiling the call and whether compiler will be able
170 to propagate the information by itself. */
173 function_always_visible_to_compiler_p (tree decl
)
175 return (!TREE_PUBLIC (decl
) || DECL_DECLARED_INLINE_P (decl
)
176 || DECL_COMDAT (decl
));
179 /* Emit suggestion about attribute ATTRIB_NAME for DECL. KNOWN_FINITE
180 is true if the function is known to be finite. The diagnostic is
181 controlled by OPTION. WARNED_ABOUT is a hash_set<tree> unique for
182 OPTION, this function may initialize it and it is always returned
185 static hash_set
<tree
> *
186 suggest_attribute (int option
, tree decl
, bool known_finite
,
187 hash_set
<tree
> *warned_about
,
188 const char * attrib_name
)
190 if (!option_enabled (option
, &global_options
))
192 if (TREE_THIS_VOLATILE (decl
)
193 || (known_finite
&& function_always_visible_to_compiler_p (decl
)))
197 warned_about
= new hash_set
<tree
>;
198 if (warned_about
->contains (decl
))
200 warned_about
->add (decl
);
201 warning_at (DECL_SOURCE_LOCATION (decl
),
204 ? G_("function might be candidate for attribute %qs")
205 : G_("function might be candidate for attribute %qs"
206 " if it is known to return normally"), attrib_name
);
210 /* Emit suggestion about __attribute_((pure)) for DECL. KNOWN_FINITE
211 is true if the function is known to be finite. */
214 warn_function_pure (tree decl
, bool known_finite
)
216 /* Declaring a void function pure makes no sense and is diagnosed
217 by -Wattributes because calling it would have no effect. */
218 if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl
))))
221 static hash_set
<tree
> *warned_about
;
223 = suggest_attribute (OPT_Wsuggest_attribute_pure
, decl
,
224 known_finite
, warned_about
, "pure");
227 /* Emit suggestion about __attribute_((const)) for DECL. KNOWN_FINITE
228 is true if the function is known to be finite. */
231 warn_function_const (tree decl
, bool known_finite
)
233 /* Declaring a void function const makes no sense is diagnosed
234 by -Wattributes because calling it would have no effect. */
235 if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl
))))
238 static hash_set
<tree
> *warned_about
;
240 = suggest_attribute (OPT_Wsuggest_attribute_const
, decl
,
241 known_finite
, warned_about
, "const");
244 /* Emit suggestion about __attribute__((malloc)) for DECL. */
247 warn_function_malloc (tree decl
)
249 static hash_set
<tree
> *warned_about
;
251 = suggest_attribute (OPT_Wsuggest_attribute_malloc
, decl
,
252 false, warned_about
, "malloc");
255 /* Emit suggestion about __attribute__((noreturn)) for DECL. */
258 warn_function_noreturn (tree decl
)
260 tree original_decl
= decl
;
262 cgraph_node
*node
= cgraph_node::get (decl
);
263 if (node
->instrumentation_clone
)
264 decl
= node
->instrumented_version
->decl
;
266 static hash_set
<tree
> *warned_about
;
267 if (!lang_hooks
.missing_noreturn_ok_p (decl
)
268 && targetm
.warn_func_return (decl
))
270 = suggest_attribute (OPT_Wsuggest_attribute_noreturn
, original_decl
,
271 true, warned_about
, "noreturn");
275 warn_function_cold (tree decl
)
277 tree original_decl
= decl
;
279 cgraph_node
*node
= cgraph_node::get (decl
);
280 if (node
->instrumentation_clone
)
281 decl
= node
->instrumented_version
->decl
;
283 static hash_set
<tree
> *warned_about
;
285 = suggest_attribute (OPT_Wsuggest_attribute_cold
, original_decl
,
286 true, warned_about
, "cold");
289 /* Return true if we have a function state for NODE. */
292 has_function_state (struct cgraph_node
*node
)
294 if (!funct_state_vec
.exists ()
295 || funct_state_vec
.length () <= (unsigned int)node
->uid
)
297 return funct_state_vec
[node
->uid
] != NULL
;
300 /* Return the function state from NODE. */
302 static inline funct_state
303 get_function_state (struct cgraph_node
*node
)
305 if (!funct_state_vec
.exists ()
306 || funct_state_vec
.length () <= (unsigned int)node
->uid
307 || !funct_state_vec
[node
->uid
])
308 /* We might want to put correct previously_known state into varying. */
309 return &varying_state
;
310 return funct_state_vec
[node
->uid
];
313 /* Set the function state S for NODE. */
316 set_function_state (struct cgraph_node
*node
, funct_state s
)
318 if (!funct_state_vec
.exists ()
319 || funct_state_vec
.length () <= (unsigned int)node
->uid
)
320 funct_state_vec
.safe_grow_cleared (node
->uid
+ 1);
322 /* If funct_state_vec already contains a funct_state, we have to release
323 it before it's going to be ovewritten. */
324 if (funct_state_vec
[node
->uid
] != NULL
325 && funct_state_vec
[node
->uid
] != &varying_state
)
326 free (funct_state_vec
[node
->uid
]);
328 funct_state_vec
[node
->uid
] = s
;
331 /* Check to see if the use (or definition when CHECKING_WRITE is true)
332 variable T is legal in a function that is either pure or const. */
335 check_decl (funct_state local
,
336 tree t
, bool checking_write
, bool ipa
)
338 /* Do not want to do anything with volatile except mark any
339 function that uses one to be not const or pure. */
340 if (TREE_THIS_VOLATILE (t
))
342 local
->pure_const_state
= IPA_NEITHER
;
344 fprintf (dump_file
, " Volatile operand is not const/pure\n");
348 /* Do not care about a local automatic that is not static. */
349 if (!TREE_STATIC (t
) && !DECL_EXTERNAL (t
))
352 /* If the variable has the "used" attribute, treat it as if it had a
353 been touched by the devil. */
354 if (DECL_PRESERVE_P (t
))
356 local
->pure_const_state
= IPA_NEITHER
;
358 fprintf (dump_file
, " Used static/global variable is not const/pure\n");
362 /* In IPA mode we are not interested in checking actual loads and stores;
363 they will be processed at propagation time using ipa_ref. */
367 /* Since we have dealt with the locals and params cases above, if we
368 are CHECKING_WRITE, this cannot be a pure or constant
372 local
->pure_const_state
= IPA_NEITHER
;
374 fprintf (dump_file
, " static/global memory write is not const/pure\n");
378 if (DECL_EXTERNAL (t
) || TREE_PUBLIC (t
))
380 /* Readonly reads are safe. */
381 if (TREE_READONLY (t
) && !TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (t
)))
382 return; /* Read of a constant, do not change the function state. */
386 fprintf (dump_file
, " global memory read is not const\n");
387 /* Just a regular read. */
388 if (local
->pure_const_state
== IPA_CONST
)
389 local
->pure_const_state
= IPA_PURE
;
394 /* Compilation level statics can be read if they are readonly
396 if (TREE_READONLY (t
))
400 fprintf (dump_file
, " static memory read is not const\n");
401 /* Just a regular read. */
402 if (local
->pure_const_state
== IPA_CONST
)
403 local
->pure_const_state
= IPA_PURE
;
408 /* Check to see if the use (or definition when CHECKING_WRITE is true)
409 variable T is legal in a function that is either pure or const. */
412 check_op (funct_state local
, tree t
, bool checking_write
)
414 t
= get_base_address (t
);
415 if (t
&& TREE_THIS_VOLATILE (t
))
417 local
->pure_const_state
= IPA_NEITHER
;
419 fprintf (dump_file
, " Volatile indirect ref is not const/pure\n");
423 && (INDIRECT_REF_P (t
) || TREE_CODE (t
) == MEM_REF
)
424 && TREE_CODE (TREE_OPERAND (t
, 0)) == SSA_NAME
425 && !ptr_deref_may_alias_global_p (TREE_OPERAND (t
, 0)))
428 fprintf (dump_file
, " Indirect ref to local memory is OK\n");
431 else if (checking_write
)
433 local
->pure_const_state
= IPA_NEITHER
;
435 fprintf (dump_file
, " Indirect ref write is not const/pure\n");
441 fprintf (dump_file
, " Indirect ref read is not const\n");
442 if (local
->pure_const_state
== IPA_CONST
)
443 local
->pure_const_state
= IPA_PURE
;
447 /* compute state based on ECF FLAGS and store to STATE and LOOPING. */
450 state_from_flags (enum pure_const_state_e
*state
, bool *looping
,
451 int flags
, bool cannot_lead_to_return
)
454 if (flags
& ECF_LOOPING_CONST_OR_PURE
)
457 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
458 fprintf (dump_file
, " looping\n");
460 if (flags
& ECF_CONST
)
463 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
464 fprintf (dump_file
, " const\n");
466 else if (flags
& ECF_PURE
)
469 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
470 fprintf (dump_file
, " pure\n");
472 else if (cannot_lead_to_return
)
476 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
477 fprintf (dump_file
, " ignoring side effects->pure looping\n");
481 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
482 fprintf (dump_file
, " neither\n");
483 *state
= IPA_NEITHER
;
488 /* Merge STATE and STATE2 and LOOPING and LOOPING2 and store
489 into STATE and LOOPING better of the two variants.
490 Be sure to merge looping correctly. IPA_NEITHER functions
491 have looping 0 even if they don't have to return. */
494 better_state (enum pure_const_state_e
*state
, bool *looping
,
495 enum pure_const_state_e state2
, bool looping2
)
499 if (*state
== IPA_NEITHER
)
502 *looping
= MIN (*looping
, looping2
);
505 else if (state2
!= IPA_NEITHER
)
506 *looping
= MIN (*looping
, looping2
);
509 /* Merge STATE and STATE2 and LOOPING and LOOPING2 and store
510 into STATE and LOOPING worse of the two variants.
511 N is the actual node called. */
514 worse_state (enum pure_const_state_e
*state
, bool *looping
,
515 enum pure_const_state_e state2
, bool looping2
,
516 struct symtab_node
*from
,
517 struct symtab_node
*to
)
519 /* Consider function:
526 During early optimization we will turn this into:
533 Now if this function will be detected as CONST however when interposed it
534 may end up being just pure. We always must assume the worst scenario here.
536 if (*state
== IPA_CONST
&& state2
== IPA_CONST
537 && to
&& !TREE_READONLY (to
->decl
) && !to
->binds_to_current_def_p (from
))
539 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
540 fprintf (dump_file
, "Dropping state to PURE because call to %s may not "
541 "bind to current def.\n", to
->name ());
544 *state
= MAX (*state
, state2
);
545 *looping
= MAX (*looping
, looping2
);
548 /* Recognize special cases of builtins that are by themselves not pure or const
549 but function using them is. */
551 special_builtin_state (enum pure_const_state_e
*state
, bool *looping
,
554 if (DECL_BUILT_IN_CLASS (callee
) == BUILT_IN_NORMAL
)
555 switch (DECL_FUNCTION_CODE (callee
))
557 case BUILT_IN_RETURN
:
558 case BUILT_IN_UNREACHABLE
:
559 CASE_BUILT_IN_ALLOCA
:
560 case BUILT_IN_STACK_SAVE
:
561 case BUILT_IN_STACK_RESTORE
:
562 case BUILT_IN_EH_POINTER
:
563 case BUILT_IN_EH_FILTER
:
564 case BUILT_IN_UNWIND_RESUME
:
565 case BUILT_IN_CXA_END_CLEANUP
:
566 case BUILT_IN_EH_COPY_VALUES
:
567 case BUILT_IN_FRAME_ADDRESS
:
569 case BUILT_IN_APPLY_ARGS
:
570 case BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT
:
571 case BUILT_IN_ASAN_AFTER_DYNAMIC_INIT
:
575 case BUILT_IN_PREFETCH
:
585 /* Check the parameters of a function call to CALL_EXPR to see if
586 there are any references in the parameters that are not allowed for
587 pure or const functions. Also check to see if this is either an
588 indirect call, a call outside the compilation unit, or has special
589 attributes that may also effect the purity. The CALL_EXPR node for
590 the entire call expression. */
593 check_call (funct_state local
, gcall
*call
, bool ipa
)
595 int flags
= gimple_call_flags (call
);
596 tree callee_t
= gimple_call_fndecl (call
);
597 bool possibly_throws
= stmt_could_throw_p (call
);
598 bool possibly_throws_externally
= (possibly_throws
599 && stmt_can_throw_external (call
));
604 for (i
= 0; i
< gimple_num_ops (call
); i
++)
605 if (gimple_op (call
, i
)
606 && tree_could_throw_p (gimple_op (call
, i
)))
608 if (possibly_throws
&& cfun
->can_throw_non_call_exceptions
)
611 fprintf (dump_file
, " operand can throw; looping\n");
612 local
->looping
= true;
614 if (possibly_throws_externally
)
617 fprintf (dump_file
, " operand can throw externally\n");
618 local
->can_throw
= true;
623 /* The const and pure flags are set by a variety of places in the
624 compiler (including here). If someone has already set the flags
625 for the callee, (such as for some of the builtins) we will use
626 them, otherwise we will compute our own information.
628 Const and pure functions have less clobber effects than other
629 functions so we process these first. Otherwise if it is a call
630 outside the compilation unit or an indirect call we punt. This
631 leaves local calls which will be processed by following the call
635 enum pure_const_state_e call_state
;
638 if (gimple_call_builtin_p (call
, BUILT_IN_NORMAL
)
639 && !nonfreeing_call_p (call
))
640 local
->can_free
= true;
642 if (special_builtin_state (&call_state
, &call_looping
, callee_t
))
644 worse_state (&local
->pure_const_state
, &local
->looping
,
645 call_state
, call_looping
,
649 /* When bad things happen to bad functions, they cannot be const
651 if (setjmp_call_p (callee_t
))
654 fprintf (dump_file
, " setjmp is not const/pure\n");
655 local
->looping
= true;
656 local
->pure_const_state
= IPA_NEITHER
;
659 if (DECL_BUILT_IN_CLASS (callee_t
) == BUILT_IN_NORMAL
)
660 switch (DECL_FUNCTION_CODE (callee_t
))
662 case BUILT_IN_LONGJMP
:
663 case BUILT_IN_NONLOCAL_GOTO
:
665 fprintf (dump_file
, " longjmp and nonlocal goto is not const/pure\n");
666 local
->pure_const_state
= IPA_NEITHER
;
667 local
->looping
= true;
673 else if (gimple_call_internal_p (call
) && !nonfreeing_call_p (call
))
674 local
->can_free
= true;
676 /* When not in IPA mode, we can still handle self recursion. */
678 && recursive_call_p (current_function_decl
, callee_t
))
681 fprintf (dump_file
, " Recursive call can loop.\n");
682 local
->looping
= true;
684 /* Either callee is unknown or we are doing local analysis.
685 Look to see if there are any bits available for the callee (such as by
686 declaration or because it is builtin) and process solely on the basis of
687 those bits. Handle internal calls always, those calls don't have
688 corresponding cgraph edges and thus aren't processed during
690 else if (!ipa
|| gimple_call_internal_p (call
))
692 enum pure_const_state_e call_state
;
694 if (possibly_throws
&& cfun
->can_throw_non_call_exceptions
)
697 fprintf (dump_file
, " can throw; looping\n");
698 local
->looping
= true;
700 if (possibly_throws_externally
)
704 fprintf (dump_file
, " can throw externally to lp %i\n",
705 lookup_stmt_eh_lp (call
));
707 fprintf (dump_file
, " callee:%s\n",
708 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (callee_t
)));
710 local
->can_throw
= true;
712 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
713 fprintf (dump_file
, " checking flags for call:");
714 state_from_flags (&call_state
, &call_looping
, flags
,
715 ((flags
& (ECF_NORETURN
| ECF_NOTHROW
))
716 == (ECF_NORETURN
| ECF_NOTHROW
))
717 || (!flag_exceptions
&& (flags
& ECF_NORETURN
)));
718 worse_state (&local
->pure_const_state
, &local
->looping
,
719 call_state
, call_looping
, NULL
, NULL
);
721 /* Direct functions calls are handled by IPA propagation. */
724 /* Wrapper around check_decl for loads in local more. */
727 check_load (gimple
*, tree op
, tree
, void *data
)
730 check_decl ((funct_state
)data
, op
, false, false);
732 check_op ((funct_state
)data
, op
, false);
736 /* Wrapper around check_decl for stores in local more. */
739 check_store (gimple
*, tree op
, tree
, void *data
)
742 check_decl ((funct_state
)data
, op
, true, false);
744 check_op ((funct_state
)data
, op
, true);
748 /* Wrapper around check_decl for loads in ipa mode. */
751 check_ipa_load (gimple
*, tree op
, tree
, void *data
)
754 check_decl ((funct_state
)data
, op
, false, true);
756 check_op ((funct_state
)data
, op
, false);
760 /* Wrapper around check_decl for stores in ipa mode. */
763 check_ipa_store (gimple
*, tree op
, tree
, void *data
)
766 check_decl ((funct_state
)data
, op
, true, true);
768 check_op ((funct_state
)data
, op
, true);
772 /* Look into pointer pointed to by GSIP and figure out what interesting side
775 check_stmt (gimple_stmt_iterator
*gsip
, funct_state local
, bool ipa
)
777 gimple
*stmt
= gsi_stmt (*gsip
);
779 if (is_gimple_debug (stmt
))
782 /* Do consider clobber as side effects before IPA, so we rather inline
783 C++ destructors and keep clobber semantics than eliminate them.
785 TODO: We may get smarter during early optimizations on these and let
786 functions containing only clobbers to be optimized more. This is a common
787 case of C++ destructors. */
789 if ((ipa
|| cfun
->after_inlining
) && gimple_clobber_p (stmt
))
794 fprintf (dump_file
, " scanning: ");
795 print_gimple_stmt (dump_file
, stmt
, 0);
798 if (gimple_has_volatile_ops (stmt
)
799 && !gimple_clobber_p (stmt
))
801 local
->pure_const_state
= IPA_NEITHER
;
803 fprintf (dump_file
, " Volatile stmt is not const/pure\n");
806 /* Look for loads and stores. */
807 walk_stmt_load_store_ops (stmt
, local
,
808 ipa
? check_ipa_load
: check_load
,
809 ipa
? check_ipa_store
: check_store
);
811 if (gimple_code (stmt
) != GIMPLE_CALL
812 && stmt_could_throw_p (stmt
))
814 if (cfun
->can_throw_non_call_exceptions
)
817 fprintf (dump_file
, " can throw; looping\n");
818 local
->looping
= true;
820 if (stmt_can_throw_external (stmt
))
823 fprintf (dump_file
, " can throw externally\n");
824 local
->can_throw
= true;
828 fprintf (dump_file
, " can throw\n");
830 switch (gimple_code (stmt
))
833 check_call (local
, as_a
<gcall
*> (stmt
), ipa
);
836 if (DECL_NONLOCAL (gimple_label_label (as_a
<glabel
*> (stmt
))))
837 /* Target of long jump. */
840 fprintf (dump_file
, " nonlocal label is not const/pure\n");
841 local
->pure_const_state
= IPA_NEITHER
;
845 if (gimple_asm_clobbers_memory_p (as_a
<gasm
*> (stmt
)))
848 fprintf (dump_file
, " memory asm clobber is not const/pure\n");
849 /* Abandon all hope, ye who enter here. */
850 local
->pure_const_state
= IPA_NEITHER
;
851 local
->can_free
= true;
853 if (gimple_asm_volatile_p (as_a
<gasm
*> (stmt
)))
856 fprintf (dump_file
, " volatile is not const/pure\n");
857 /* Abandon all hope, ye who enter here. */
858 local
->pure_const_state
= IPA_NEITHER
;
859 local
->looping
= true;
860 local
->can_free
= true;
868 /* Check that RETVAL is used only in STMT and in comparisons against 0.
869 RETVAL is return value of the function and STMT is return stmt. */
872 check_retval_uses (tree retval
, gimple
*stmt
)
874 imm_use_iterator use_iter
;
877 FOR_EACH_IMM_USE_STMT (use_stmt
, use_iter
, retval
)
878 if (gcond
*cond
= dyn_cast
<gcond
*> (use_stmt
))
880 tree op2
= gimple_cond_rhs (cond
);
881 if (!integer_zerop (op2
))
882 RETURN_FROM_IMM_USE_STMT (use_iter
, false);
884 else if (gassign
*ga
= dyn_cast
<gassign
*> (use_stmt
))
886 enum tree_code code
= gimple_assign_rhs_code (ga
);
887 if (TREE_CODE_CLASS (code
) != tcc_comparison
)
888 RETURN_FROM_IMM_USE_STMT (use_iter
, false);
889 if (!integer_zerop (gimple_assign_rhs2 (ga
)))
890 RETURN_FROM_IMM_USE_STMT (use_iter
, false);
892 else if (is_gimple_debug (use_stmt
))
894 else if (use_stmt
!= stmt
)
895 RETURN_FROM_IMM_USE_STMT (use_iter
, false);
900 /* malloc_candidate_p() checks if FUN can possibly be annotated with malloc
901 attribute. Currently this function does a very conservative analysis.
902 FUN is considered to be a candidate if
903 1) It returns a value of pointer type.
904 2) SSA_NAME_DEF_STMT (return_value) is either a function call or
905 a phi, and element of phi is either NULL or
906 SSA_NAME_DEF_STMT(element) is function call.
907 3) The return-value has immediate uses only within comparisons (gcond or gassign)
908 and return_stmt (and likewise a phi arg has immediate use only within comparison
912 malloc_candidate_p (function
*fun
, bool ipa
)
914 basic_block exit_block
= EXIT_BLOCK_PTR_FOR_FN (fun
);
917 cgraph_node
*node
= cgraph_node::get_create (fun
->decl
);
919 #define DUMP_AND_RETURN(reason) \
921 if (dump_file && (dump_flags & TDF_DETAILS)) \
922 fprintf (dump_file, "%s", (reason)); \
926 if (EDGE_COUNT (exit_block
->preds
) == 0)
929 FOR_EACH_EDGE (e
, ei
, exit_block
->preds
)
931 gimple_stmt_iterator gsi
= gsi_last_bb (e
->src
);
932 greturn
*ret_stmt
= dyn_cast
<greturn
*> (gsi_stmt (gsi
));
937 tree retval
= gimple_return_retval (ret_stmt
);
939 DUMP_AND_RETURN("No return value.")
941 if (TREE_CODE (retval
) != SSA_NAME
942 || TREE_CODE (TREE_TYPE (retval
)) != POINTER_TYPE
)
943 DUMP_AND_RETURN("Return value is not SSA_NAME or not a pointer type.")
945 if (!check_retval_uses (retval
, ret_stmt
))
946 DUMP_AND_RETURN("Return value has uses outside return stmt"
947 " and comparisons against 0.")
949 gimple
*def
= SSA_NAME_DEF_STMT (retval
);
950 if (gcall
*call_stmt
= dyn_cast
<gcall
*> (def
))
952 tree callee_decl
= gimple_call_fndecl (call_stmt
);
956 if (!ipa
&& !DECL_IS_MALLOC (callee_decl
))
957 DUMP_AND_RETURN("callee_decl does not have malloc attribute for"
960 cgraph_edge
*cs
= node
->get_edge (call_stmt
);
963 ipa_call_summary
*es
= ipa_call_summaries
->get (cs
);
965 es
->is_return_callee_uncaptured
= true;
969 else if (gphi
*phi
= dyn_cast
<gphi
*> (def
))
970 for (unsigned i
= 0; i
< gimple_phi_num_args (phi
); ++i
)
972 tree arg
= gimple_phi_arg_def (phi
, i
);
973 if (TREE_CODE (arg
) != SSA_NAME
)
974 DUMP_AND_RETURN("phi arg is not SSA_NAME.")
975 if (!(arg
== null_pointer_node
|| check_retval_uses (arg
, phi
)))
976 DUMP_AND_RETURN("phi arg has uses outside phi"
977 " and comparisons against 0.")
979 gimple
*arg_def
= SSA_NAME_DEF_STMT (arg
);
980 gcall
*call_stmt
= dyn_cast
<gcall
*> (arg_def
);
983 tree callee_decl
= gimple_call_fndecl (call_stmt
);
986 if (!ipa
&& !DECL_IS_MALLOC (callee_decl
))
987 DUMP_AND_RETURN("callee_decl does not have malloc attribute for"
990 cgraph_edge
*cs
= node
->get_edge (call_stmt
);
993 ipa_call_summary
*es
= ipa_call_summaries
->get (cs
);
995 es
->is_return_callee_uncaptured
= true;
1000 DUMP_AND_RETURN("def_stmt of return value is not a call or phi-stmt.")
1003 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1004 fprintf (dump_file
, "\nFound %s to be candidate for malloc attribute\n",
1005 IDENTIFIER_POINTER (DECL_NAME (fun
->decl
)));
1008 #undef DUMP_AND_RETURN
1012 /* This is the main routine for finding the reference patterns for
1013 global variables within a function FN. */
1016 analyze_function (struct cgraph_node
*fn
, bool ipa
)
1018 tree decl
= fn
->decl
;
1020 basic_block this_block
;
1022 l
= XCNEW (struct funct_state_d
);
1023 l
->pure_const_state
= IPA_CONST
;
1024 l
->state_previously_known
= IPA_NEITHER
;
1025 l
->looping_previously_known
= true;
1027 l
->can_throw
= false;
1028 l
->can_free
= false;
1029 state_from_flags (&l
->state_previously_known
, &l
->looping_previously_known
,
1030 flags_from_decl_or_type (fn
->decl
),
1031 fn
->cannot_return_p ());
1033 if (fn
->thunk
.thunk_p
|| fn
->alias
)
1035 /* Thunk gets propagated through, so nothing interesting happens. */
1037 if (fn
->thunk
.thunk_p
&& fn
->thunk
.virtual_offset_p
)
1038 l
->pure_const_state
= IPA_NEITHER
;
1044 fprintf (dump_file
, "\n\n local analysis of %s\n ",
1048 push_cfun (DECL_STRUCT_FUNCTION (decl
));
1050 FOR_EACH_BB_FN (this_block
, cfun
)
1052 gimple_stmt_iterator gsi
;
1053 struct walk_stmt_info wi
;
1055 memset (&wi
, 0, sizeof (wi
));
1056 for (gsi
= gsi_start_bb (this_block
);
1060 check_stmt (&gsi
, l
, ipa
);
1061 if (l
->pure_const_state
== IPA_NEITHER
1070 if (l
->pure_const_state
!= IPA_NEITHER
)
1072 /* Const functions cannot have back edges (an
1073 indication of possible infinite loop side
1075 if (mark_dfs_back_edges ())
1077 /* Preheaders are needed for SCEV to work.
1078 Simple latches and recorded exits improve chances that loop will
1079 proved to be finite in testcases such as in loop-15.c
1081 loop_optimizer_init (LOOPS_HAVE_PREHEADERS
1082 | LOOPS_HAVE_SIMPLE_LATCHES
1083 | LOOPS_HAVE_RECORDED_EXITS
);
1084 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1085 flow_loops_dump (dump_file
, NULL
, 0);
1086 if (mark_irreducible_loops ())
1089 fprintf (dump_file
, " has irreducible loops\n");
1096 FOR_EACH_LOOP (loop
, 0)
1097 if (!finite_loop_p (loop
))
1100 fprintf (dump_file
, " can not prove finiteness of "
1101 "loop %i\n", loop
->num
);
1107 loop_optimizer_finalize ();
1111 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1112 fprintf (dump_file
, " checking previously known:");
1114 better_state (&l
->pure_const_state
, &l
->looping
,
1115 l
->state_previously_known
,
1116 l
->looping_previously_known
);
1117 if (TREE_NOTHROW (decl
))
1118 l
->can_throw
= false;
1120 l
->malloc_state
= STATE_MALLOC_BOTTOM
;
1121 if (DECL_IS_MALLOC (decl
))
1122 l
->malloc_state
= STATE_MALLOC
;
1123 else if (ipa
&& malloc_candidate_p (DECL_STRUCT_FUNCTION (decl
), true))
1124 l
->malloc_state
= STATE_MALLOC_TOP
;
1125 else if (malloc_candidate_p (DECL_STRUCT_FUNCTION (decl
), false))
1126 l
->malloc_state
= STATE_MALLOC
;
1132 fprintf (dump_file
, "Function is locally looping.\n");
1134 fprintf (dump_file
, "Function is locally throwing.\n");
1135 if (l
->pure_const_state
== IPA_CONST
)
1136 fprintf (dump_file
, "Function is locally const.\n");
1137 if (l
->pure_const_state
== IPA_PURE
)
1138 fprintf (dump_file
, "Function is locally pure.\n");
1140 fprintf (dump_file
, "Function can locally free.\n");
1141 if (l
->malloc_state
== STATE_MALLOC
)
1142 fprintf (dump_file
, "Function is locally malloc.\n");
1147 /* Called when new function is inserted to callgraph late. */
1149 add_new_function (struct cgraph_node
*node
, void *data ATTRIBUTE_UNUSED
)
1151 /* There are some shared nodes, in particular the initializers on
1152 static declarations. We do not need to scan them more than once
1153 since all we would be interested in are the addressof
1155 if (opt_for_fn (node
->decl
, flag_ipa_pure_const
))
1156 set_function_state (node
, analyze_function (node
, true));
1159 /* Called when new clone is inserted to callgraph late. */
1162 duplicate_node_data (struct cgraph_node
*src
, struct cgraph_node
*dst
,
1163 void *data ATTRIBUTE_UNUSED
)
1165 if (has_function_state (src
))
1167 funct_state l
= XNEW (struct funct_state_d
);
1168 gcc_assert (!has_function_state (dst
));
1169 memcpy (l
, get_function_state (src
), sizeof (*l
));
1170 set_function_state (dst
, l
);
1174 /* Called when new clone is inserted to callgraph late. */
1177 remove_node_data (struct cgraph_node
*node
, void *data ATTRIBUTE_UNUSED
)
1179 if (has_function_state (node
))
1180 set_function_state (node
, NULL
);
1185 pass_ipa_pure_const::
1186 register_hooks (void)
1193 node_removal_hook_holder
=
1194 symtab
->add_cgraph_removal_hook (&remove_node_data
, NULL
);
1195 node_duplication_hook_holder
=
1196 symtab
->add_cgraph_duplication_hook (&duplicate_node_data
, NULL
);
1197 function_insertion_hook_holder
=
1198 symtab
->add_cgraph_insertion_hook (&add_new_function
, NULL
);
1202 /* Analyze each function in the cgraph to see if it is locally PURE or
1206 pure_const_generate_summary (void)
1208 struct cgraph_node
*node
;
1210 pass_ipa_pure_const
*pass
= static_cast <pass_ipa_pure_const
*> (current_pass
);
1211 pass
->register_hooks ();
1213 /* Process all of the functions.
1215 We process AVAIL_INTERPOSABLE functions. We can not use the results
1216 by default, but the info can be used at LTO with -fwhole-program or
1217 when function got cloned and the clone is AVAILABLE. */
1219 FOR_EACH_DEFINED_FUNCTION (node
)
1220 if (opt_for_fn (node
->decl
, flag_ipa_pure_const
))
1221 set_function_state (node
, analyze_function (node
, true));
1225 /* Serialize the ipa info for lto. */
1228 pure_const_write_summary (void)
1230 struct cgraph_node
*node
;
1231 struct lto_simple_output_block
*ob
1232 = lto_create_simple_output_block (LTO_section_ipa_pure_const
);
1233 unsigned int count
= 0;
1234 lto_symtab_encoder_iterator lsei
;
1235 lto_symtab_encoder_t encoder
;
1237 encoder
= lto_get_out_decl_state ()->symtab_node_encoder
;
1239 for (lsei
= lsei_start_function_in_partition (encoder
); !lsei_end_p (lsei
);
1240 lsei_next_function_in_partition (&lsei
))
1242 node
= lsei_cgraph_node (lsei
);
1243 if (node
->definition
&& has_function_state (node
))
1247 streamer_write_uhwi_stream (ob
->main_stream
, count
);
1249 /* Process all of the functions. */
1250 for (lsei
= lsei_start_function_in_partition (encoder
); !lsei_end_p (lsei
);
1251 lsei_next_function_in_partition (&lsei
))
1253 node
= lsei_cgraph_node (lsei
);
1254 if (node
->definition
&& has_function_state (node
))
1256 struct bitpack_d bp
;
1259 lto_symtab_encoder_t encoder
;
1261 fs
= get_function_state (node
);
1263 encoder
= ob
->decl_state
->symtab_node_encoder
;
1264 node_ref
= lto_symtab_encoder_encode (encoder
, node
);
1265 streamer_write_uhwi_stream (ob
->main_stream
, node_ref
);
1267 /* Note that flags will need to be read in the opposite
1268 order as we are pushing the bitflags into FLAGS. */
1269 bp
= bitpack_create (ob
->main_stream
);
1270 bp_pack_value (&bp
, fs
->pure_const_state
, 2);
1271 bp_pack_value (&bp
, fs
->state_previously_known
, 2);
1272 bp_pack_value (&bp
, fs
->looping_previously_known
, 1);
1273 bp_pack_value (&bp
, fs
->looping
, 1);
1274 bp_pack_value (&bp
, fs
->can_throw
, 1);
1275 bp_pack_value (&bp
, fs
->can_free
, 1);
1276 bp_pack_value (&bp
, fs
->malloc_state
, 2);
1277 streamer_write_bitpack (&bp
);
1281 lto_destroy_simple_output_block (ob
);
1285 /* Deserialize the ipa info for lto. */
1288 pure_const_read_summary (void)
1290 struct lto_file_decl_data
**file_data_vec
= lto_get_file_decl_data ();
1291 struct lto_file_decl_data
*file_data
;
1294 pass_ipa_pure_const
*pass
= static_cast <pass_ipa_pure_const
*> (current_pass
);
1295 pass
->register_hooks ();
1297 while ((file_data
= file_data_vec
[j
++]))
1301 struct lto_input_block
*ib
1302 = lto_create_simple_input_block (file_data
,
1303 LTO_section_ipa_pure_const
,
1308 unsigned int count
= streamer_read_uhwi (ib
);
1310 for (i
= 0; i
< count
; i
++)
1313 struct cgraph_node
*node
;
1314 struct bitpack_d bp
;
1316 lto_symtab_encoder_t encoder
;
1318 fs
= XCNEW (struct funct_state_d
);
1319 index
= streamer_read_uhwi (ib
);
1320 encoder
= file_data
->symtab_node_encoder
;
1321 node
= dyn_cast
<cgraph_node
*> (lto_symtab_encoder_deref (encoder
,
1323 set_function_state (node
, fs
);
1325 /* Note that the flags must be read in the opposite
1326 order in which they were written (the bitflags were
1327 pushed into FLAGS). */
1328 bp
= streamer_read_bitpack (ib
);
1329 fs
->pure_const_state
1330 = (enum pure_const_state_e
) bp_unpack_value (&bp
, 2);
1331 fs
->state_previously_known
1332 = (enum pure_const_state_e
) bp_unpack_value (&bp
, 2);
1333 fs
->looping_previously_known
= bp_unpack_value (&bp
, 1);
1334 fs
->looping
= bp_unpack_value (&bp
, 1);
1335 fs
->can_throw
= bp_unpack_value (&bp
, 1);
1336 fs
->can_free
= bp_unpack_value (&bp
, 1);
1338 = (enum malloc_state_e
) bp_unpack_value (&bp
, 2);
1342 int flags
= flags_from_decl_or_type (node
->decl
);
1343 fprintf (dump_file
, "Read info for %s ", node
->dump_name ());
1344 if (flags
& ECF_CONST
)
1345 fprintf (dump_file
, " const");
1346 if (flags
& ECF_PURE
)
1347 fprintf (dump_file
, " pure");
1348 if (flags
& ECF_NOTHROW
)
1349 fprintf (dump_file
, " nothrow");
1350 fprintf (dump_file
, "\n pure const state: %s\n",
1351 pure_const_names
[fs
->pure_const_state
]);
1352 fprintf (dump_file
, " previously known state: %s\n",
1353 pure_const_names
[fs
->state_previously_known
]);
1355 fprintf (dump_file
," function is locally looping\n");
1356 if (fs
->looping_previously_known
)
1357 fprintf (dump_file
," function is previously known looping\n");
1359 fprintf (dump_file
," function is locally throwing\n");
1361 fprintf (dump_file
," function can locally free\n");
1362 fprintf (dump_file
, "\n malloc state: %s\n",
1363 malloc_state_names
[fs
->malloc_state
]);
1367 lto_destroy_simple_input_block (file_data
,
1368 LTO_section_ipa_pure_const
,
1374 /* We only propagate across edges that can throw externally and their callee
1375 is not interposable. */
1378 ignore_edge_for_nothrow (struct cgraph_edge
*e
)
1380 if (!e
->can_throw_external
|| TREE_NOTHROW (e
->callee
->decl
))
1383 enum availability avail
;
1384 cgraph_node
*n
= e
->callee
->function_or_virtual_thunk_symbol (&avail
,
1386 if (avail
<= AVAIL_INTERPOSABLE
|| TREE_NOTHROW (n
->decl
))
1388 return opt_for_fn (e
->callee
->decl
, flag_non_call_exceptions
)
1389 && !e
->callee
->binds_to_current_def_p (e
->caller
);
1392 /* Return true if NODE is self recursive function.
1393 Indirectly recursive functions appears as non-trivial strongly
1394 connected components, so we need to care about self recursion
1398 self_recursive_p (struct cgraph_node
*node
)
1400 struct cgraph_edge
*e
;
1401 for (e
= node
->callees
; e
; e
= e
->next_callee
)
1402 if (e
->callee
->function_symbol () == node
)
1407 /* Return true if N is cdtor that is not const or pure. In this case we may
1408 need to remove unreachable function if it is marked const/pure. */
1411 cdtor_p (cgraph_node
*n
, void *)
1413 if (DECL_STATIC_CONSTRUCTOR (n
->decl
) || DECL_STATIC_DESTRUCTOR (n
->decl
))
1414 return ((!TREE_READONLY (n
->decl
) && !DECL_PURE_P (n
->decl
))
1415 || DECL_LOOPING_CONST_OR_PURE_P (n
->decl
));
1419 /* We only propagate across edges with non-interposable callee. */
1422 ignore_edge_for_pure_const (struct cgraph_edge
*e
)
1424 enum availability avail
;
1425 e
->callee
->function_or_virtual_thunk_symbol (&avail
, e
->caller
);
1426 return (avail
<= AVAIL_INTERPOSABLE
);
1430 /* Produce transitive closure over the callgraph and compute pure/const
1434 propagate_pure_const (void)
1436 struct cgraph_node
*node
;
1437 struct cgraph_node
*w
;
1438 struct cgraph_node
**order
=
1439 XCNEWVEC (struct cgraph_node
*, symtab
->cgraph_count
);
1442 struct ipa_dfs_info
* w_info
;
1443 bool remove_p
= false;
1446 order_pos
= ipa_reduced_postorder (order
, true, false,
1447 ignore_edge_for_pure_const
);
1450 cgraph_node::dump_cgraph (dump_file
);
1451 ipa_print_order (dump_file
, "reduced", order
, order_pos
);
1454 /* Propagate the local information through the call graph to produce
1455 the global information. All the nodes within a cycle will have
1456 the same info so we collapse cycles first. Then we can do the
1457 propagation in one pass from the leaves to the roots. */
1458 for (i
= 0; i
< order_pos
; i
++ )
1460 enum pure_const_state_e pure_const_state
= IPA_CONST
;
1461 bool looping
= false;
1468 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1469 fprintf (dump_file
, "Starting cycle\n");
1471 /* Find the worst state for any node in the cycle. */
1473 while (w
&& pure_const_state
!= IPA_NEITHER
)
1475 struct cgraph_edge
*e
;
1476 struct cgraph_edge
*ie
;
1478 struct ipa_ref
*ref
= NULL
;
1480 funct_state w_l
= get_function_state (w
);
1481 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1482 fprintf (dump_file
, " Visiting %s state:%s looping %i\n",
1484 pure_const_names
[w_l
->pure_const_state
],
1487 /* First merge in function body properties.
1488 We are safe to pass NULL as FROM and TO because we will take care
1489 of possible interposition when walking callees. */
1490 worse_state (&pure_const_state
, &looping
,
1491 w_l
->pure_const_state
, w_l
->looping
,
1493 if (pure_const_state
== IPA_NEITHER
)
1498 /* We consider recursive cycles as possibly infinite.
1499 This might be relaxed since infinite recursion leads to stack
1504 /* Now walk the edges and merge in callee properties. */
1505 for (e
= w
->callees
; e
&& pure_const_state
!= IPA_NEITHER
;
1508 enum availability avail
;
1509 struct cgraph_node
*y
= e
->callee
->
1510 function_or_virtual_thunk_symbol (&avail
,
1512 enum pure_const_state_e edge_state
= IPA_CONST
;
1513 bool edge_looping
= false;
1515 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1517 fprintf (dump_file
, " Call to %s",
1518 e
->callee
->dump_name ());
1520 if (avail
> AVAIL_INTERPOSABLE
)
1522 funct_state y_l
= get_function_state (y
);
1523 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1526 " state:%s looping:%i\n",
1527 pure_const_names
[y_l
->pure_const_state
],
1530 if (y_l
->pure_const_state
> IPA_PURE
1531 && e
->cannot_lead_to_return_p ())
1533 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1535 " Ignoring side effects"
1536 " -> pure, looping\n");
1537 edge_state
= IPA_PURE
;
1538 edge_looping
= true;
1542 edge_state
= y_l
->pure_const_state
;
1543 edge_looping
= y_l
->looping
;
1546 else if (special_builtin_state (&edge_state
, &edge_looping
,
1550 state_from_flags (&edge_state
, &edge_looping
,
1551 flags_from_decl_or_type (y
->decl
),
1552 e
->cannot_lead_to_return_p ());
1554 /* Merge the results with what we already know. */
1555 better_state (&edge_state
, &edge_looping
,
1556 w_l
->state_previously_known
,
1557 w_l
->looping_previously_known
);
1558 worse_state (&pure_const_state
, &looping
,
1559 edge_state
, edge_looping
, e
->caller
, e
->callee
);
1560 if (pure_const_state
== IPA_NEITHER
)
1564 /* Now process the indirect call. */
1565 for (ie
= w
->indirect_calls
;
1566 ie
&& pure_const_state
!= IPA_NEITHER
; ie
= ie
->next_callee
)
1568 enum pure_const_state_e edge_state
= IPA_CONST
;
1569 bool edge_looping
= false;
1571 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1572 fprintf (dump_file
, " Indirect call");
1573 state_from_flags (&edge_state
, &edge_looping
,
1574 ie
->indirect_info
->ecf_flags
,
1575 ie
->cannot_lead_to_return_p ());
1576 /* Merge the results with what we already know. */
1577 better_state (&edge_state
, &edge_looping
,
1578 w_l
->state_previously_known
,
1579 w_l
->looping_previously_known
);
1580 worse_state (&pure_const_state
, &looping
,
1581 edge_state
, edge_looping
, NULL
, NULL
);
1582 if (pure_const_state
== IPA_NEITHER
)
1586 /* And finally all loads and stores. */
1587 for (i
= 0; w
->iterate_reference (i
, ref
)
1588 && pure_const_state
!= IPA_NEITHER
; i
++)
1590 enum pure_const_state_e ref_state
= IPA_CONST
;
1591 bool ref_looping
= false;
1595 /* readonly reads are safe. */
1596 if (TREE_READONLY (ref
->referred
->decl
))
1598 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1599 fprintf (dump_file
, " nonreadonly global var read\n");
1600 ref_state
= IPA_PURE
;
1603 if (ref
->cannot_lead_to_return ())
1605 ref_state
= IPA_NEITHER
;
1606 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1607 fprintf (dump_file
, " global var write\n");
1615 better_state (&ref_state
, &ref_looping
,
1616 w_l
->state_previously_known
,
1617 w_l
->looping_previously_known
);
1618 worse_state (&pure_const_state
, &looping
,
1619 ref_state
, ref_looping
, NULL
, NULL
);
1620 if (pure_const_state
== IPA_NEITHER
)
1623 w_info
= (struct ipa_dfs_info
*) w
->aux
;
1624 w
= w_info
->next_cycle
;
1626 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1627 fprintf (dump_file
, "Result %s looping %i\n",
1628 pure_const_names
[pure_const_state
],
1631 /* Find the worst state of can_free for any node in the cycle. */
1632 bool can_free
= false;
1634 while (w
&& !can_free
)
1636 struct cgraph_edge
*e
;
1637 funct_state w_l
= get_function_state (w
);
1640 || w
->get_availability () == AVAIL_INTERPOSABLE
1641 || w
->indirect_calls
)
1644 for (e
= w
->callees
; e
&& !can_free
; e
= e
->next_callee
)
1646 enum availability avail
;
1647 struct cgraph_node
*y
= e
->callee
->
1648 function_or_virtual_thunk_symbol (&avail
,
1651 if (avail
> AVAIL_INTERPOSABLE
)
1652 can_free
= get_function_state (y
)->can_free
;
1656 w_info
= (struct ipa_dfs_info
*) w
->aux
;
1657 w
= w_info
->next_cycle
;
1660 /* Copy back the region's pure_const_state which is shared by
1661 all nodes in the region. */
1665 funct_state w_l
= get_function_state (w
);
1666 enum pure_const_state_e this_state
= pure_const_state
;
1667 bool this_looping
= looping
;
1669 w_l
->can_free
= can_free
;
1670 w
->nonfreeing_fn
= !can_free
;
1671 if (!can_free
&& dump_file
)
1672 fprintf (dump_file
, "Function found not to call free: %s\n",
1675 if (w_l
->state_previously_known
!= IPA_NEITHER
1676 && this_state
> w_l
->state_previously_known
)
1678 this_state
= w_l
->state_previously_known
;
1679 if (this_state
== IPA_NEITHER
)
1680 this_looping
= w_l
->looping_previously_known
;
1682 if (!this_looping
&& self_recursive_p (w
))
1683 this_looping
= true;
1684 if (!w_l
->looping_previously_known
)
1685 this_looping
= false;
1687 /* All nodes within a cycle share the same info. */
1688 w_l
->pure_const_state
= this_state
;
1689 w_l
->looping
= this_looping
;
1691 /* Inline clones share declaration with their offline copies;
1692 do not modify their declarations since the offline copy may
1694 if (!w
->global
.inlined_to
)
1698 if (!TREE_READONLY (w
->decl
))
1700 warn_function_const (w
->decl
, !this_looping
);
1702 fprintf (dump_file
, "Function found to be %sconst: %s\n",
1703 this_looping
? "looping " : "",
1706 /* Turning constructor or destructor to non-looping const/pure
1707 enables us to possibly remove the function completely. */
1711 has_cdtor
= w
->call_for_symbol_and_aliases (cdtor_p
,
1713 if (w
->set_const_flag (true, this_looping
))
1717 "Declaration updated to be %sconst: %s\n",
1718 this_looping
? "looping " : "",
1720 remove_p
|= has_cdtor
;
1725 if (!DECL_PURE_P (w
->decl
))
1727 warn_function_pure (w
->decl
, !this_looping
);
1729 fprintf (dump_file
, "Function found to be %spure: %s\n",
1730 this_looping
? "looping " : "",
1736 has_cdtor
= w
->call_for_symbol_and_aliases (cdtor_p
,
1738 if (w
->set_pure_flag (true, this_looping
))
1742 "Declaration updated to be %spure: %s\n",
1743 this_looping
? "looping " : "",
1745 remove_p
|= has_cdtor
;
1752 w_info
= (struct ipa_dfs_info
*) w
->aux
;
1753 w
= w_info
->next_cycle
;
1757 ipa_free_postorder_info ();
1762 /* Produce transitive closure over the callgraph and compute nothrow
1766 propagate_nothrow (void)
1768 struct cgraph_node
*node
;
1769 struct cgraph_node
*w
;
1770 struct cgraph_node
**order
=
1771 XCNEWVEC (struct cgraph_node
*, symtab
->cgraph_count
);
1774 struct ipa_dfs_info
* w_info
;
1776 order_pos
= ipa_reduced_postorder (order
, true, false,
1777 ignore_edge_for_nothrow
);
1780 cgraph_node::dump_cgraph (dump_file
);
1781 ipa_print_order (dump_file
, "reduced for nothrow", order
, order_pos
);
1784 /* Propagate the local information through the call graph to produce
1785 the global information. All the nodes within a cycle will have
1786 the same info so we collapse cycles first. Then we can do the
1787 propagation in one pass from the leaves to the roots. */
1788 for (i
= 0; i
< order_pos
; i
++ )
1790 bool can_throw
= false;
1796 /* Find the worst state for any node in the cycle. */
1798 while (w
&& !can_throw
)
1800 struct cgraph_edge
*e
, *ie
;
1802 if (!TREE_NOTHROW (w
->decl
))
1804 funct_state w_l
= get_function_state (w
);
1807 || w
->get_availability () == AVAIL_INTERPOSABLE
)
1810 for (e
= w
->callees
; e
&& !can_throw
; e
= e
->next_callee
)
1812 enum availability avail
;
1814 if (!e
->can_throw_external
|| TREE_NOTHROW (e
->callee
->decl
))
1817 struct cgraph_node
*y
= e
->callee
->
1818 function_or_virtual_thunk_symbol (&avail
,
1821 /* We can use info about the callee only if we know it can
1823 When callee is compiled with non-call exceptions we also
1824 must check that the declaration is bound to current
1825 body as other semantically equivalent body may still
1827 if (avail
<= AVAIL_INTERPOSABLE
1828 || (!TREE_NOTHROW (y
->decl
)
1829 && (get_function_state (y
)->can_throw
1830 || (opt_for_fn (y
->decl
, flag_non_call_exceptions
)
1831 && !e
->callee
->binds_to_current_def_p (w
)))))
1834 for (ie
= w
->indirect_calls
; ie
&& !can_throw
;
1835 ie
= ie
->next_callee
)
1836 if (ie
->can_throw_external
1837 && !(ie
->indirect_info
->ecf_flags
& ECF_NOTHROW
))
1840 w_info
= (struct ipa_dfs_info
*) w
->aux
;
1841 w
= w_info
->next_cycle
;
1844 /* Copy back the region's pure_const_state which is shared by
1845 all nodes in the region. */
1849 funct_state w_l
= get_function_state (w
);
1850 if (!can_throw
&& !TREE_NOTHROW (w
->decl
))
1852 /* Inline clones share declaration with their offline copies;
1853 do not modify their declarations since the offline copy may
1855 if (!w
->global
.inlined_to
)
1857 w
->set_nothrow_flag (true);
1859 fprintf (dump_file
, "Function found to be nothrow: %s\n",
1863 else if (can_throw
&& !TREE_NOTHROW (w
->decl
))
1864 w_l
->can_throw
= true;
1865 w_info
= (struct ipa_dfs_info
*) w
->aux
;
1866 w
= w_info
->next_cycle
;
1870 ipa_free_postorder_info ();
1874 /* Debugging function to dump state of malloc lattice. */
1878 dump_malloc_lattice (FILE *dump_file
, const char *s
)
1883 fprintf (dump_file
, "\n\nMALLOC LATTICE %s:\n", s
);
1885 FOR_EACH_FUNCTION (node
)
1887 funct_state fs
= get_function_state (node
);
1888 malloc_state_e state
= fs
->malloc_state
;
1889 fprintf (dump_file
, "%s: %s\n", node
->name (), malloc_state_names
[state
]);
1893 /* Propagate malloc attribute across the callgraph. */
1896 propagate_malloc (void)
1899 FOR_EACH_FUNCTION (node
)
1901 if (DECL_IS_MALLOC (node
->decl
))
1902 if (!has_function_state (node
))
1904 funct_state l
= XCNEW (struct funct_state_d
);
1906 l
->malloc_state
= STATE_MALLOC
;
1907 set_function_state (node
, l
);
1911 dump_malloc_lattice (dump_file
, "Initial");
1912 struct cgraph_node
**order
1913 = XNEWVEC (struct cgraph_node
*, symtab
->cgraph_count
);
1914 int order_pos
= ipa_reverse_postorder (order
);
1915 bool changed
= true;
1920 /* Walk in postorder. */
1921 for (int i
= order_pos
- 1; i
>= 0; --i
)
1923 cgraph_node
*node
= order
[i
];
1925 || !node
->definition
1926 || !has_function_state (node
))
1929 funct_state l
= get_function_state (node
);
1931 /* FIXME: add support for indirect-calls. */
1932 if (node
->indirect_calls
)
1934 l
->malloc_state
= STATE_MALLOC_BOTTOM
;
1938 if (node
->get_availability () <= AVAIL_INTERPOSABLE
)
1940 l
->malloc_state
= STATE_MALLOC_BOTTOM
;
1944 if (l
->malloc_state
== STATE_MALLOC_BOTTOM
)
1947 vec
<cgraph_node
*> callees
= vNULL
;
1948 for (cgraph_edge
*cs
= node
->callees
; cs
; cs
= cs
->next_callee
)
1950 ipa_call_summary
*es
= ipa_call_summaries
->get (cs
);
1951 if (es
&& es
->is_return_callee_uncaptured
)
1952 callees
.safe_push (cs
->callee
);
1955 malloc_state_e new_state
= l
->malloc_state
;
1956 for (unsigned j
= 0; j
< callees
.length (); j
++)
1958 cgraph_node
*callee
= callees
[j
];
1959 if (!has_function_state (callee
))
1961 new_state
= STATE_MALLOC_BOTTOM
;
1964 malloc_state_e callee_state
= get_function_state (callee
)->malloc_state
;
1965 if (new_state
< callee_state
)
1966 new_state
= callee_state
;
1968 if (new_state
!= l
->malloc_state
)
1971 l
->malloc_state
= new_state
;
1976 FOR_EACH_DEFINED_FUNCTION (node
)
1977 if (has_function_state (node
))
1979 funct_state l
= get_function_state (node
);
1981 && l
->malloc_state
== STATE_MALLOC
1982 && !node
->global
.inlined_to
)
1984 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1985 fprintf (dump_file
, "Function %s found to be malloc\n",
1988 bool malloc_decl_p
= DECL_IS_MALLOC (node
->decl
);
1989 node
->set_malloc_flag (true);
1990 if (!malloc_decl_p
&& warn_suggest_attribute_malloc
)
1991 warn_function_malloc (node
->decl
);
1995 dump_malloc_lattice (dump_file
, "after propagation");
1996 ipa_free_postorder_info ();
2000 /* Produce the global information by preforming a transitive closure
2001 on the local information that was produced by generate_summary. */
2004 pass_ipa_pure_const::
2005 execute (function
*)
2007 struct cgraph_node
*node
;
2010 symtab
->remove_cgraph_insertion_hook (function_insertion_hook_holder
);
2011 symtab
->remove_cgraph_duplication_hook (node_duplication_hook_holder
);
2012 symtab
->remove_cgraph_removal_hook (node_removal_hook_holder
);
2014 /* Nothrow makes more function to not lead to return and improve
2016 propagate_nothrow ();
2017 propagate_malloc ();
2018 remove_p
= propagate_pure_const ();
2021 FOR_EACH_FUNCTION (node
)
2022 if (has_function_state (node
))
2023 free (get_function_state (node
));
2024 funct_state_vec
.release ();
2025 return remove_p
? TODO_remove_functions
: 0;
2029 gate_pure_const (void)
2031 return flag_ipa_pure_const
|| in_lto_p
;
2034 pass_ipa_pure_const::pass_ipa_pure_const(gcc::context
*ctxt
)
2035 : ipa_opt_pass_d(pass_data_ipa_pure_const
, ctxt
,
2036 pure_const_generate_summary
, /* generate_summary */
2037 pure_const_write_summary
, /* write_summary */
2038 pure_const_read_summary
, /* read_summary */
2039 NULL
, /* write_optimization_summary */
2040 NULL
, /* read_optimization_summary */
2041 NULL
, /* stmt_fixup */
2042 0, /* function_transform_todo_flags_start */
2043 NULL
, /* function_transform */
2044 NULL
), /* variable_transform */
2046 function_insertion_hook_holder(NULL
),
2047 node_duplication_hook_holder(NULL
),
2048 node_removal_hook_holder(NULL
)
2053 make_pass_ipa_pure_const (gcc::context
*ctxt
)
2055 return new pass_ipa_pure_const (ctxt
);
2058 /* Return true if function should be skipped for local pure const analysis. */
2061 skip_function_for_local_pure_const (struct cgraph_node
*node
)
2063 /* Because we do not schedule pass_fixup_cfg over whole program after early
2064 optimizations we must not promote functions that are called by already
2065 processed functions. */
2067 if (function_called_by_processed_nodes_p ())
2070 fprintf (dump_file
, "Function called in recursive cycle; ignoring\n");
2073 /* Save some work and do not analyze functions which are interposable and
2074 do not have any non-interposable aliases. */
2075 if (node
->get_availability () <= AVAIL_INTERPOSABLE
2076 && !node
->has_aliases_p ())
2080 "Function is interposable; not analyzing.\n");
2086 /* Simple local pass for pure const discovery reusing the analysis from
2087 ipa_pure_const. This pass is effective when executed together with
2088 other optimization passes in early optimization pass queue. */
2092 const pass_data pass_data_local_pure_const
=
2094 GIMPLE_PASS
, /* type */
2095 "local-pure-const", /* name */
2096 OPTGROUP_NONE
, /* optinfo_flags */
2097 TV_IPA_PURE_CONST
, /* tv_id */
2098 0, /* properties_required */
2099 0, /* properties_provided */
2100 0, /* properties_destroyed */
2101 0, /* todo_flags_start */
2102 0, /* todo_flags_finish */
2105 class pass_local_pure_const
: public gimple_opt_pass
2108 pass_local_pure_const (gcc::context
*ctxt
)
2109 : gimple_opt_pass (pass_data_local_pure_const
, ctxt
)
2112 /* opt_pass methods: */
2113 opt_pass
* clone () { return new pass_local_pure_const (m_ctxt
); }
2114 virtual bool gate (function
*) { return gate_pure_const (); }
2115 virtual unsigned int execute (function
*);
2117 }; // class pass_local_pure_const
2120 pass_local_pure_const::execute (function
*fun
)
2122 bool changed
= false;
2125 struct cgraph_node
*node
;
2127 node
= cgraph_node::get (current_function_decl
);
2128 skip
= skip_function_for_local_pure_const (node
);
2130 if (!warn_suggest_attribute_const
2131 && !warn_suggest_attribute_pure
2135 l
= analyze_function (node
, false);
2137 /* Do NORETURN discovery. */
2138 if (!skip
&& !TREE_THIS_VOLATILE (current_function_decl
)
2139 && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun
)->preds
) == 0)
2141 warn_function_noreturn (fun
->decl
);
2143 fprintf (dump_file
, "Function found to be noreturn: %s\n",
2144 current_function_name ());
2146 /* Update declaration and reduce profile to executed once. */
2147 TREE_THIS_VOLATILE (current_function_decl
) = 1;
2148 if (node
->frequency
> NODE_FREQUENCY_EXECUTED_ONCE
)
2149 node
->frequency
= NODE_FREQUENCY_EXECUTED_ONCE
;
2154 switch (l
->pure_const_state
)
2157 if (!TREE_READONLY (current_function_decl
))
2159 warn_function_const (current_function_decl
, !l
->looping
);
2161 fprintf (dump_file
, "Function found to be %sconst: %s\n",
2162 l
->looping
? "looping " : "",
2163 current_function_name ());
2165 else if (DECL_LOOPING_CONST_OR_PURE_P (current_function_decl
)
2169 fprintf (dump_file
, "Function found to be non-looping: %s\n",
2170 current_function_name ());
2172 if (!skip
&& node
->set_const_flag (true, l
->looping
))
2175 fprintf (dump_file
, "Declaration updated to be %sconst: %s\n",
2176 l
->looping
? "looping " : "",
2177 current_function_name ());
2183 if (!DECL_PURE_P (current_function_decl
))
2185 warn_function_pure (current_function_decl
, !l
->looping
);
2187 fprintf (dump_file
, "Function found to be %spure: %s\n",
2188 l
->looping
? "looping " : "",
2189 current_function_name ());
2191 else if (DECL_LOOPING_CONST_OR_PURE_P (current_function_decl
)
2195 fprintf (dump_file
, "Function found to be non-looping: %s\n",
2196 current_function_name ());
2198 if (!skip
&& node
->set_pure_flag (true, l
->looping
))
2201 fprintf (dump_file
, "Declaration updated to be %spure: %s\n",
2202 l
->looping
? "looping " : "",
2203 current_function_name ());
2211 if (!l
->can_throw
&& !TREE_NOTHROW (current_function_decl
))
2213 node
->set_nothrow_flag (true);
2216 fprintf (dump_file
, "Function found to be nothrow: %s\n",
2217 current_function_name ());
2220 if (l
->malloc_state
== STATE_MALLOC
2221 && !DECL_IS_MALLOC (current_function_decl
))
2223 node
->set_malloc_flag (true);
2224 if (warn_suggest_attribute_malloc
)
2225 warn_function_malloc (node
->decl
);
2228 fprintf (dump_file
, "Function found to be malloc: %s\n",
2234 return execute_fixup_cfg ();
2242 make_pass_local_pure_const (gcc::context
*ctxt
)
2244 return new pass_local_pure_const (ctxt
);
2247 /* Emit noreturn warnings. */
2251 const pass_data pass_data_warn_function_noreturn
=
2253 GIMPLE_PASS
, /* type */
2254 "*warn_function_noreturn", /* name */
2255 OPTGROUP_NONE
, /* optinfo_flags */
2256 TV_NONE
, /* tv_id */
2257 PROP_cfg
, /* properties_required */
2258 0, /* properties_provided */
2259 0, /* properties_destroyed */
2260 0, /* todo_flags_start */
2261 0, /* todo_flags_finish */
2264 class pass_warn_function_noreturn
: public gimple_opt_pass
2267 pass_warn_function_noreturn (gcc::context
*ctxt
)
2268 : gimple_opt_pass (pass_data_warn_function_noreturn
, ctxt
)
2271 /* opt_pass methods: */
2272 virtual bool gate (function
*) { return warn_suggest_attribute_noreturn
; }
2273 virtual unsigned int execute (function
*fun
)
2275 if (!TREE_THIS_VOLATILE (current_function_decl
)
2276 && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun
)->preds
) == 0)
2277 warn_function_noreturn (current_function_decl
);
2281 }; // class pass_warn_function_noreturn
2286 make_pass_warn_function_noreturn (gcc::context
*ctxt
)
2288 return new pass_warn_function_noreturn (ctxt
);
2291 /* Simple local pass for pure const discovery reusing the analysis from
2292 ipa_pure_const. This pass is effective when executed together with
2293 other optimization passes in early optimization pass queue. */
2297 const pass_data pass_data_nothrow
=
2299 GIMPLE_PASS
, /* type */
2300 "nothrow", /* name */
2301 OPTGROUP_NONE
, /* optinfo_flags */
2302 TV_IPA_PURE_CONST
, /* tv_id */
2303 0, /* properties_required */
2304 0, /* properties_provided */
2305 0, /* properties_destroyed */
2306 0, /* todo_flags_start */
2307 0, /* todo_flags_finish */
2310 class pass_nothrow
: public gimple_opt_pass
2313 pass_nothrow (gcc::context
*ctxt
)
2314 : gimple_opt_pass (pass_data_nothrow
, ctxt
)
2317 /* opt_pass methods: */
2318 opt_pass
* clone () { return new pass_nothrow (m_ctxt
); }
2319 virtual bool gate (function
*) { return optimize
; }
2320 virtual unsigned int execute (function
*);
2322 }; // class pass_nothrow
2325 pass_nothrow::execute (function
*)
2327 struct cgraph_node
*node
;
2328 basic_block this_block
;
2330 if (TREE_NOTHROW (current_function_decl
))
2333 node
= cgraph_node::get (current_function_decl
);
2335 /* We run during lowering, we can not really use availability yet. */
2336 if (cgraph_node::get (current_function_decl
)->get_availability ()
2337 <= AVAIL_INTERPOSABLE
)
2340 fprintf (dump_file
, "Function is interposable;"
2341 " not analyzing.\n");
2345 FOR_EACH_BB_FN (this_block
, cfun
)
2347 for (gimple_stmt_iterator gsi
= gsi_start_bb (this_block
);
2350 if (stmt_can_throw_external (gsi_stmt (gsi
)))
2352 if (is_gimple_call (gsi_stmt (gsi
)))
2354 tree callee_t
= gimple_call_fndecl (gsi_stmt (gsi
));
2355 if (callee_t
&& recursive_call_p (current_function_decl
,
2362 fprintf (dump_file
, "Statement can throw: ");
2363 print_gimple_stmt (dump_file
, gsi_stmt (gsi
), 0);
2369 node
->set_nothrow_flag (true);
2371 bool cfg_changed
= false;
2372 if (self_recursive_p (node
))
2373 FOR_EACH_BB_FN (this_block
, cfun
)
2374 if (gimple
*g
= last_stmt (this_block
))
2375 if (is_gimple_call (g
))
2377 tree callee_t
= gimple_call_fndecl (g
);
2379 && recursive_call_p (current_function_decl
, callee_t
)
2380 && maybe_clean_eh_stmt (g
)
2381 && gimple_purge_dead_eh_edges (this_block
))
2386 fprintf (dump_file
, "Function found to be nothrow: %s\n",
2387 current_function_name ());
2388 return cfg_changed
? TODO_cleanup_cfg
: 0;
2394 make_pass_nothrow (gcc::context
*ctxt
)
2396 return new pass_nothrow (ctxt
);