#include "ctrump/analyzer/var.h"
#include "ctrump/analyzer/cfg.h"
#include "ctrump/ast/expr-code.h"
#include "ctrump/analyzer/deptest.h"


Go to the source code of this file.
配列アクセスはひとつの "loop_array" と、1個以上の "loop_subscript"からなる array_access = loop_array (loop_subscript)+
loop_array は一つの変数からなる(今のところループ不変変数のみ)
loop_subscript は定数オフセットと0個以上の"loop_index"からなる loop_subscript = (loop_index)+ , offset
loop_index は "loop_iv(帰納変数)", "loop_pointer_inc(ポインタインクリメンタ)",
"ループ不変値" のいずれか
loop_index = loop_iv | loop_pointer_inc | loop_invariant
ループ中のメモリアクセスは 構造体アクセスや、'*'によるポインタ参照も含めて全て以上の形で表現される。
構造体アクセスはメンバ名を添字とする '*'によるアクセスはオフセット0、index無しの添字アクセスとする
ex)
a[i][j] => loop_array = a
subscript[0] = index(loop_iv = i)
subscript[1] = index(loop_iv = j)
a->x => loop_array = a
subscript[0] = 'x'
*a => loop_array = a
subscript[0] = 0
ループ構造は木構造として表現される。 これをループツリーと呼び、各ループはこの木のノード(loop_info_node)として表現される
for (..) -- (1)
{
for (..) -- (1-1)
{...}
for (..) -- (1-2)
{
for (..) -- (1-2-3)
{ ... }
}
}
のような構造は、
(1-1)
/
(1)
\
(1-2) - (1-2-3)
のようになる
Definition in file loop.h.
| #define CTRUMP_LOOP_INDEX_NEGATIVE (1<<0) |
符号反転
Definition at line 192 of file loop.h.
Referenced by single_expr_subscripts_to_loop_subscript().
ループが複雑なフローを持っている場合の要因
| enum ctrump_loop_code |
配列アクセスの添字
解析できなかった配列アクセスの種類
| int ctrump_analyze_loop | ( | struct ctrump_loop_info * | dest, | |
| int * | level_depth, | |||
| struct ctrump_loop_info_node * | loop_tree_node, | |||
| struct ctrump_cfg * | cfg, | |||
| struct ctrump_intmap * | var_info_map, | |||
| const struct ctrump_abi * | abi, | |||
| struct ctrump_mempool * | loop_alloc, | |||
| int | id | |||
| ) |
ループを解析する
| dest | 出力先 |
| level_depth | 最内ループの深さ |
| loop_tree_node | ループツリーのルート |
| cfg | このループを含む関数のCFG |
| var_info_map | id->変数情報マップ |
| abi | ABI |
| loop_alloc | このループをアロケートするプール |
Definition at line 2256 of file loop.c.
References analyze_loop_iv(), analyze_memory_access(), assign_nest_level(), build_dfs_order(), count_loop_node(), ctrump_get_loop_depinfo(), ctrump_mempool_alloc, ctrump_mempool_destroy(), ctrump_mempool_init(), dfs_order(), find_loop_entry(), init_analyze_info(), iv_canonicalize(), loop_exit_analyze(), ctrump_cfg::num_var, recog_reduction(), and ctrump_cfg::var_info.
Referenced by build_loop_tree_func().
| CTRUMP_EXTDEF int ctrump_loop_index_equal | ( | const struct ctrump_loop_index * | i1, | |
| const struct ctrump_loop_index * | i2 | |||
| ) |
インデクスが等しいかどうか
| i1 | インデクス | |
| i2 | インデクス |
Definition at line 1109 of file loop.c.
References ctrump_loop_index::code, CTRUMP_LOOP_INDEX_INDUCTIVE, CTRUMP_LOOP_INDEX_INVARIANT, CTRUMP_LOOP_INDEX_POINTER_INC, ctrump_loop_index::flags, ctrump_loop_pointer_inc::incr, ctrump_loop_index::invariant, ctrump_loop_index::iv, ctrump_loop_pointer_inc::iv_level, ctrump_loop_index::ptrinc, ctrump_loop_index::u, and ctrump_loop_iv::var.
Referenced by ctrump_loop_subscript_equal(), and loop_index_equal().
| CTRUMP_EXTDEF int ctrump_loop_subscript_equal | ( | const struct ctrump_loop_subscript * | s1, | |
| const struct ctrump_loop_subscript * | s2 | |||
| ) |
添字が等しいかどうか
| s1 | 添字 | |
| s2 | 添字 |
Definition at line 1137 of file loop.c.
References ctrump_loop_subscript::code, ctrump_loop_index_equal(), CTRUMP_LOOP_SUBSCRIPT_COEF_ARRAYSIZE, CTRUMP_LOOP_SUBSCRIPT_COEF_CONSTANT, CTRUMP_LOOP_SUBSCRIPT_COEF_SCALE, CTRUMP_LOOP_SUBSCRIPT_COEF_TERMINAL, CTRUMP_LOOP_SUBSCRIPT_LOAD_RECORD, CTRUMP_LOOP_SUBSCRIPT_RECORD_MEMBER, CTRUMP_LOOP_SUBSCRIPT_RECORD_MEMBER_TERMINAL, ctrump_loop_subscript::indices, ctrump_loop_subscript_record_member::member_name, ctrump_loop_subscript::num_index, ctrump_loop_subscript::offset, ctrump_loop_subscript::ctrump_loop_subscript_scale::record_member, and ctrump_loop_subscript::u.
Referenced by loop_subscript_equal().
| CTRUMP_EXTDEF int ctrump_loop_subscript_hash | ( | const struct ctrump_loop_subscript * | s | ) |
ハッシュ値(なるべくユニークになるように努力した値)を返す
| s | 添字 |
Definition at line 1195 of file loop.c.
References ctrump_loop_subscript::ctrump_loop_subscript_scale::array_size_coef, ctrump_loop_subscript::code, ctrump_loop_index_hash(), CTRUMP_LOOP_SUBSCRIPT_COEF_ARRAYSIZE, CTRUMP_LOOP_SUBSCRIPT_COEF_CONSTANT, CTRUMP_LOOP_SUBSCRIPT_COEF_SCALE, CTRUMP_LOOP_SUBSCRIPT_COEF_TERMINAL, CTRUMP_LOOP_SUBSCRIPT_LOAD_RECORD, CTRUMP_LOOP_SUBSCRIPT_RECORD_MEMBER, CTRUMP_LOOP_SUBSCRIPT_RECORD_MEMBER_TERMINAL, ctrump_symbol::hashval, ctrump_texpr::id, ctrump_loop_subscript::indices, ctrump_loop_subscript::ctrump_loop_subscript_scale::load_record, ctrump_loop_subscript_load_record::load_type, ctrump_loop_subscript_record_member::member_name, ctrump_var::name, ctrump_loop_subscript::num_index, ctrump_loop_subscript::offset, ctrump_loop_subscript::ctrump_loop_subscript_scale::record_member, ctrump_loop_subscript::ctrump_loop_subscript_scale::scale_array_coef, and ctrump_loop_subscript::u.
Referenced by loop_subscript_hash().
1.5.6