まつぞの です
フォローありがとうございます
volatile を付けても最適化されてしまう場合がある、ということで
GCC で試してみました。結論を先に言うと、GCC だと最高レベルの
最適化を指定しても最適化(コードが実行されない)ことはありません
でした。コンパイラ依存なのでしょうか。
コンパイラ:GCC 3.0.3
x86用とH8用で試しました。
ソースコード:
-------------------------------------------------------------------
// io_repeat.c
// IOポートへの書き込みのための代入文が、最適化によって消えてしまう
// ことがあるかテストするプログラム
#ifdef VOLATILE_DEFINE
volatile int count;
#else
int count;
#endif
int main(){
count = 0x01;
count = 0x02;
count = 0x04;
return 0;
}
-----------------------------------------------------------------------
コンパイルオプションとコンパイル結果
(a-1) H8, volatile 指定なし、最適化レベル0(最適化しない)
(a-2) H8, volatile 指定なし、最適化レベル2
(a-3) H8, volatile 指定あり、最適化レベル2
(a-1) H8, volatile 指定なし、最適化レベル0(最適化しない)
$ h8300-hms-gcc -o no_volatile_O0.S -S -O0 io_repeat.c
// 最適化しないようにオプション指定しているので、volatile 指定しなくても
// 最適化されていません
---------------- h8_no_volatile_O0.S ------------------------------------
; GCC For the Hitachi H8/300
; By Hitachi America Ltd and Cygnus Support
.file "io_repeat.c"
.section .text
.align 1
.global _main
_main:
push r6
mov.w r7,r6
mov.w #1,r2
mov.w r2,@_count
mov.w #2,r2
mov.w r2,@_count
mov.w #4,r2
mov.w r2,@_count
sub.w r0,r0
pop r6
rts
.comm _count,2
.end
.ident
"GCC: (GNU) 3.0.3"
---------------------------------------------------------------------
(a-2) H8, volatile 指定なし、最適化レベル2
$ h8300-hms-gcc -o h8_no_volatile_O2.S -S -O2 io_repeat.c
// volatile 指定をしないと、最適化レベル2ですでに
// 最適化されてしまっています
---------------- h8_no_volatile_O2.S ------------------------------------
; GCC For the Hitachi H8/300
; By Hitachi America Ltd and Cygnus Support
; -O2
.file "io_repeat.c"
.section .text
.align 1
.global _main
_main:
push r6
mov.w r7,r6
mov.w #4,r2
mov.w r2,@_count
sub.w r0,r0
pop r6
rts
.comm _count,2
.end
.ident
"GCC: (GNU) 3.0.3"
-------------------------------------------------------------------
(a-3) H8, volatile 指定あり、最適化レベル2
$ h8300-hms-gcc -o h8_no_volatile_O2.S -S -O2 io_repeat.c
// volatile 指定をすると、最適化されません
// 最高レベルの -O9 を指定 しても最適化されませんでした
// x86 用 GCC でも同様の結果でした
---------------- h8_no_volatile_O2.S ------------------------------------
; GCC For the Hitachi H8/300
; By Hitachi America Ltd and Cygnus Support
; -O2
.file "io_repeat.c"
.section .text
.align 1
.global _main
_main:
push r6
mov.w r7,r6
mov.w #1,r2
mov.w r2,@_count
mov.w #2,r2
mov.w r2,@_count
adds #2,r2
mov.w r2,@_count
sub.w r0,r0
pop r6
rts
.comm _count,2
.end
.ident
"GCC: (GNU) 3.0.3"
-----------------------------------------------------------