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"

Include dependency graph for loop.h:

This graph shows which files directly or indirectly include this file:

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)

符号反転

Definition at line 192 of file loop.h.

Referenced by single_expr_subscripts_to_loop_subscript().


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

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 
)

ループを解析する

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().

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_equal ( const struct ctrump_loop_subscript s1,
const struct ctrump_loop_subscript s2 
)

CTRUMP_EXTDEF int ctrump_loop_subscript_hash ( const struct ctrump_loop_subscript s  ) 


Generated on Tue Mar 31 20:19:24 2009 for ctrump by  doxygen 1.5.6