Renesas Synergy™

FAQ 1008043 : switch 文や if-else 文の分岐先のおのおので、同一の外部変数への代入が存在する場合の記述例は?

回答

以下の例のように、switch 文や if-else 文の分岐先のおのおので、同じ外部変数へ異なる値を代入する場合、 おのおのの箇所ではいったんテンポラリ変数へ代入し、 再び合流したあとにテンポラリ変数から元の外部変数へ代入を行うことにより、 コード・サイズが削減される可能性があります。
これは、外部変数はレジスタに割り付けられることが少ないため、 外部変数への代入はメモリへのストア命令 (4byte) となる一方、テンポラリ変数への代入は、 多くの場合、レジスタ転送 (2byte) になるためです。


※以下の例で s は外部変数であるとします。

 

変更前   変更後 (10byte減 ※)
    switch(x) {
        case 0:
            s = 0;
            break;
        case 1:
            s = 0x5555;
            break;
        case 2:
            s = 0xAAAA;
            break;
        case 3:
            s = 0xFFFF;
    }
    int tmp;

        ...

    if (x == 0) {
        tmp = 0;
    }
    else if (x == 1) {
        tmp = 0x5555;
    }
    else if (x == 2) {
        tmp = 0xAAAA;
    }
    else if (x == 3) {
        tmp = 0xFFFF;
    }
    else {
        goto label;
    }
    s = tmp;

label:


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



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



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

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

 

 

適用製品

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

 

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