ctrump/analyzer/loop.h File Reference
ループメモリアクセスの解析
More...
#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.
|
Data Structures |
struct | ctrump_complicated_loop |
| 解析できないループの情報 More...
|
struct | ctrump_loop_iv |
| 帰納変数の情報 iv = var + (loop_counter)*incr + offset + reach_at_loop_entry More...
|
struct | ctrump_loop_pointer_inc |
| ポインタをインクリメントしているアクセスの情報 More...
|
struct | ctrump_loop_array |
| 配列アクセスの配列に関する情報 (今は変数のみ) More...
|
struct | ctrump_loop_subscript_constraint |
| ループ添字が他の添字に依存しないための制約 a[i*width+j] のように、ある添字の係数が変数である場合、 係数が低次元アクセス用の添字の範囲よりも大きい必要がある (が、まだ実装していない) More...
|
struct | ctrump_loop_index |
| 添字インデクスの情報 More...
|
struct | ctrump_loop_subscript_record_member |
| structのメンバアクセス More...
|
struct | ctrump_loop_subscript_record_member_terminal |
| structのメンバアクセス(実際の読み出し有り) More...
|
struct | ctrump_loop_subscript_load_record |
| 構造体の読み出し ex) struct A *xx; xx[0]; More...
|
struct | ctrump_loop_subscript |
| 配列添字の情報 More...
|
union | ctrump_loop_subscript::ctrump_loop_subscript_scale |
| 添字の係数 More...
|
struct | ctrump_loop_memory_access |
| ループ中でのメモリアクセス More...
|
struct | ctrump_array_access |
| 解析できなかった配列アクセス More...
|
struct | ctrump_random_access_multiple_scaled_index |
| 複数の係数があるために解析できない配列アクセス More...
|
struct | ctrump_random_access |
| 解析できなかった配列アクセス More...
|
struct | ctrump_loop_count_pred_info |
| ループ回数の情報 More...
|
struct | ctrump_loop_exit |
| ループ出口の情報 More...
|
struct | ctrump_loop_info |
| 全ネストを含めたループの情報 More...
|
struct | ctrump_loop_info_node |
| ループツリーのノード More...
|
struct | ctrump_loop_reduction |
| 縮約演算の情報 More...
|
struct | ctrump_loop_cfg_info |
| ループのCFG情報 More...
|
Defines |
#define | CTRUMP_LOOP_INDEX_NEGATIVE (1<<0) |
| 符号反転
|
Enumerations |
enum | ctrump_complicated_loop_reason_code {
CTRUMP_COMPLICATED_LOOP_BREAK,
CTRUMP_COMPLICATED_LOOP_GOTO,
CTRUMP_COMPLICATED_LOOP_RETURN,
CTRUMP_COMPLICATED_LOOP_HAVE_COMPLICATED_NEST,
CTRUMP_COMPLICATED_LOOP_INVOKE_FUNC,
CTRUMP_COMPLICATED_LOOP_NEST,
CTRUMP_COMPLICATED_LOOP_HAS_MULTI_ENTRY
} |
| ループが複雑なフローを持っている場合の要因 More...
|
enum | ctrump_loop_index_code { CTRUMP_LOOP_INDEX_INDUCTIVE,
CTRUMP_LOOP_INDEX_INVARIANT,
CTRUMP_LOOP_INDEX_POINTER_INC
} |
| 添字インデクスの種類 More...
|
enum | ctrump_loop_subscript_code {
CTRUMP_LOOP_SUBSCRIPT_COEF_TERMINAL,
CTRUMP_LOOP_SUBSCRIPT_COEF_ARRAYSIZE,
CTRUMP_LOOP_SUBSCRIPT_COEF_CONSTANT,
CTRUMP_LOOP_SUBSCRIPT_RECORD_MEMBER,
CTRUMP_LOOP_SUBSCRIPT_RECORD_MEMBER_TERMINAL,
CTRUMP_LOOP_SUBSCRIPT_LOAD_RECORD,
CTRUMP_LOOP_SUBSCRIPT_COEF_SCALE
} |
| 配列アクセスの添字 More...
|
enum | ctrump_random_access_code {
CTRUMP_RANDOM_ACCESS_POINTER_NOT_INDUCTIVE,
CTRUMP_RANDOM_ACCESS_COMPLICATED_POINTER,
CTRUMP_RANDOM_ACCESS_ARRAY_NOT_INVARIANT,
CTRUMP_RANDOM_ACCESS_SUBSCRIPT_NOT_INDUCTIVE,
CTRUMP_RANDOM_ACCESS_COMPLICATED_ARRAY,
CTRUMP_RANDOM_ACCESS_MULTIPLE_SCALED_INDEX,
CTRUMP_RANDOM_ACCESS_COMPLICATED_SUBSCRIPT,
CTRUMP_RANDOM_ACCESS_INDEX_VAR_NOT_INDUCTIVE
} |
| 解析できなかった配列アクセスの種類 More...
|
enum | ctrump_loop_count_code { CTRUMP_LOOP_COUNT_CONSTANT,
CTRUMP_LOOP_COUNT_PREDICTABLE,
CTRUMP_LOOP_COUNT_UNPREDICTABLE
} |
| ループ回数の種類 More...
|
enum | ctrump_loop_code { CTRUMP_LOOP_UNANALYZED,
CTRUMP_LOOP_COMPLICATED,
CTRUMP_LOOP
} |
| ループの種類 More...
|
Functions |
CTRUMP_EXTDEF int | ctrump_loop_subscript_equal (const struct ctrump_loop_subscript *s1, const struct ctrump_loop_subscript *s2) |
| 添字が等しいかどうか
|
CTRUMP_EXTDEF int | ctrump_loop_index_equal (const struct ctrump_loop_index *i1, const struct ctrump_loop_index *i2) |
| インデクスが等しいかどうか
|
CTRUMP_EXTDEF int | ctrump_loop_subscript_hash (const struct ctrump_loop_subscript *s) |
| ハッシュ値(なるべくユニークになるように努力した値)を返す
|
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) |
| ループを解析する
|
Detailed Description
ループメモリアクセスの解析
ループ内でのメモリアクセスの定義
配列アクセスはひとつの "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 Documentation
#define CTRUMP_LOOP_INDEX_NEGATIVE (1<<0) |
Enumeration Type Documentation
ループが複雑なフローを持っている場合の要因
- Enumerator:
-
CTRUMP_COMPLICATED_LOOP_BREAK |
ループがbreak 文を含む |
CTRUMP_COMPLICATED_LOOP_GOTO |
ループがgotoを含む |
CTRUMP_COMPLICATED_LOOP_RETURN |
ループがreturnを含む |
CTRUMP_COMPLICATED_LOOP_HAVE_COMPLICATED_NEST |
ネストしているループに複雑なループが含まれている |
CTRUMP_COMPLICATED_LOOP_INVOKE_FUNC |
ループ中で関数を呼んでいる |
CTRUMP_COMPLICATED_LOOP_NEST |
ループがネストしている |
CTRUMP_COMPLICATED_LOOP_HAS_MULTI_ENTRY |
ループ中にラベルがある |
Definition at line 115 of file loop.h.
ループの種類
- Enumerator:
-
CTRUMP_LOOP_UNANALYZED |
まだ解析していない |
CTRUMP_LOOP_COMPLICATED |
複雑で解析できないループ |
CTRUMP_LOOP |
ループ |
Definition at line 497 of file loop.h.
ループ回数の種類
- Enumerator:
-
CTRUMP_LOOP_COUNT_CONSTANT |
定数回数ループ |
CTRUMP_LOOP_COUNT_PREDICTABLE |
ループに入る前に回数が決定できる |
CTRUMP_LOOP_COUNT_UNPREDICTABLE |
ループに入る前に回数は決定しない |
Definition at line 389 of file loop.h.
添字インデクスの種類
- Enumerator:
-
CTRUMP_LOOP_INDEX_INDUCTIVE |
帰納変数 |
CTRUMP_LOOP_INDEX_INVARIANT |
ループ不変値 |
CTRUMP_LOOP_INDEX_POINTER_INC |
インクリメントするポインタ |
Definition at line 180 of file loop.h.
配列アクセスの添字
- Enumerator:
-
CTRUMP_LOOP_SUBSCRIPT_COEF_TERMINAL |
|
CTRUMP_LOOP_SUBSCRIPT_COEF_ARRAYSIZE |
スカラ値の読み出し 配列サイズによる添字係数 |
CTRUMP_LOOP_SUBSCRIPT_COEF_CONSTANT |
定数による添字係数 |
CTRUMP_LOOP_SUBSCRIPT_RECORD_MEMBER |
構造体メンバへのアクセス |
CTRUMP_LOOP_SUBSCRIPT_RECORD_MEMBER_TERMINAL |
構造体メンバの読み出し |
CTRUMP_LOOP_SUBSCRIPT_LOAD_RECORD |
構造体の読み出し |
CTRUMP_LOOP_SUBSCRIPT_COEF_SCALE |
ループ不変値による添字係数 |
Definition at line 234 of file loop.h.
解析できなかった配列アクセスの種類
- Enumerator:
-
CTRUMP_RANDOM_ACCESS_POINTER_NOT_INDUCTIVE |
ポインタがループ不変値でない |
CTRUMP_RANDOM_ACCESS_COMPLICATED_POINTER |
ポインタ式が複雑 |
CTRUMP_RANDOM_ACCESS_ARRAY_NOT_INVARIANT |
配列がループ不変値でない |
CTRUMP_RANDOM_ACCESS_SUBSCRIPT_NOT_INDUCTIVE |
添字が帰納変数でない |
CTRUMP_RANDOM_ACCESS_COMPLICATED_ARRAY |
配列式が複雑 |
CTRUMP_RANDOM_ACCESS_MULTIPLE_SCALED_INDEX |
複数の係数が付いた添字がある |
CTRUMP_RANDOM_ACCESS_COMPLICATED_SUBSCRIPT |
添字が複雑 |
CTRUMP_RANDOM_ACCESS_INDEX_VAR_NOT_INDUCTIVE |
インデクスが帰納変数でない |
Definition at line 351 of file loop.h.
Function Documentation
ループを解析する
- Note:
- loop should not be complicated loop.
- Returns:
- next id
- Parameters:
-
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().
インデクスが等しいかどうか
- Parameters:
-
- Returns:
- 等しい場合は1 それ以外0
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().
添字が等しいかどうか
- Parameters:
-
- Returns:
- 等しい場合は1 それ以外0
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().
ハッシュ値(なるべくユニークになるように努力した値)を返す
- Parameters:
-
- Returns:
- 等しい場合は1 それ以外0
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().