re PR inline-asm/55934 (LRA inline asm error recovery)
gcc/ PR inline-asm/55934 * lra-assigns.c (assign_by_spills): Throw away the pattern of asms that have operands with impossible constraints. Add a FIXME for a speed-up opportunity. * lra-constraints.c (process_alt_operands): Verify that a class selected from constraints on asms is valid for the operand mode. (curr_insn_transform): Remove incorrect comment. testsuite/ PR inline-asm/55934 * gcc.target/i386/pr55934.c: New test. From-SVN: r195420
This commit is contained in:
parent
0e128cdc67
commit
e86c0101ae
@ -1,3 +1,13 @@
|
||||
2013-01-24 Steven Bosscher <steven@gcc.gnu.org>
|
||||
|
||||
PR inline-asm/55934
|
||||
* lra-assigns.c (assign_by_spills): Throw away the pattern of asms
|
||||
that have operands with impossible constraints.
|
||||
Add a FIXME for a speed-up opportunity.
|
||||
* lra-constraints.c (process_alt_operands): Verify that a class
|
||||
selected from constraints on asms is valid for the operand mode.
|
||||
(curr_insn_transform): Remove incorrect comment.
|
||||
|
||||
2013-01-23 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
* config/i386/i386.md (*movdf_internal_rex64): Disparage alternatives
|
||||
|
@ -1240,6 +1240,23 @@ assign_by_spills (void)
|
||||
asm_p = true;
|
||||
error_for_asm (insn,
|
||||
"%<asm%> operand has impossible constraints");
|
||||
/* Avoid further trouble with this 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);
|
||||
lra_update_insn_regno_info (insn);
|
||||
}
|
||||
else
|
||||
{
|
||||
PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx);
|
||||
lra_set_insn_deleted (insn);
|
||||
}
|
||||
}
|
||||
}
|
||||
lra_assert (asm_p);
|
||||
@ -1263,6 +1280,9 @@ assign_by_spills (void)
|
||||
bitmap_ior_into (&changed_insns,
|
||||
&lra_reg_info[sorted_pseudos[i]].insn_bitmap);
|
||||
}
|
||||
|
||||
/* FIXME: Look up the changed insns in the cached LRA insn data using
|
||||
an EXECUTE_IF_SET_IN_BITMAP over changed_insns. */
|
||||
FOR_EACH_BB (bb)
|
||||
FOR_BB_INSNS (bb, insn)
|
||||
if (bitmap_bit_p (&changed_insns, INSN_UID (insn)))
|
||||
|
@ -1847,11 +1847,27 @@ process_alt_operands (int only_alternative)
|
||||
int const_to_mem = 0;
|
||||
bool no_regs_p;
|
||||
|
||||
/* If this alternative asks for a specific reg class, see if there
|
||||
is at least one allocatable register in that class. */
|
||||
no_regs_p
|
||||
= (this_alternative == NO_REGS
|
||||
|| (hard_reg_set_subset_p
|
||||
(reg_class_contents[this_alternative],
|
||||
lra_no_alloc_regs)));
|
||||
|
||||
/* For asms, verify that the class for this alternative is possible
|
||||
for the mode that is specified. */
|
||||
if (!no_regs_p && REG_P (op) && INSN_CODE (curr_insn) < 0)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
|
||||
if (HARD_REGNO_MODE_OK (i, mode)
|
||||
&& in_hard_reg_set_p (reg_class_contents[this_alternative], mode, i))
|
||||
break;
|
||||
if (i == FIRST_PSEUDO_REGISTER)
|
||||
winreg = false;
|
||||
}
|
||||
|
||||
/* If this operand accepts a register, and if the
|
||||
register class has at least one allocatable register,
|
||||
then this operand can be reloaded. */
|
||||
@ -2742,10 +2758,6 @@ curr_insn_transform (void)
|
||||
swap_operands (commutative);
|
||||
}
|
||||
|
||||
/* The operands don't meet the constraints. goal_alt describes the
|
||||
alternative that we could reach by reloading the fewest operands.
|
||||
Reload so as to fit it. */
|
||||
|
||||
if (! alt_p && ! sec_mem_p)
|
||||
{
|
||||
/* No alternative works with reloads?? */
|
||||
|
@ -1,3 +1,8 @@
|
||||
2013-01-24 Steven Bosscher <steven@gcc.gnu.org>
|
||||
|
||||
PR inline-asm/55934
|
||||
* gcc.target/i386/pr55934.c: New test.
|
||||
|
||||
2013-01-23 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/56081
|
||||
|
11
gcc/testsuite/gcc.target/i386/pr55934.c
Normal file
11
gcc/testsuite/gcc.target/i386/pr55934.c
Normal file
@ -0,0 +1,11 @@
|
||||
/* PR inline-asm/55934 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-require-effective-target sse } */
|
||||
/* { dg-options "-std=c99 -msse" } */
|
||||
_Complex float
|
||||
foo (void)
|
||||
{
|
||||
_Complex float x;
|
||||
__asm ("" : "=x" (x)); /* { dg-error "inconsistent .* constraint" } */
|
||||
return x;
|
||||
}
|
Loading…
Reference in New Issue
Block a user