class AM_CURSOR < $IS_EQ


Flattened version is here

Ancestors
$IS_EQ



Public


Readable Attributes
attr assign_in_order:BOOL;
**** returns the expressions of assignments before the assign stmt. Most of the time this is not desired, but sometimes (like CSE) we need it
attr cur:$AM;
attr ignore_assert:BOOL;
**** before the assign stmt. Most of the time this is not desired, but sometimes (like CSE) we need it
attr ignore_next:BOOL;
attr ignore_post:BOOL;
attr ignore_pre:BOOL;
attr indent:INT;
attr loops:INT;
attr mark:BOOL;
attr prog:PROG;
attr stack:A_STACK{AM_CURSOR_POS};
attr started:BOOL;
**** can be deleted after fullt debugging this class
attr top:$AM;
attr with_side_effects:BOOL;

Writable Attributes
attr assign_in_order:BOOL;
**** returns the expressions of assignments before the assign stmt. Most of the time this is not desired, but sometimes (like CSE) we need it
attr cur:$AM;
attr ignore_assert:BOOL;
**** before the assign stmt. Most of the time this is not desired, but sometimes (like CSE) we need it
attr ignore_next:BOOL;
attr ignore_post:BOOL;
attr ignore_pre:BOOL;
attr indent:INT;
attr loops:INT;
attr mark:BOOL;
attr prog:PROG;
attr stack:A_STACK{AM_CURSOR_POS};
attr started:BOOL;
**** can be deleted after fullt debugging this class
attr top:$AM;
attr with_side_effects:BOOL;

