tree-ssa-propagate.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* Data structures and function declarations for the SSA value propagation
  2. engine.
  3. Copyright (C) 2004-2015 Free Software Foundation, Inc.
  4. Contributed by Diego Novillo <dnovillo@redhat.com>
  5. This file is part of GCC.
  6. GCC is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 3, or (at your option)
  9. any later version.
  10. GCC is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with GCC; see the file COPYING3. If not see
  16. <http://www.gnu.org/licenses/>. */
  17. #ifndef _TREE_SSA_PROPAGATE_H
  18. #define _TREE_SSA_PROPAGATE_H 1
  19. /* If SIM_P is true, statement S will be simulated again. */
  20. static inline void
  21. prop_set_simulate_again (gimple s, bool visit_p)
  22. {
  23. gimple_set_visited (s, visit_p);
  24. }
  25. /* Return true if statement T should be simulated again. */
  26. static inline bool
  27. prop_simulate_again_p (gimple s)
  28. {
  29. return gimple_visited_p (s);
  30. }
  31. /* Lattice values used for propagation purposes. Specific instances
  32. of a propagation engine must return these values from the statement
  33. and PHI visit functions to direct the engine. */
  34. enum ssa_prop_result {
  35. /* The statement produces nothing of interest. No edges will be
  36. added to the work lists. */
  37. SSA_PROP_NOT_INTERESTING,
  38. /* The statement produces an interesting value. The set SSA_NAMEs
  39. returned by SSA_PROP_VISIT_STMT should be added to
  40. INTERESTING_SSA_EDGES. If the statement being visited is a
  41. conditional jump, SSA_PROP_VISIT_STMT should indicate which edge
  42. out of the basic block should be marked executable. */
  43. SSA_PROP_INTERESTING,
  44. /* The statement produces a varying (i.e., useless) value and
  45. should not be simulated again. If the statement being visited
  46. is a conditional jump, all the edges coming out of the block
  47. will be considered executable. */
  48. SSA_PROP_VARYING
  49. };
  50. /* Call-back functions used by the value propagation engine. */
  51. typedef enum ssa_prop_result (*ssa_prop_visit_stmt_fn) (gimple, edge *, tree *);
  52. typedef enum ssa_prop_result (*ssa_prop_visit_phi_fn) (gphi *);
  53. typedef bool (*ssa_prop_fold_stmt_fn) (gimple_stmt_iterator *gsi);
  54. typedef tree (*ssa_prop_get_value_fn) (tree);
  55. extern bool valid_gimple_rhs_p (tree);
  56. extern void move_ssa_defining_stmt_for_defs (gimple, gimple);
  57. extern bool update_gimple_call (gimple_stmt_iterator *, tree, int, ...);
  58. extern bool update_call_from_tree (gimple_stmt_iterator *, tree);
  59. extern void ssa_propagate (ssa_prop_visit_stmt_fn, ssa_prop_visit_phi_fn);
  60. extern bool stmt_makes_single_store (gimple);
  61. extern bool substitute_and_fold (ssa_prop_get_value_fn, ssa_prop_fold_stmt_fn,
  62. bool);
  63. extern bool may_propagate_copy (tree, tree);
  64. extern bool may_propagate_copy_into_stmt (gimple, tree);
  65. extern bool may_propagate_copy_into_asm (tree);
  66. extern void propagate_value (use_operand_p, tree);
  67. extern void replace_exp (use_operand_p, tree);
  68. extern void propagate_tree_value (tree *, tree);
  69. extern void propagate_tree_value_into_stmt (gimple_stmt_iterator *, tree);
  70. #endif /* _TREE_SSA_PROPAGATE_H */