diff mbox series

[avr] Fix PR116953 - jump_over_one_insn_p clobbers recog_data.operand in avr_out_sbxx_branch

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

Commit Message

Georg-Johann Lay Oct. 3, 2024, 8:19 a.m. UTC
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?

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.

Comments

Denis Chertykov Oct. 4, 2024, 5:48 p.m. UTC | #1
чт, 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.
diff mbox series

Patch

    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;
+}