Skip to content

Commit b433140

Browse files
jjsuwa-sys3175jcmvbkbc
authored andcommitted
xtensa: Fix the issue in "*extzvsi-1bit_addsubx"
The second source register of insn "*extzvsi-1bit_addsubx" cannot be the same as the destination register, because that register will be overwritten with an intermediate value after insn splitting. /* example #1 */ int test1(int b, int a) { return ((a & 1024) ? 4 : 0) + b; } ;; result #1 (incorrect) test1: extui a2, a3, 10, 1 ;; overwrites A2 before used addx4 a2, a2, a2 ret.n This patch fixes that. ;; result #1 (correct) test1: extui a3, a3, 10, 1 ;; uses A3 and then overwrites addx4 a2, a3, a2 ret.n However, it should be noted that the first source register can be the same as the destination without any problems. /* example #2 */ int test2(int a, int b) { return ((a & 1024) ? 4 : 0) + b; } ;; result (correct) test2: extui a2, a2, 10, 1 ;; uses A2 and then overwrites addx4 a2, a2, a3 ret.n gcc/ChangeLog: * config/xtensa/xtensa.md (*extzvsi-1bit_addsubx): Add '&' to the destination register constraint to indicate that it is 'earlyclobber', append '0' to the first source register constraint to indicate that it can be the same as the destination register, and change the split condition from 1 to reload_completed so that the insn will be split only after RA in order to obtain allocated registers that satisfy the above constraints.
1 parent 74ae651 commit b433140

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

gcc/config/xtensa/xtensa.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -1109,17 +1109,17 @@
11091109
(const_int 6)))])
11101110

11111111
(define_insn_and_split "*extzvsi-1bit_addsubx"
1112-
[(set (match_operand:SI 0 "register_operand" "=a")
1112+
[(set (match_operand:SI 0 "register_operand" "=&a")
11131113
(match_operator:SI 5 "addsub_operator"
11141114
[(and:SI (match_operator:SI 6 "logical_shift_operator"
1115-
[(match_operand:SI 1 "register_operand" "r")
1115+
[(match_operand:SI 1 "register_operand" "r0")
11161116
(match_operand:SI 3 "const_int_operand" "i")])
11171117
(match_operand:SI 4 "const_int_operand" "i"))
11181118
(match_operand:SI 2 "register_operand" "r")]))]
11191119
"TARGET_ADDX
11201120
&& IN_RANGE (exact_log2 (INTVAL (operands[4])), 1, 3)"
11211121
"#"
1122-
"&& 1"
1122+
"&& reload_completed"
11231123
[(set (match_dup 0)
11241124
(zero_extract:SI (match_dup 1)
11251125
(const_int 1)

0 commit comments

Comments
 (0)