Я работаю над написанием бэкэнда G CC для новой архитектуры. Когда я пытаюсь скомпилировать следующую простую программу с -O0
(примечание: эта ошибка не возникает при включенной оптимизации):
int main()
{
int a = 10;
a++;
}
Я получаю эту ошибку:
test.c: In function ‘main’:
test.c:5:1: error: insn does not satisfy its constraints:
5 | }
| ^
(insn 8 7 9 (set (reg:SI 12)
(plus:SI (reg:SI 13)
(const_int 1 [0x1]))) "test.c":4:6 1 {addsi3}
(nil))
during RTL pass: final
test.c:5:1: internal compiler error: in final_scan_insn_1, at final.c:3012
0x65f4b2 _fatal_insn(char const*, rtx_def const*, char const*, int, char const*)
../../gcc/gcc/rtl-error.c:108
0x65f4d8 _fatal_insn_not_found(rtx_def const*, char const*, int, char const*)
../../gcc/gcc/rtl-error.c:118
0x5e2fc8 final_scan_insn_1
../../gcc/gcc/final.c:3012
0xa23e0b final_scan_insn(rtx_insn*, _IO_FILE*, int, int, int*)
../../gcc/gcc/final.c:3152
0xa24099 final_1
../../gcc/gcc/final.c:2020
0xa249f2 rest_of_handle_final
../../gcc/gcc/final.c:4658
0xa249f2 execute
../../gcc/gcc/final.c:4736
Судя по тому, что в сообщении об ошибке говорится, проблема, похоже, связана с ограничениями в addsi3
. Вот определение addsi3
:
(define_insn "addsi3"
[(set (match_operand:SI 0 "register_operand" "=r,r")
(plus:SI (match_operand:SI 1 "register_operand" "r,r")
(match_operand:SI 2 "reg_or_imm_operand" "r,I")))]
"1"
"@
add %0 %1 %2
addi %0 %1 %2")
Программа успешно компилируется, если ограничения в определении addsi3
удалены. Вот определение для ограничения I
:
(define_constraint "I"
"A 30-bit immediate."
(and (match_code "const_int")
(match_test "ival >= -536870912 && ival <= 536870911")))
Вот определение предиката reg_or_imm_operand
.
(define_predicate "reg_or_imm_operand"
(ior (and (match_code "const_int")
(match_test "IN_RANGE (INTVAL (op), -536870912, 536870911)"))
(match_operand 0 "register_operand")))
Если требуется более конкретная информация c, пожалуйста, дайте мне знать, и я отредактирую вопрос.
Заранее спасибо. :)