On January 9, 2021 10:22:22 AM GMT+01:00, Jakub Jelinek <ja...@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 <ja...@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