Renesas Synergy™

FAQ 1008076 : 複雑な if 文を論理的に等しいものに置き換える記述例は?

回答

if-else の組み合わせにおいて、複数のケースで同じ処理を実行する場合、 別の条件を用いてその「複数のケース」を1つにまとめられるのであればまとめます。
これにより、冗長な部分を削除します。


以下の例で、「xの初期値が 0 で、sおよび t の値は 0 または 1 のいずれかである」 という条件が揃っている場合、次のように変形することが可能です。

 

変更前   変更後 (10byte減 ※)
    if (!s) {
        if (t) {
            x = 1;
        }
    }
    else {
        if (!t) {
            x = 1;
        }
    }
    if (x) {
        if ((++u) >= v) {
            u = 0;
         }
         else {
             x = 0;
         }
    }
    if (! (s ^ t)) {
        if ((++u) >= v) {
            u = 0;
            x = 1;
        }
    }


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



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



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

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

 

 

適用製品

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

 

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