aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-flow.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-flow.h')
-rw-r--r--gcc/tree-flow.h43
1 files changed, 37 insertions, 6 deletions
diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h
index 87e8328..98ed8af 100644
--- a/gcc/tree-flow.h
+++ b/gcc/tree-flow.h
@@ -225,9 +225,15 @@ struct function_ann_d GTY(())
typedef struct immediate_use_iterator_d
{
+ /* This is the current use the iterator is processing. */
ssa_use_operand_t *imm_use;
+ /* This marks the last use in the list (use node from SSA_NAME) */
ssa_use_operand_t *end_p;
+ /* This node is inserted and used to mark the end of the uses for a stmt. */
ssa_use_operand_t iter_node;
+ /* This is the next ssa_name to visit. IMM_USE may get removed before
+ the next one is traversed to, so it must be cached early. */
+ ssa_use_operand_t *next_imm_name;
} imm_use_iterator;
@@ -239,18 +245,43 @@ typedef struct immediate_use_iterator_d
!end_readonly_imm_use_p (&(ITER)); \
(DEST) = next_readonly_imm_use (&(ITER)))
+/* Use this iterator to visit each stmt which has a use of SSAVAR. */
-#define FOR_EACH_IMM_USE_SAFE(DEST, ITER, SSAVAR) \
- for ((DEST) = first_safe_imm_use (&(ITER), (SSAVAR)); \
- !end_safe_imm_use_p (&(ITER)); \
- (DEST) = next_safe_imm_use (&(ITER)))
+#define FOR_EACH_IMM_USE_STMT(STMT, ITER, SSAVAR) \
+ for ((STMT) = first_imm_use_stmt (&(ITER), (SSAVAR)); \
+ !end_imm_use_stmt_p (&(ITER)); \
+ (STMT) = next_imm_use_stmt (&(ITER)))
-#define BREAK_FROM_SAFE_IMM_USE(ITER) \
+/* Use this to terminate the FOR_EACH_IMM_USE_STMT loop early. Failure to
+ do so will result in leaving a iterator marker node in the immediate
+ use list, and nothing good will come from that. */
+#define BREAK_FROM_IMM_USE_STMT(ITER) \
{ \
- end_safe_imm_use_traverse (&(ITER)); \
+ end_imm_use_stmt_traverse (&(ITER)); \
break; \
}
+
+/* Use this iterator in combination with FOR_EACH_IMM_USE_STMT to
+ get access to each occurence of ssavar on the stmt returned by
+ that iterator.. for instance:
+
+ FOR_EACH_IMM_USE_STMT (stmt, iter, var)
+ {
+ FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
+ {
+ SET_USE (use_p) = blah;
+ }
+ update_stmt (stmt);
+ } */
+
+#define FOR_EACH_IMM_USE_ON_STMT(DEST, ITER) \
+ for ((DEST) = first_imm_use_on_stmt (&(ITER)); \
+ !end_imm_use_on_stmt_p (&(ITER)); \
+ (DEST) = next_imm_use_on_stmt (&(ITER)))
+
+
+
struct stmt_ann_d GTY(())
{
struct tree_ann_common_d common;