Renesas Synergy™

FAQ 1008055 : 分岐後のおのおので同一の文 (代入文、関数の呼び出し等) が存在する場合の記述例は?

回答

分岐後のおのおのにおいて、同一の代入文や関数呼び出しが存在する場合には、 分岐前に移動可能であれば移動します。
その文の評価結果が参照されている場合、いったんテンポラリ変数へ代入し、 そのテンポラリを参照するようにします。


※以下の例は関数呼び出しの場合です。

 

変更前   変更後 (8byte減 ※)
    if (x >= 0) {
        if (x > func(0, 1, 2)) {
            ...
        }
    }
    else {
        if (x < -func(0, 1, 2)) {
            ...
        }
    }

    long tmp;

    tmp = func(0, 1, 2);
    if (x >= 0) {
        if (x > tmp) {
            ...
        }
    }
    else {
        if (x < -tmp) {
            ...
        }
    }


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



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



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

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

 

 

適用製品

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

 

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