Features
adjust_marks_on_stack(c:SAME)
**** we need two loops as we do not know if some new nodes have been inserted or deleted.
after_if
**** sets the current position to the last statement of the test/if_true/if_false of the if stmt, such that the next next! will return the first statement after the if; We use the same trick as below in after_loop
after_loop
**** sets the current position to the last statement of the body list of a loop, or, if empty, to the last list of the init part (if it is not empty). The next! will return the first statement after the loop.
append_to_loop(am:$AM_STMT)
back_to_mark
**** #OUT+"before executing back_to_mark. Current position: \n"+str;
begin_of_loop_body
**** sets the current position to the last statement of the init list of a loop, or, if init is empty, to the loop statement. The next next! will then return the first statement of the loop body.
create(c:SAME):SAME
create(prog:PROG,am:$AM):SAME
delete_current
find_node(am:$AM):BOOL
****
get_surr_stmt:$AM_STMT
in_iter_init:BOOL
in_loop:BOOL
init_next
innermost_loop
insert_after_mark(am:$AM_STMT,weight:INT):BOOL
insert_after_mark(am:$AM_STMT,weight:INT,after_prefetch:BOOL):BOOL
**** if cur is AM_LOCAL_EXPR, we could not find it again in find_node at the end of the function (the same is actually true for constants, but we don't check them here)
insert_after_mark_after_prefetch(am:$AM_STMT,weight:INT):BOOL
insert_in_loop_init(am:$AM_STMT)
**** if prog.opt_debug then #OUT+"CURSOR: insert stmt in loop init, before inserting:\n"+str;end;
insert_stmt_after(am:$AM_STMT)
insert_stmt_before(am:$AM_STMT)
insert_stmt_before_loop(am:$AM_STMT)
**** if prog.opt_debug then #OUT+"CURSOR: insert stmt before loop, before inserting:\n"+str;end;
insert_stmt_before_stmt(am:$AM_STMT)
**** if prog.opt_debug then
____#OUT+"CURSOR:_insert_stmt_before_stmt,_before_inserting:\n"+str;
____#OUT+"Statement_to_insert:\n";
____AM_OUT::AM_out(am);
____#OUT+"inserting_it_in\n";
____AM_OUT::AM_out(top);
end;
is_const(am:$AM):BOOL
is_const_in_func(am:$AM):BOOL
is_const_in_func_before_eval_cur_expr(am:$AM):BOOL
is_const_in_loop(am:$AM):BOOL
is_const_in_loop_before_eval_cur_expr(am:$AM):BOOL
is_current_lhs:BOOL
is_eq(c:SAME):BOOL
****
___#OUT+"comparing_two_AM_CURSOR:\n";
___#OUT+"top:\t"+SYS::id(top)+"\t"+SYS::id(c.top)+"\n";
___#OUT+"cur:\t"+SYS::id(cur)+"\t"+SYS::id(c.cur)+"\n";
___#OUT+"loops:\t"+loops+"\t"+c.loops+"\n";
___#OUT+"indent:\t"+indent+"\t"+c.indent+"\n";
___#OUT+"size:\t"+stack.size+"\t"+c.stack.size+"\n";
___#OUT+str+c.str;
is_exec_after_and_const_from_there(after:AM_CURSOR,am:$AM):BOOL
**** first we check if we are in a part of the code that is only executed if some conditions are true
is_lhs_of_at_expr:BOOL
is_neq(t:SAME):BOOL
is_non_fatal_and_const_in_func(am:$AM):BOOL
is_non_fatal_and_const_in_func_before_eval_cur_expr(am:$AM):BOOL
is_non_fatal_and_const_in_loop(am:$AM):BOOL
is_non_fatal_and_const_in_loop_before_eval_cur_expr(am:$AM):BOOL
is_not_used_in_func(am:$AM):BOOL
is_not_used_in_func_before_eval_cur_expr(am:$AM):BOOL
is_not_used_in_loop_before_eval_cur_expr(am:$AM):BOOL
is_not_used_outside_innermost_loop(am:$AM):BOOL
lock_stmt:AM_LOCK_STMT
loop_or_lock_stmt:$AM_STMT
loop_stmt:AM_LOOP_STMT
mark_stack
next
**** or after calling init_next
next:$AM
**** may only be called during a loop that uses next!, or after calling init_next
next_stmt
**** the cursor is moved to next Node after cur.
next_stmt:$AM
**** moves the cursor to the next stmt (cur.next). if cur.next is void the cursor is moved to next Node after cur.
not_in_a_case_in_a_loop:BOOL
not_in_a_conditional_in_loop:BOOL
not_prefetch_attr:BOOL
prefetch_stmt:AM_PREFETCH_STMT
print_cur
replace(am:$AM)
replace_expr(w:$AM_EXPR)
**** if prog.opt_debug then #OUT+"CURSOR: replace_expr, before replacing:\n"+str;end;
replace_stmt(am:$AM_STMT)
**** if prog.opt_debug then #OUT+"CURSOR: replace_stmt, before replacing:\n"+str;end;
str:STR
surr_stmt
test_am_cursor
waitfor_stmt:AM_WAITFOR_STMT
weight_after(cc:AM_CURSOR):INT

Iters
next!
next!:$AM


Private

find_stmt(t:INT):$AM
find_stmts(t1:INT,t2:INT):$AM
insert_stmt(am:$AM,branch:INT,w:$AM_STMT)
is_am_attr_expr_const_in(cr:AM_CURSOR,self_tp:$TP,name:IDENT):BOOL
is_am_attr_expr_not_used_in(c1:AM_CURSOR,tp:$TP,name:IDENT):BOOL
is_am_global_expr_const_in(c1:AM_CURSOR,tp:$TP,name:IDENT):BOOL
is_am_global_expr_not_used_in(c1:AM_CURSOR,tp:$TP,name:IDENT):BOOL
is_am_local_expr_const_in(c:AM_CURSOR,am:AM_LOCAL_EXPR):BOOL
**** a hot argument local is never const
is_am_local_expr_not_used_in(c1:AM_CURSOR,am:AM_LOCAL_EXPR):BOOL
is_am_rout_call_expr_const_in(c1:AM_CURSOR,am:AM_ROUT_CALL_EXPR):BOOL
is_am_rout_call_expr_non_fatal_and_const_in(c1:AM_CURSOR,am:AM_ROUT_CALL_EXPR):BOOL
is_const_in(c:AM_CURSOR,am:$AM):BOOL
**** if prog.opt_debug then#OUT+"is_const_in: self="+str+"c=\n"+c.str+"am=";AM_OUT::AM_out(am);end;
is_non_fatal_and_const_in(c:AM_CURSOR,am:$AM):BOOL
is_not_used_in(c:AM_CURSOR,am:$AM):BOOL
is_not_used_in_loop(am:AM_LOCAL_EXPR):BOOL
next_branch(cur:$AM,branch:INT):$AM
stack!:$AM