目次: GCC
前回(2020年5月16日の日記、2020年5月17日の日記参照)の取り組みでインラインアセンブラでベクトル型を指定できるようになりましたが、下記の問題が残っていました。
いよいよコンパイラがInternal compile errorを出す問題に取り組みます。ベクトル型を使ったインラインアセンブラをO0でコンパイルすると、下記のようなエラーメッセージが出ます。
b.c: In function '_start': b.c:25:1: internal compiler error: maximum number of generated reload insns per insn achieved (90) 25 | } | ^
このエラーが出るパスはreloadです。問題のある箇所に当たりをつけるため、O0のreloadと、1つ前のパスiraのRTLを比べます。
;;★★asm文
(insn 74 7 10 2 (set (reg:V64SI 109 [ v1 ])
(asm_operands/v:V64SI ("vlw.v %0, %1") ("=&v") 0 [
(mem/c:SI (plus:SI (reg/f:SI 97 frame)
(const_int -360 [0xfffffffffffffe98])) [1 b+40 S4 A64])
]
[
(asm_input:SI ("A") b.c:7)
]
[] b.c:7)) "b.c":7:2 -1
(nil))
;;★★スタックへの退避かな?
(insn 10 74 11 2 (set (mem/c:SI (reg/f:SI 108) [1 v1+0 S4 A2048])*movsi_internal
(nil))
(insn 11 10 12 2 (set (mem/c:SI (plus:SI (reg/f:SI 108)
(const_int 4 [0x4])) [1 v1+4 S4 A32])*movsi_internal
(nil))
...
;;★★asm文
(insn 74 147 146 2 (set (reg:V64SI 112 [orig:109 v1 ] [109])
(asm_operands/v:V64SI ("vlw.v %0, %1") ("=&v") 0 [
(mem/c:SI (reg:SI 113) [1 b+40 S4 A64])
]
[
(asm_input:SI ("A") b.c:7)
]
[] b.c:7)) "b.c":7:2 -1
(nil))
(insn 146 74 236 2 (clobber (reg:V64SI 109 [ v1 ])) "b.c":7:2 -1
(nil))
;;★★変なinsnが大量に増えている(ここから)
(insn 236 146 235 2 (set (reg:SI 202)*movsi_internal
(nil))
(insn 235 236 234 2 (set (reg:SI 201)*movsi_internal
(nil))
...
(insn 144 143 145 2 (set (subreg:SI (reg:V64SI 109 [ v1 ]) 248)*movsi_internal
(nil))
(insn 145 144 10 2 (set (subreg:SI (reg:V64SI 109 [ v1 ]) 252)*movsi_internal
(nil))
;;★★変なinsnが大量に増えている(ここまで)
;;★★スタックへの退避かな?
(insn 10 145 11 2 (set (mem/c:SI (reg/f:SI 108) [1 v1+0 S4 A2048])*movsi_internal
(nil))
(insn 11 10 12 2 (set (mem/c:SI (plus:SI (reg/f:SI 108)
(const_int 4 [0x4])) [1 v1+4 S4 A32])*movsi_internal
(nil))
...
どうやらasm文の後に出てくる代入操作らしきRTLを処理しようとすると死んでしまうようです。次にO2とO0の違いを調べます。パスreloadより前に実行され、なおかつO0とO2双方で共通のパスはiraですから、iraのRTLを比較します。
;;★★O2のとき
(insn 73 7 204 2 (set (reg:V64SI 105 [ v1 ])
(asm_operands/v:V64SI ("vlw.v %0, %1") ("=&v") 0 [
(mem/c:SI (plus:SI (reg/f:SI 97 frame)
(const_int -360 [0xfffffffffffffe98])) [1 b+40 S4 A64])
]
[
(asm_input:SI ("A") b.c:7)
]
[] b.c:7)) "b.c":7:2 -1
(expr_list:REG_UNUSED (reg:V64SI 105 [ v1 ])
(nil)))
(debug_insn 204 73 203 2 (var_location:V64SI D#65 (clobber (const_int 0 [0]))) -1
(nil))
(debug_insn 203 204 202 2 (var_location:SI D#64 (subreg:SI (debug_expr:V64SI D#65) 0)) -1
(nil))
(debug_insn 202 203 201 2 (var_location:SI D#63 (subreg:SI (debug_expr:V64SI D#65) 4)) -1
(nil))
;;★★O0のとき
(insn 74 7 10 2 (set (reg:V64SI 109 [ v1 ])
(asm_operands/v:V64SI ("vlw.v %0, %1") ("=&v") 0 [
(mem/c:SI (plus:SI (reg/f:SI 97 frame)
(const_int -360 [0xfffffffffffffe98])) [1 b+40 S4 A64])
]
[
(asm_input:SI ("A") b.c:7)
]
[] b.c:7)) "b.c":7:2 -1
(nil))
(insn 10 74 11 2 (set (mem/c:SI (reg/f:SI 108) [1 v1+0 S4 A2048])*movsi_internal
(nil))
(insn 11 10 12 2 (set (mem/c:SI (plus:SI (reg/f:SI 108)
(const_int 4 [0x4])) [1 v1+4 S4 A32])*movsi_internal
(nil))
(insn 12 11 13 2 (set (mem/c:SI (plus:SI (reg/f:SI 108)
(const_int 8 [0x8])) [1 v1+8 S4 A64])*movsi_internal
(nil))
結論から先に言えばO2でもO0でも問題のあるRTLが生成されていると考えられます。RTLの所見をまとめると、
O2でInternal compile errorが発生しないのはラッキーに過ぎなかったようです。次回は問題となるRTLがどこから来るのか調べます。
< | 2020 | > | ||||
<< | < | 05 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | 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 |
31 | - | - | - | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)