Mark ChangeLog
[official-gcc.git] / gcc / ipa-pure-const.c
blob7b43a6ca0276b575a98e7ecf33e136dc16345f86
1 /* Callgraph based analysis of static variables.
2 Copyright (C) 2004, 2005, 2007 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
10 version.
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
15 for more details.
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 mark functions as being either const (TREE_READONLY) or
22 pure (DECL_IS_PURE).
24 This must be run after inlining decisions have been made since
25 otherwise, the local sets will not contain information that is
26 consistent with post inlined state. The global sets are not prone
27 to this problem since they are by definition transitive. */
29 /* The code in this module is called by the ipa pass manager. It
30 should be one of the later passes since it's information is used by
31 the rest of the compilation. */
33 #include "config.h"
34 #include "system.h"
35 #include "coretypes.h"
36 #include "tm.h"
37 #include "tree.h"
38 #include "tree-flow.h"
39 #include "tree-inline.h"
40 #include "tree-pass.h"
41 #include "langhooks.h"
42 #include "pointer-set.h"
43 #include "ggc.h"
44 #include "ipa-utils.h"
45 #include "c-common.h"
46 #include "tree-gimple.h"
47 #include "cgraph.h"
48 #include "output.h"
49 #include "flags.h"
50 #include "timevar.h"
51 #include "diagnostic.h"
52 #include "langhooks.h"
53 #include "target.h"
55 static struct pointer_set_t *visited_nodes;
57 /* Lattice values for const and pure functions. Everything starts out
58 being const, then may drop to pure and then neither depending on
59 what is found. */
60 enum pure_const_state_e
62 IPA_CONST,
63 IPA_PURE,
64 IPA_NEITHER
67 /* Holder inserted into the ipa_dfs_info aux field to hold the
68 const_state. */
69 struct funct_state_d
71 enum pure_const_state_e pure_const_state;
72 bool state_set_in_source;
75 typedef struct funct_state_d * funct_state;
77 /* Return the function state from NODE. */
79 static inline funct_state
80 get_function_state (struct cgraph_node *node)
82 struct ipa_dfs_info * info = node->aux;
83 return info->aux;
86 /* Check to see if the use (or definition when CHECHING_WRITE is true)
87 variable T is legal in a function that is either pure or const. */
89 static inline void
90 check_decl (funct_state local,
91 tree t, bool checking_write)
93 /* If the variable has the "used" attribute, treat it as if it had a
94 been touched by the devil. */
95 if (lookup_attribute ("used", DECL_ATTRIBUTES (t)))
97 local->pure_const_state = IPA_NEITHER;
98 return;
101 /* Do not want to do anything with volatile except mark any
102 function that uses one to be not const or pure. */
103 if (TREE_THIS_VOLATILE (t))
105 local->pure_const_state = IPA_NEITHER;
106 return;
109 /* Do not care about a local automatic that is not static. */
110 if (!TREE_STATIC (t) && !DECL_EXTERNAL (t))
111 return;
113 /* Since we have dealt with the locals and params cases above, if we
114 are CHECKING_WRITE, this cannot be a pure or constant
115 function. */
116 if (checking_write)
117 local->pure_const_state = IPA_NEITHER;
119 if (DECL_EXTERNAL (t) || TREE_PUBLIC (t))
121 /* If the front end set the variable to be READONLY and
122 constant, we can allow this variable in pure or const
123 functions but the scope is too large for our analysis to set
124 these bits ourselves. */
126 if (TREE_READONLY (t)
127 && DECL_INITIAL (t)
128 && is_gimple_min_invariant (DECL_INITIAL (t)))
129 ; /* Read of a constant, do not change the function state. */
130 else
132 /* Just a regular read. */
133 if (local->pure_const_state == IPA_CONST)
134 local->pure_const_state = IPA_PURE;
138 /* Compilation level statics can be read if they are readonly
139 variables. */
140 if (TREE_READONLY (t))
141 return;
143 /* Just a regular read. */
144 if (local->pure_const_state == IPA_CONST)
145 local->pure_const_state = IPA_PURE;
148 /* If T is a VAR_DECL check to see if it is an allowed reference. */
150 static void
151 check_operand (funct_state local,
152 tree t, bool checking_write)
154 if (!t) return;
156 if (TREE_CODE (t) == VAR_DECL)
157 check_decl (local, t, checking_write);
160 /* Examine tree T for references. */
162 static void
163 check_tree (funct_state local, tree t, bool checking_write)
165 if ((TREE_CODE (t) == EXC_PTR_EXPR) || (TREE_CODE (t) == FILTER_EXPR))
166 return;
168 /* Any tree which is volatile disqualifies thie function from being
169 const or pure. */
170 if (TREE_THIS_VOLATILE (t))
172 local->pure_const_state = IPA_NEITHER;
173 return;
176 while (TREE_CODE (t) == REALPART_EXPR
177 || TREE_CODE (t) == IMAGPART_EXPR
178 || handled_component_p (t))
180 if (TREE_CODE (t) == ARRAY_REF)
181 check_operand (local, TREE_OPERAND (t, 1), false);
182 t = TREE_OPERAND (t, 0);
185 /* The bottom of an indirect reference can only be read, not
186 written. */
187 if (INDIRECT_REF_P (t))
189 check_tree (local, TREE_OPERAND (t, 0), false);
191 /* Any indirect reference that occurs on the lhs
192 disqualifies the function from being pure or const. Any
193 indirect reference that occurs on the rhs disqualifies the
194 function from being const. */
195 if (checking_write)
197 local->pure_const_state = IPA_NEITHER;
198 return;
200 else if (local->pure_const_state == IPA_CONST)
201 local->pure_const_state = IPA_PURE;
204 if (SSA_VAR_P (t))
205 check_operand (local, t, checking_write);
208 /* Scan tree T to see if there are any addresses taken in within T. */
210 static void
211 look_for_address_of (funct_state local, tree t)
213 if (TREE_CODE (t) == ADDR_EXPR)
215 tree x = get_base_var (t);
216 if (TREE_CODE (x) == VAR_DECL)
218 check_decl (local, x, false);
220 /* Taking the address of something appears to be reasonable
221 in PURE code. Not allowed in const. */
222 if (local->pure_const_state == IPA_CONST)
223 local->pure_const_state = IPA_PURE;
228 /* Check to see if T is a read or address of operation on a var we are
229 interested in analyzing. LOCAL is passed in to get access to its
230 bit vectors. */
232 static void
233 check_rhs_var (funct_state local, tree t)
235 look_for_address_of (local, t);
237 /* Memcmp and strlen can both trap and they are declared pure. */
238 if (tree_could_trap_p (t)
239 && local->pure_const_state == IPA_CONST)
240 local->pure_const_state = IPA_PURE;
242 check_tree(local, t, false);
245 /* Check to see if T is an assignment to a var we are interested in
246 analyzing. LOCAL is passed in to get access to its bit vectors. */
248 static void
249 check_lhs_var (funct_state local, tree t)
251 /* Memcmp and strlen can both trap and they are declared pure.
252 Which seems to imply that we can apply the same rule here. */
253 if (tree_could_trap_p (t)
254 && local->pure_const_state == IPA_CONST)
255 local->pure_const_state = IPA_PURE;
257 check_tree(local, t, true);
260 /* This is a scaled down version of get_asm_expr_operands from
261 tree_ssa_operands.c. The version there runs much later and assumes
262 that aliasing information is already available. Here we are just
263 trying to find if the set of inputs and outputs contain references
264 or address of operations to local static variables. STMT is the
265 actual asm statement. */
267 static void
268 get_asm_expr_operands (funct_state local, tree stmt)
270 int noutputs = list_length (ASM_OUTPUTS (stmt));
271 const char **oconstraints
272 = (const char **) alloca ((noutputs) * sizeof (const char *));
273 int i;
274 tree link;
275 const char *constraint;
276 bool allows_mem, allows_reg, is_inout;
278 for (i=0, link = ASM_OUTPUTS (stmt); link; ++i, link = TREE_CHAIN (link))
280 oconstraints[i] = constraint
281 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
282 parse_output_constraint (&constraint, i, 0, 0,
283 &allows_mem, &allows_reg, &is_inout);
285 check_lhs_var (local, TREE_VALUE (link));
288 for (link = ASM_INPUTS (stmt); link; link = TREE_CHAIN (link))
290 constraint
291 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
292 parse_input_constraint (&constraint, 0, 0, noutputs, 0,
293 oconstraints, &allows_mem, &allows_reg);
295 check_rhs_var (local, TREE_VALUE (link));
298 for (link = ASM_CLOBBERS (stmt); link; link = TREE_CHAIN (link))
299 if (simple_cst_equal(TREE_VALUE (link), memory_identifier_string) == 1)
300 /* Abandon all hope, ye who enter here. */
301 local->pure_const_state = IPA_NEITHER;
303 if (ASM_VOLATILE_P (stmt))
304 local->pure_const_state = IPA_NEITHER;
307 /* Check the parameters of a function call to CALL_EXPR to see if
308 there are any references in the parameters that are not allowed for
309 pure or const functions. Also check to see if this is either an
310 indirect call, a call outside the compilation unit, or has special
311 attributes that may also effect the purity. The CALL_EXPR node for
312 the entire call expression. */
314 static void
315 check_call (funct_state local, tree call_expr)
317 int flags = call_expr_flags(call_expr);
318 tree operand_list = TREE_OPERAND (call_expr, 1);
319 tree operand;
320 tree callee_t = get_callee_fndecl (call_expr);
321 struct cgraph_node* callee;
322 enum availability avail = AVAIL_NOT_AVAILABLE;
324 for (operand = operand_list;
325 operand != NULL_TREE;
326 operand = TREE_CHAIN (operand))
328 tree argument = TREE_VALUE (operand);
329 check_rhs_var (local, argument);
332 /* The const and pure flags are set by a variety of places in the
333 compiler (including here). If someone has already set the flags
334 for the callee, (such as for some of the builtins) we will use
335 them, otherwise we will compute our own information.
337 Const and pure functions have less clobber effects than other
338 functions so we process these first. Otherwise if it is a call
339 outside the compilation unit or an indirect call we punt. This
340 leaves local calls which will be processed by following the call
341 graph. */
342 if (callee_t)
344 callee = cgraph_node(callee_t);
345 avail = cgraph_function_body_availability (callee);
347 /* When bad things happen to bad functions, they cannot be const
348 or pure. */
349 if (setjmp_call_p (callee_t))
350 local->pure_const_state = IPA_NEITHER;
352 if (DECL_BUILT_IN_CLASS (callee_t) == BUILT_IN_NORMAL)
353 switch (DECL_FUNCTION_CODE (callee_t))
355 case BUILT_IN_LONGJMP:
356 case BUILT_IN_NONLOCAL_GOTO:
357 local->pure_const_state = IPA_NEITHER;
358 break;
359 default:
360 break;
364 /* The callee is either unknown (indirect call) or there is just no
365 scannable code for it (external call) . We look to see if there
366 are any bits available for the callee (such as by declaration or
367 because it is builtin) and process solely on the basis of those
368 bits. */
369 if (avail == AVAIL_NOT_AVAILABLE || avail == AVAIL_OVERWRITABLE)
371 if (flags & ECF_PURE)
373 if (local->pure_const_state == IPA_CONST)
374 local->pure_const_state = IPA_PURE;
376 else
377 local->pure_const_state = IPA_NEITHER;
379 else
381 /* We have the code and we will scan it for the effects. */
382 if (flags & ECF_PURE)
384 if (local->pure_const_state == IPA_CONST)
385 local->pure_const_state = IPA_PURE;
390 /* TP is the part of the tree currently under the microscope.
391 WALK_SUBTREES is part of the walk_tree api but is unused here.
392 DATA is cgraph_node of the function being walked. */
394 /* FIXME: When this is converted to run over SSA form, this code
395 should be converted to use the operand scanner. */
397 static tree
398 scan_function (tree *tp,
399 int *walk_subtrees,
400 void *data)
402 struct cgraph_node *fn = data;
403 tree t = *tp;
404 funct_state local = get_function_state (fn);
406 switch (TREE_CODE (t))
408 case VAR_DECL:
409 if (DECL_INITIAL (t))
410 walk_tree (&DECL_INITIAL (t), scan_function, fn, visited_nodes);
411 *walk_subtrees = 0;
412 break;
414 case MODIFY_EXPR:
416 /* First look on the lhs and see what variable is stored to */
417 tree lhs = TREE_OPERAND (t, 0);
418 tree rhs = TREE_OPERAND (t, 1);
419 check_lhs_var (local, lhs);
421 /* For the purposes of figuring out what the cast affects */
423 /* Next check the operands on the rhs to see if they are ok. */
424 switch (TREE_CODE_CLASS (TREE_CODE (rhs)))
426 case tcc_binary:
428 tree op0 = TREE_OPERAND (rhs, 0);
429 tree op1 = TREE_OPERAND (rhs, 1);
430 check_rhs_var (local, op0);
431 check_rhs_var (local, op1);
433 break;
434 case tcc_unary:
436 tree op0 = TREE_OPERAND (rhs, 0);
437 check_rhs_var (local, op0);
440 break;
441 case tcc_reference:
442 check_rhs_var (local, rhs);
443 break;
444 case tcc_declaration:
445 check_rhs_var (local, rhs);
446 break;
447 case tcc_expression:
448 switch (TREE_CODE (rhs))
450 case ADDR_EXPR:
451 check_rhs_var (local, rhs);
452 break;
453 case CALL_EXPR:
454 check_call (local, rhs);
455 break;
456 default:
457 break;
459 break;
460 default:
461 break;
463 *walk_subtrees = 0;
465 break;
467 case ADDR_EXPR:
468 /* This case is here to find addresses on rhs of constructors in
469 decl_initial of static variables. */
470 check_rhs_var (local, t);
471 *walk_subtrees = 0;
472 break;
474 case LABEL_EXPR:
475 if (DECL_NONLOCAL (TREE_OPERAND (t, 0)))
476 /* Target of long jump. */
477 local->pure_const_state = IPA_NEITHER;
478 break;
480 case CALL_EXPR:
481 check_call (local, t);
482 *walk_subtrees = 0;
483 break;
485 case ASM_EXPR:
486 get_asm_expr_operands (local, t);
487 *walk_subtrees = 0;
488 break;
490 default:
491 break;
493 return NULL;
496 /* This is the main routine for finding the reference patterns for
497 global variables within a function FN. */
499 static void
500 analyze_function (struct cgraph_node *fn)
502 funct_state l = XCNEW (struct funct_state_d);
503 tree decl = fn->decl;
504 struct ipa_dfs_info * w_info = fn->aux;
506 w_info->aux = l;
508 l->pure_const_state = IPA_CONST;
509 l->state_set_in_source = false;
511 /* If this function does not return normally or does not bind local,
512 do not touch this unless it has been marked as const or pure by the
513 front end. */
514 if (TREE_THIS_VOLATILE (decl)
515 || !targetm.binds_local_p (decl))
517 l->pure_const_state = IPA_NEITHER;
518 return;
521 if (TREE_READONLY (decl))
523 l->pure_const_state = IPA_CONST;
524 l->state_set_in_source = true;
526 if (DECL_IS_PURE (decl))
528 l->pure_const_state = IPA_PURE;
529 l->state_set_in_source = true;
532 if (dump_file)
534 fprintf (dump_file, "\n local analysis of %s with initial value = %d\n ",
535 cgraph_node_name (fn),
536 l->pure_const_state);
539 if (!l->state_set_in_source)
541 struct function *this_cfun = DECL_STRUCT_FUNCTION (decl);
542 basic_block this_block;
544 FOR_EACH_BB_FN (this_block, this_cfun)
546 block_stmt_iterator bsi;
547 for (bsi = bsi_start (this_block); !bsi_end_p (bsi); bsi_next (&bsi))
549 walk_tree (bsi_stmt_ptr (bsi), scan_function,
550 fn, visited_nodes);
551 if (l->pure_const_state == IPA_NEITHER)
552 goto end;
556 if (l->pure_const_state != IPA_NEITHER)
558 tree old_decl = current_function_decl;
559 /* Const functions cannot have back edges (an
560 indication of possible infinite loop side
561 effect. */
563 current_function_decl = fn->decl;
565 /* The C++ front end, has a tendency to some times jerk away
566 a function after it has created it. This should have
567 been fixed. */
568 gcc_assert (DECL_STRUCT_FUNCTION (fn->decl));
570 push_cfun (DECL_STRUCT_FUNCTION (fn->decl));
572 if (mark_dfs_back_edges ())
573 l->pure_const_state = IPA_NEITHER;
575 current_function_decl = old_decl;
576 pop_cfun ();
580 end:
581 if (dump_file)
583 fprintf (dump_file, "after local analysis of %s with initial value = %d\n ",
584 cgraph_node_name (fn),
585 l->pure_const_state);
590 /* Produce the global information by preforming a transitive closure
591 on the local information that was produced by ipa_analyze_function
592 and ipa_analyze_variable. */
594 static unsigned int
595 static_execute (void)
597 struct cgraph_node *node;
598 struct cgraph_node *w;
599 struct cgraph_node **order =
600 XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
601 int order_pos = order_pos = ipa_utils_reduced_inorder (order, true, false);
602 int i;
603 struct ipa_dfs_info * w_info;
605 if (!memory_identifier_string)
606 memory_identifier_string = build_string(7, "memory");
608 /* There are some shared nodes, in particular the initializers on
609 static declarations. We do not need to scan them more than once
610 since all we would be interested in are the addressof
611 operations. */
612 visited_nodes = pointer_set_create ();
614 /* Process all of the functions.
616 We do not want to process any of the clones so we check that this
617 is a master clone. However, we do NOT process any
618 AVAIL_OVERWRITABLE functions (these are never clones) we cannot
619 guarantee that what we learn about the one we see will be true
620 for the one that overriders it.
622 for (node = cgraph_nodes; node; node = node->next)
623 if (node->analyzed && cgraph_is_master_clone (node))
624 analyze_function (node);
626 pointer_set_destroy (visited_nodes);
627 visited_nodes = NULL;
628 if (dump_file)
630 dump_cgraph (dump_file);
631 ipa_utils_print_order(dump_file, "reduced", order, order_pos);
634 /* Propagate the local information thru the call graph to produce
635 the global information. All the nodes within a cycle will have
636 the same info so we collapse cycles first. Then we can do the
637 propagation in one pass from the leaves to the roots. */
638 for (i = 0; i < order_pos; i++ )
640 enum pure_const_state_e pure_const_state = IPA_CONST;
641 int count = 0;
642 node = order[i];
644 /* Find the worst state for any node in the cycle. */
645 w = node;
646 while (w)
648 funct_state w_l = get_function_state (w);
649 if (pure_const_state < w_l->pure_const_state)
650 pure_const_state = w_l->pure_const_state;
652 if (pure_const_state == IPA_NEITHER)
653 break;
655 if (!w_l->state_set_in_source)
657 struct cgraph_edge *e;
658 count++;
660 /* FIXME!!! Because of pr33826, we cannot have either
661 immediate or transitive recursive functions marked as
662 pure or const because dce can delete a function that
663 is in reality an infinite loop. A better solution
664 than just outlawing them is to add another bit the
665 functions to distinguish recursive from non recursive
666 pure and const function. This would allow the
667 recursive ones to be cse'd but not dce'd. In this
668 same vein, we could allow functions with loops to
669 also be cse'd but not dce'd.
671 Unfortunately we are late in stage 3, and the fix
672 described above is is not appropriate. */
673 if (count > 1)
675 pure_const_state = IPA_NEITHER;
676 break;
679 for (e = w->callees; e; e = e->next_callee)
681 struct cgraph_node *y = e->callee;
682 /* Only look at the master nodes and skip external nodes. */
683 y = cgraph_master_clone (y);
685 /* Check for immediate recursive functions. See the
686 FIXME above. */
687 if (w == y)
689 pure_const_state = IPA_NEITHER;
690 break;
692 if (y)
694 funct_state y_l = get_function_state (y);
695 if (pure_const_state < y_l->pure_const_state)
696 pure_const_state = y_l->pure_const_state;
697 if (pure_const_state == IPA_NEITHER)
698 break;
702 w_info = w->aux;
703 w = w_info->next_cycle;
706 /* Copy back the region's pure_const_state which is shared by
707 all nodes in the region. */
708 w = node;
709 while (w)
711 funct_state w_l = get_function_state (w);
713 /* All nodes within a cycle share the same info. */
714 if (!w_l->state_set_in_source)
716 w_l->pure_const_state = pure_const_state;
717 switch (pure_const_state)
719 case IPA_CONST:
720 TREE_READONLY (w->decl) = 1;
721 if (dump_file)
722 fprintf (dump_file, "Function found to be const: %s\n",
723 lang_hooks.decl_printable_name(w->decl, 2));
724 break;
726 case IPA_PURE:
727 DECL_IS_PURE (w->decl) = 1;
728 if (dump_file)
729 fprintf (dump_file, "Function found to be pure: %s\n",
730 lang_hooks.decl_printable_name(w->decl, 2));
731 break;
733 default:
734 break;
737 w_info = w->aux;
738 w = w_info->next_cycle;
742 /* Cleanup. */
743 for (node = cgraph_nodes; node; node = node->next)
744 /* Get rid of the aux information. */
745 if (node->aux)
747 w_info = node->aux;
748 if (w_info->aux)
749 free (w_info->aux);
750 free (node->aux);
751 node->aux = NULL;
754 free (order);
755 return 0;
758 static bool
759 gate_pure_const (void)
761 return (flag_unit_at_a_time != 0 && flag_ipa_pure_const
762 /* Don't bother doing anything if the program has errors. */
763 && !(errorcount || sorrycount));
766 struct tree_opt_pass pass_ipa_pure_const =
768 "pure-const", /* name */
769 gate_pure_const, /* gate */
770 static_execute, /* execute */
771 NULL, /* sub */
772 NULL, /* next */
773 0, /* static_pass_number */
774 TV_IPA_PURE_CONST, /* tv_id */
775 0, /* properties_required */
776 0, /* properties_provided */
777 0, /* properties_destroyed */
778 0, /* todo_flags_start */
779 0, /* todo_flags_finish */
780 0 /* letter */