Renesas Synergy™

FAQ 1008119 : 「帰納変数の削除」の記述例は?

回答

以下の例のように、ループの制御を行う変数を帰納変数 (誘導変数) と呼びます。
「帰納変数の削除」とは、ループの制御を他の変数を用いるように変更することで帰納変数を削除する最適化です。
この最適化は CA850でも実装されていますが、適用される条件が限られるため、 すべての場合を最適化することはできません。
以下のようにプログラムを修正することにより、この最適化を“手動”で行うことができます。


以下の例では、テンポラリ変数 (ポインタ) p を用いることによって、iを削除します。

 

変更前   変更後 (6byte減 ※)
    int i;

    for (i = 0; *(table + i) != NULL; ++i) {
        if ((*(table + i) & 0xFF) == x) {
            return(*(table + i) & 0xFF00);
        }
    }
    const unsigned short* p;

    for (p = table; *p != NULL; ++p) {
        if ((*p & 0xFF) == x) {
            return(*p & 0xFF00);
        }
    }


※削減量は例に関するものであり、個々のケースにより異なります。



ソースを変更した結果、出力命令が減少し、高速化もされる場合があります。



ソース変更を行う際には、次のような点に注意してください。

  • ソース変更によりレジスタの使用状況が変わるため、意図しない箇所において、 それまで最適化されずに残っていたレジスタ転送が削除されたり、 逆に、最適化が効かなくなって冗長なレジスタ転送が残ったりする可能性があります。
  • テンポラリ変数を追加することにより、新たなレジスタ変数用レジスタが使用されるようになり、それに伴い、関数の入口/出口でそのレジスタの退避/復帰が追加されることがあります。この場合、退避/復帰のコード分(8バイト)だけコード・サイズが増加します。

 

 

適用製品

V850用コンパイラパッケージ [CA850]

 

他にご質問がございましたら、リクエストを送信してください