
|
 |
MAEC TOOL NEWS:
MAECT-M3T-CC32R-011101D
M32Rファミリ用クロスツールキットM3T-CC32Rの使用上の注意事項を連絡します。
- volatile宣言された構造体または共用体中の配列型メンバの最適化に関する注意事項
- unsigned short型変数の参照後にシフトやマスクを行うプログラムの最適化に関する注意事項
- volatile宣言された構造体または共用体中の配列型メンバの最適化に関する注意事項
- 1.1 該当製品
- M3T-CC32R V.1.00 Release 1 ~ V.3.10 Release 1
- 1.2 内容
- volatile宣言された構造体または共用体の中に配列型のメンバが存在するプログラムに、-O2または-O4を含む最適化を行うとそのメンバがvolatileとして扱われない場合があります。
- 1.3 発生条件
- 以下7点の条件をすべて満たす場合に発生することがあります。
- (1) -O2または-O4を含む最適化オプションを指定している (-O2, -O3, -O4, -O5, -O6, -O7, -Otimeのみ、または-Ospaceのみを指定している )。
- (2) volatile型の構造体または共用体がある
- (3) (2)にvolatile宣言されていない配列のメンバがある
- (4) (3)のメンバの要素の1つを続けて複数回アクセス(参照または代入)している (代入後に参照することも含まれます。)
- (5) (4)のアクセス順序が参照→代入ではない
- (6) (4)のアクセスの間に関数コールがない
- (7) (4)のアクセスの間に、次の(a), (b)がいずれも存在しない
- (a) 変数をインデックスに持つ配列の代入
- (b) グローバル変数の代入
上記のすべての条件に該当する場合、(4)のアクセスに対しvolatileが有効にならず、複数回アクセスを誤って1回にまとめられる場合があります。
- 1.4 発生例
[ソースファイル例: sample.c]
--------------------------------------------------------------------
extern volatile struct { /* 条件(2) */
short data[30]; /* 条件(3) */
} input;
long
func(int arg)
{
short data1, data2;
data1 = input.data[0]; /* 条件(4)(5) */
/* 条件(6)(7a)(7b) */
data2 = input.data[0]; /* 条件(4)(5) */
return data1 + data2;
}
--------------------------------------------------------------------
[CC32Rのコマンド操作例(%はプロンプトを表します)]
--------------------------------------------------------------------
% cc32R -c -O2 sample.c
--------------------------------------------------------------------
- 1.5 回避策
- 次の(1)~(3)のいずれかの方法で回避してください。
- (1) -O2および-O4を含む最適化を抑止する。
- ※-O4を含む最適化は、-O5, -O6, -O7, -Otimeのみ、または-Ospaceのみを指定しているときにも行われます。また、-O2を含む最適化は、-O3, -O6, -O7, -Otimeのみ、または-Ospace のみを指定しているときにも行われます。
-Otimeまたは-Ospaceを使用する場合は、同時に-O0,-O1のいずれかを指定してください。
- (2) メンバもvolatile宣言する。
[sample.cの変更例]
-------------------------------------------------------------------
extern volatile struct {
volatile short data[30]; /* volatile宣言を追加 */
} input000;
-------------------------------------------------------------------
- 1.6 恒久対策
- 本内容は、次期バージョンアップの際に改修する予定です。
M3T-CC32R ご使用上のお願い
MAECT-M3T-CC32R-011101D
- unsigned short型変数の参照後にシフトやマスクを行うプログラムの最適化に関する注意事項
- 2.1 該当製品
- M3T-CC32R V.3.10 Release 1
- 2.2 内容
- unsigned short型変数の参照後に、シフトやマスク(定数との論理積)の処理がある場合、-O1を含む最適化を行うと、シフトとマスクに対する生成コードが不正になる場合があります。
- 2.3 発生条件
- 以下5点の条件をすべて満たす場合に発生することがあります。
- (1) -O1を含む最適化オプションを指定している(-O1, -O3, -O5, -O7, -Otimeのみ、または-Ospaceのみを指定している)。
- (2) unsigned short型の変数を参照している
- (3) (2)の後方に次のいずれかの演算を含む処理コードがある
- (a) 定数の右シフト(>> 8 等)後に定数との論理積をとる(& 0xff等)
- (b) 定数の右シフト(>> 8 等)後にshortもしくはchar型に変換
- (c) 0xffとの論理積をとる
- (4) (2)と(3)の演算が同一の処理ブロック(分岐やループなどの処理の切れ目と切れ目の間)の中にある
- (5) (2)で参照した値が(3)まで保持されている
上記のすべての条件に該当する場合、(3)に対してレジスタ選択が適切でないコードを生成することがあります。
- 2.4 発生例
[ソースファイル例: sample.c]
--------------------------------------------------------------------
extern void func(unsigned char);
unsigned short var1;
unsigned int var2;
unsigned short foo(void)
{
unsigned int use_later;
use_later = var1; /* 条件(2) */
/* : /* 条件(5) */
/* : (この間、use_laterへの代入なし) */
func(var2 >> 16); /* 条件(3)(b),(4) */
return use_later;
}
--------------------------------------------------------------------
[ CC32Rのコマンド操作例(%はプロンプトを表します) ]
--------------------------------------------------------------------
% cc32R -c -O1 sample.c
--------------------------------------------------------------------
- 2.5 回避策
- 次の(1)~(3)のいずれかの方法で回避してください。
- (1) -O1を含む最適化を抑止する
- ※-O1を含む最適化は、-O3, -O5, -O7, -Otimeのみ、または-Ospaceのみを指定しているときにも行われます。
-Otimeまたは-Ospaceを使用する場合は、同時に-O0, -O2, -O4, -O6のいずれかを指定してください。
- (2) 発生条件(2)と(3)の処理ブロックを分割する
[ソースファイル例:sample.cの回避例]
-------------------------------------------------------------------
extern void func(unsigned char);
unsigned short var1;
unsigned int var2;
unsigned short foo(void)
{
unsigned int use_later;
while (1) {
use_later = var1;
break;
} /* ここで処理ブロックが分断される */
func(var2 >> 16);
return use_later;
}
-------------------------------------------------------------------
- (3) unsigned short型を別の型に変える
[ソースファイル例:sample.cの回避例]
-------------------------------------------------------------------
extern void func(unsigned char);
unsigned long var1; /* unsigned short => unsigned long に変更*/
unsigned int var2;
unsigned short foo(void)
{
unsigned int use_later;
use_later = var1;
func(var2 >> 16);
return use_later;
}
-------------------------------------------------------------------
- 2.6 恒久対策
- 本内容は、次期バージョンアップの際に改修する予定です。
|