[PATCH] vregs: Fix up instantiate_virtual_regs_in_insn for asm goto with outputs [PR98603]

Richard Biener rguenther@suse.de
Sat Jan 9 09:46:14 GMT 2021


On January 9, 2021 10:22:22 AM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>If an asm insn fails constraint checking during vregs, it is just
>deleted.
>We don't delete asm goto though because of the edges to the labels, so
>instantiate_virtual_regs_in_insn would just remove the inputs and their
>constraints, the pattern etc.
>This worked fine when asm goto couldn't have output operands, but
>causes
>ICEs later on when it has more than one output (and furthermore doesn't
>really remove the problematic outputs).  The problem is that
>for multiple outputs we have a PARALLEL with multiple ASM_OPERANDS, but
>those must use the same ASM_OPERANDS_INPUT_VEC etc., but the code was
>adjusting just one.
>
>The following patch turns invalid asm goto into a bare
>asm goto ("" : : : : lab, lab2, lab3);
>i.e. no inputs/outputs/clobbers, just the labels.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok. 

Richard. 

>2021-01-08  Jakub Jelinek  <jakub@redhat.com>
>
>	PR rtl-optimization/98603
>	* function.c (instantiate_virtual_regs_in_insn): For asm goto
>	with impossible constraints, drop all SETs, CLOBBERs, drop PARALLEL
>	if any, set ASM_OPERANDS mode to VOIDmode and change
>	ASM_OPERANDS_OUTPUT_CONSTRAINT and ASM_OPERANDS_OUTPUT_IDX.
>
>	* gcc.target/i386/pr98603.c: New test.
>	* gcc.target/aarch64/pr98603.c: New test.
>
>--- gcc/function.c.jj	2021-01-04 10:25:37.929244060 +0100
>+++ gcc/function.c	2021-01-08 15:28:42.864335347 +0100
>@@ -1785,12 +1785,16 @@ instantiate_virtual_regs_in_insn (rtx_in
> 	{
> 	  error_for_asm (insn, "impossible constraint in %<asm%>");
> 	  /* For asm goto, instead of fixing up all the edges
>-	     just clear the template and clear input operands
>-	     (asm goto doesn't have any output operands).  */
>+	     just clear the template and clear input and output operands
>+	     and strip away clobbers.  */
> 	  if (JUMP_P (insn))
> 	    {
> 	      rtx asm_op = extract_asm_operands (PATTERN (insn));
>+	      PATTERN (insn) = asm_op;
>+	      PUT_MODE (asm_op, VOIDmode);
> 	      ASM_OPERANDS_TEMPLATE (asm_op) = ggc_strdup ("");
>+	      ASM_OPERANDS_OUTPUT_CONSTRAINT (asm_op) = "";
>+	      ASM_OPERANDS_OUTPUT_IDX (asm_op) = 0;
> 	      ASM_OPERANDS_INPUT_VEC (asm_op) = rtvec_alloc (0);
> 	      ASM_OPERANDS_INPUT_CONSTRAINT_VEC (asm_op) = rtvec_alloc (0);
> 	    }
>--- gcc/testsuite/gcc.target/i386/pr98603.c.jj	2021-01-08
>15:36:56.985764842 +0100
>+++ gcc/testsuite/gcc.target/i386/pr98603.c	2021-01-08
>15:36:44.301907830 +0100
>@@ -0,0 +1,11 @@
>+/* PR rtl-optimization/98603 */
>+/* { dg-do compile } */
>+/* { dg-options "-O0 -w" } */
>+
>+int
>+foo (void)
>+{
>+  int b, c;
>+  asm goto ("" : "=r" (b), "=r" (c) : "I" (128) : : lab);	/* {
>dg-error "impossible constraint in 'asm'" } */
>+lab:;
>+}
>--- gcc/testsuite/gcc.target/aarch64/pr98603.c.jj	2021-01-08
>15:31:31.719431751 +0100
>+++ gcc/testsuite/gcc.target/aarch64/pr98603.c	2021-01-08
>15:31:05.343729099 +0100
>@@ -0,0 +1,11 @@
>+/* PR rtl-optimization/98603 */
>+/* { dg-do compile } */
>+/* { dg-options "-O0" } */
>+
>+int
>+foo (void)
>+{
>+  int b, c;
>+  asm goto ("" : "=R" (b), "=r" (c) : : : lab);	/* { dg-error
>"impossible constraint in 'asm'" } */
>+lab:;
>+}
>
>	Jakub



More information about the Gcc-patches mailing list