Message ID | d5ba6cc4-2933-40d5-8447-ce6a453b773d@gjlay.de |
---|---|
State | New |
Headers | show |
Series | [avr] Fix PR116953 - jump_over_one_insn_p clobbers recog_data.operand in avr_out_sbxx_branch | expand |
чт, 3 окт. 2024 г. в 12:19, Georg-Johann Lay <avr@gjlay.de>: > > avr_out_sbxx_branch calls jump_over_one_insn_p which may clobber > recog_data.operand as is calls extract on the next insn. > > A fix is to make a copy of avr_out_sbxx_branch`s incoming operands. > > Ok to apply? Ok. Please apply. Denis. > > Johann > > -- > > AVR: target/116953 - ICE due to operands clobber in avr_out_sbxx_branch. > > PR target/116953 > gcc/ > * config/avr/avr.cc (avr_out_sbxx_branch): Work on a copy of > the operands rather than on operands itself, which is just > recog_data.operand and may be clobbered by jump_over_one_insn_p. > gcc/testsuite/ > * gcc.target/avr/torture/pr116953.c: New test.
AVR: target/116953 - ICE due to operands clobber in avr_out_sbxx_branch. PR target/116953 gcc/ * config/avr/avr.cc (avr_out_sbxx_branch): Work on a copy of the operands rather than on operands itself, which is just recog_data.operand and may be clobbered by jump_over_one_insn_p. gcc/testsuite/ * gcc.target/avr/torture/pr116953.c: New test. diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc index 92013c3845d..735d05b1e74 100644 --- a/gcc/config/avr/avr.cc +++ b/gcc/config/avr/avr.cc @@ -13603,8 +13603,12 @@ avr_hard_regno_rename_ok (unsigned int old_reg, unsigned int new_reg) Operand 3: label to jump to if the test is true. */ const char * -avr_out_sbxx_branch (rtx_insn *insn, rtx operands[]) +avr_out_sbxx_branch (rtx_insn *insn, rtx xop[]) { + // jump_over_one_insn_p may call extract on the next insn, clobbering + // recog_data.operand. Hence make a copy of the operands (PR116953). + rtx operands[] = { xop[0], xop[1], xop[2], xop[3] }; + rtx_code comp = GET_CODE (operands[0]); bool long_jump = get_attr_length (insn) >= 4; bool reverse = long_jump || jump_over_one_insn_p (insn, operands[3]); diff --git a/gcc/testsuite/gcc.target/avr/torture/pr116953.c b/gcc/testsuite/gcc.target/avr/torture/pr116953.c new file mode 100644 index 00000000000..f8e5a38ec65 --- /dev/null +++ b/gcc/testsuite/gcc.target/avr/torture/pr116953.c @@ -0,0 +1,7 @@ +unsigned foo (unsigned x, unsigned y) +{ + int i; + for (i = 8; i--; x <<= 1) + y ^= (x ^ y) & 0x80 ? 79U : 0U; + return y; +}