On Tue, Nov 27, 2012 at 2:26 PM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > delete_insn_and_edges doesn't DTRT here, there is __builtin_unreachable > after the invalid inline asm goto. Rather than changing the CFG and trying > to figure out what to do to remove the bogus asm goto successfully, it seems > much easier to just turn it into asm goto ("" : : : clobbers... : lab1...); > i.e. clear template and inputs. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok. Thanks, Richard. > 2012-11-27 Jakub Jelinek <ja...@redhat.com> > > PR middle-end/52650 > * function.c (instantiate_virtual_regs_in_insn): Don't delete invalid > asm gotos, instead just clear their template and inputs. > > --- gcc/function.c.jj 2012-11-21 16:00:12.000000000 +0100 > +++ gcc/function.c 2012-11-26 16:47:24.907472155 +0100 > @@ -1738,7 +1738,18 @@ instantiate_virtual_regs_in_insn (rtx in > if (!check_asm_operands (PATTERN (insn))) > { > error_for_asm (insn, "impossible constraint in %<asm%>"); > - delete_insn_and_edges (insn); > + /* 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). */ > + if (JUMP_P (insn)) > + { > + rtx asm_op = extract_asm_operands (PATTERN (insn)); > + ASM_OPERANDS_TEMPLATE (asm_op) = ggc_strdup (""); > + ASM_OPERANDS_INPUT_VEC (asm_op) = rtvec_alloc (0); > + ASM_OPERANDS_INPUT_CONSTRAINT_VEC (asm_op) = rtvec_alloc (0); > + } > + else > + delete_insn (insn); > } > } > else > > Jakub