以前MIPSのコンパイラでCoremarkをコンパイルしようとしたときに、-O3を使うと何故かmemsetが登場してリンク時エラーになる件について、 いろいろ試していたら、以下のオプションで消えるようになった。
-fno-tree-loop-distribute-patterns
これを追加すると-O3オプションでコンパイルできるようになる。そして生成されたバイナリを見てみると、-O2オプションでコンパイルした場合と若干異なっている(大勢は変わっていないみたいだが) Coremarkの30万命令程度のプログラムで、数千命令程度の命令数削減?
$ tail coremark.rob.log coremark.rob2.log ※ こちらが -O2 オプションのもの ==> coremark.rob.log <== 358881 [80001b7c] 00001021 addu $v0, $zero, $zero (30,58) :(36,02) $zero=>00000000 $zero=>00000000 $v0<=00000000 358882 [80001b80] 8fbf0064 lw $ra, 0x64($sp) (23,41) :(37,03) $sp=>7f003fa0 $ra=>80001b7c (7f004004)=>bfc00094 $ra<=bfc00094 358883 [80001b84] 8fb00060 lw $s0, 0x60($sp) (53,02) :(38,04) $sp=>7f003fa0 $s0=>00000000 (7f004000)=>00000000 $s0<=00000000 358884 [80001b88] 03e00008 jr $ra $ra=>bfc00094 $zero=>00000000 358885 [80001b8c] 27bd0068 addiu $sp, $sp, 0x68 (45,42) :(39,05) $sp=>7f003fa0 $sp=>7f003fa0 $sp<=7f004008 358886 [bfc00094] 42000020 wait ========================================================== Simulation Stop PC = bfc00094, InstCount = 358886 ========================================================== ※ こちらが -O3 -fno-tree-loop-distribute-patterns オプションのもの。 ==> coremark.rob2.log <== 352532 [80002e5c] 8fbf006c lw $ra, 0x6c($sp) (02,07) :(26,56) $sp=>7f003f98 $ra=>80002e58 (7f004004)=>bfc00094 $ra<=bfc00094 352533 [80002e60] 8fb10068 lw $s1, 0x68($sp) (29,23) :(27,57) $sp=>7f003f98 $s1=>00000000 (7f004000)=>00000000 $s1<=00000000 352534 [80002e64] 8fb00064 lw $s0, 0x64($sp) (58,49) :(28,58) $sp=>7f003f98 $s0=>00000000 (7f003ffc)=>00000000 $s0<=00000000 352535 [80002e68] 03e00008 jr $ra $ra=>bfc00094 $zero=>00000000 352536 [80002e6c] 27bd0070 addiu $sp, $sp, 0x70 (17,15) :(29,59) $sp=>7f003f98 $sp=>7f003f98 $sp<=7f004008 352537 [bfc00094] 42000020 wait ========================================================== Simulation Stop PC = bfc00094, InstCount = 352537 ==========================================================
サイクル性能にどの程度影響するのか調査するために、RTLを流してみるとデッドロックした。。。 あー、昨日のMUL命令最適化の不備が残っていて MUL命令が不定を出している。。。