まつぞの@自宅から です
代入文の右辺にだけ現れる変数に volatile 指定をしても
最適化(コードが削除される)ことがありうる、ということだったので、
GCC で試してみました。
結論を先にいうと、GCC だと最適化されないようです。H8 用と AVR 用で
試してみました。
コンパイラ: GCC 3.0.3(for H8), 3.04(for AVR) on Debian(Linux)
# 自宅からなので前回の報告とは OS が異なります
テストしたソース:
-----------------------------------------------------------------------
// io_read.c
// volatile 指定で最適化がされる場合があるかどうかテストする
#ifdef VOLATILE_DEFINED
volatile int count;
#else
int count;
#endif
int main(){
int a;
a = count;
a = count;
a = count;
return 0;
}
-----------------------------------------------------------------------
(a-1) H8, volatile 指定あり、最適化レベル9(最大)
(a-2) H8, volatile 指定なし、最適化レベル2
(b-1) AVR, volatile 指定あり、最適化レベル9(最大)
(b-2) AVR, volatile 指定なし、最適化レベル2
(a-1) H8, volatile 指定あり、最適化レベル9(最大)
// 右辺値ですが、volatile 指定をしてあると最適化されません
$ h8300-hms-gcc -o H8_volatile_O9.S -S -O9 -DVOLATILE_DEFINED io_read.c
---------- H8_volatile_O9.S ------------------------------------------
; GCC For the Hitachi H8/300
; By Hitachi America Ltd and Cygnus Support
; -O9
.file "io_read.c"
.comm _count,2
.section .text
.align 1
.global _main
_main:
push r6
mov.w r7,r6
mov.w @_count,r2
mov.w @_count,r2
mov.w @_count,r2
sub.w r0,r0
pop r6
rts
.end
.ident
"GCC: (GNU) 3.0.3"
-----------------------------------------------------------------------
(a-2) H8, volatile 指定なし、最適化レベル2
// volatile 指定をしないと最適化レベル2でも最適化されてしまいます
// まあ、左辺値でもそうだったのであたりまえですが(^^;
$ h8300-hms-gcc -o H8_no_volatile_O2.S -S -O2 io_read.c
---------- H8_no_volatile_O2.S ------------------------------------------
; GCC For the Hitachi H8/300
; By Hitachi America Ltd and Cygnus Support
; -O2
.file "io_read.c"
.section .text
.align 1
.global _main
_main:
push r6
mov.w r7,r6
sub.w r0,r0
pop r6
rts
.comm _count,2
.end
.ident
"GCC: (GNU) 3.0.3"
-----------------------------------------------------------------------
(b-1) AVR, volatile 指定あり、最適化レベル9(最大)
// H8 と同様、右辺値ですが、volatile 指定をしてあると最適化されません
$ avr-gcc -o AVR_volatile_O9.S -S -O9 -DVOLATILE_DEFINED io_read.c
---------- AVR_volatile_O9.S ------------------------------------------
.file "io_read.c"
.arch avr2
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
_PC_ = 2
.text
.global main
.type main,@function
main:
/* prologue: frame size=0 */
ldi r28,lo8(__stack - 0)
ldi r29,hi8(__stack - 0)
out __SP_H__,r29
out __SP_L__,r28
/* prologue end (size=4) */
lds r24,count
lds r25,(count)+1
lds r24,count
lds r25,(count)+1
lds r24,count
lds r25,(count)+1
ldi r24,lo8(0)
ldi r25,hi8(0)
/* epilogue: frame size=0 */
__stop_progIi__:
rjmp __stop_progIi__
/* epilogue end (size=1) */
/* function main size 19 (14) */
.Lfe1:
.size main,.Lfe1-main
.comm count,2,1
/* File io_read.c: code 19 = 0x0013 ( 14), prologues 4, epilogues 1 */
-----------------------------------------------------------------------
(b-2) AVR, volatile 指定なし、最適化レベル2
// AVR でも volatile 指定なしだと最適化されます
// AVR で最適化された場合、こんなコードになります
$ avr-gcc -o AVR_no_volatile_O2.S -O2 -S io_read.c
-------- AVR_no_volatile_O2.S --------------------------------------
.file "io_read.c"
.arch avr2
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
_PC_ = 2
.text
.global main
.type main,@function
main:
/* prologue: frame size=0 */
ldi r28,lo8(__stack - 0)
ldi r29,hi8(__stack - 0)
out __SP_H__,r29
out __SP_L__,r28
/* prologue end (size=4) */
ldi r24,lo8(0)
ldi r25,hi8(0)
/* epilogue: frame size=0 */
__stop_progIi__:
rjmp __stop_progIi__
/* epilogue end (size=1) */
/* function main size 7 (2) */
.Lfe1:
.size main,.Lfe1-main
.comm count,2,1
/* File ../io_read.c: code 7 = 0x0007 ( 2), prologues 4, epilogues 1 */
-----------------------------------------------------------------------