忍者ブログ

なんだか

知らないほうが幸せかもしれない

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

rx-elf-gccで分岐の最適化を眺めてみる、その後

試したソースはこれです。

volatile
unsigned
char bar1;

volatile
unsigned
char bar;

void
tst_bar_bit0(void)
{
  if(bar1&1)
    bar &= ~1;
  else
    bar |= 1;
}


rx-elf-gccで-O2 -fomitframe-pointerでコンパイルすると

                         _tst_bar_bit0:
0000 FB E2 00 00 00 00        mov.L #_bar1, r14
0006 CC EE                    mov.B [r14], r14
0008 FD 74 CE 01              tst #1, r14
000c FB E2 00 00 00 00        mov.L #_bar, r14
0012 CC E4                    mov.B [r14], r4
0014 1E                       bne .L5
0015 65 14                    or #1, r4
0017 C3 E4                    mov.B r4, [r14]
0019 02                       rts
                         .L5:
001a 75 24 FE                 and #-2, r4
001d C3 E4                    mov.B r4, [r14]
001f 02                       rts

こうなります。
色の付いたところが2箇所あるから一箇所にするというのが
-fcrossjumpingの最適化のようです。

volatile付けてるから
mov.B [r14], r4

は、共有されてほしくない。

しょうがないので、gccのソースを眺めてみました。
-fcrossjumpingの処理をしてるのは、cfgcleanup.cというのがわかりました。
色々試したみたところ、その中のold_insns_match_p関数でコードの比較をしています。
volatileなメモリの読み書きしている時の判定を追加します。

                        _tst_bar_bit0:
0000 FB E2 00 00 00 00      mov.L    #_bar1, r14
0006 CC EE                  mov.B    [r14], r14
0008 FD 74 CE 01            tst    #1, r14
000c FB E2 00 00 00 00      mov.L    #_bar, r14
0012 1C                     bne    .L5
0013 F0 E0                  bset    #0, [r14].B
0015 02                     rts
                        .L5:
0016 F0 E8                  bclr    #0, [r14].B
0018 02                     rts

共有部分が一行になり、自前のpeephole2の処理が機能するようになりました。

拍手[0回]

PR

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

フリーエリア

最新CM

最新記事

(07/27)
(03/27)
(03/26)
(03/23)
(03/22)
(03/19)
(03/18)
(03/18)
(03/15)
(03/14)
(03/13)
(03/12)
(03/11)
(03/11)
(03/08)
(03/08)
(03/06)
(03/05)
(03/02)
(03/01)
(02/28)
(02/27)
(02/24)
(02/23)
(02/22)

プロフィール

HN:
kenrou
性別:
非公開

バーコード

ブログ内検索

最古記事

(12/15)
(12/16)
(12/17)
(12/18)
(12/19)
(12/20)
(12/21)
(12/22)
(12/23)
(12/24)
(12/25)
(12/26)
(12/27)
(12/28)
(12/29)
(12/30)
(12/31)
(01/01)
(01/02)
(01/21)
(01/22)
(01/23)
(01/24)
(01/24)
(01/28)

P R

忍者アナライズ

コガネモチ

忍者カウンター

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30