Renesas Synergy™

FAQ 1008122 : register 指定子で変数を定義して、変数参照してみましたが、期待した値が見えません。 なぜですか?

回答

考えられることは、register指定子で宣言した変数の数やCコンパイラの最適化の問題です。
レジスタ変数用レジスタの数が、register 指定子で宣言した変数の数より少ないと、 変数はレジスタに割り当てられなくなります。

レジスタ・モード別のレジスタ変数用レジスタの数は、

 

22 レジスタ・モード: 5 (r25~r29)
26 レジスタ・モード: 7 (r23~r29)
32 レジスタ・モード: 10 (r20~r29)


です。

たとえば、22 レジスタ・モード時に 6 個以上 register 指定子で変数を宣言しても、 すべてはレジスタに入りません。
-Odでは、register指定子で宣言した変数を優先的にレジスタ変数用レジスタに割り当てます。
ただし、register指定された変数でも参照回数が少ないものはレジスタに 割り付けられません。
そして、-Od以外を指定した場合は、register 指定子に関係なく、 相対的に参照頻度の多い変数にレジスタを割り付けられます。

このように、割り付けられた場所が変わってしまうため、シンボル情報などにも影響がおよび、 デバッガから参照できなくなることがあります。
参照できない変数を使った演算結果が問題なければ、正常に動作しています。

 

 

適用製品

V850用コンパイラパッケージ [CA850]
他にご質問がございましたら、リクエストを送信してください