re PR rtl-optimization/64110 (ICE: Max. number of generated reload insns per insn is achieved (90))
2015-01-15 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/64110 * stmt.c (parse_output_constraint): Process '^' and '$'. (parse_input_constraint): Ditto. * lra-constraints.c (process_alt_operands): Process the new constraints. * ira-costs.c (record_reg_classes): Process the new constraint '^'. * genoutput.c (indep_constraints): Add '^' and '$'. * config/i386/sse.md (*vec_dup<mode>): Use '$' instead of '!'. * doc/md.texi: Add description of the new constraints. 2015-01-15 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/64110 * gcc.target/i386/pr64110.c: Add scan-assembler. From-SVN: r219683
This commit is contained in:
parent
41dbbb3789
commit
d145770146
|
@ -1,3 +1,16 @@
|
|||
2015-01-15 Vladimir Makarov <vmakarov@redhat.com>
|
||||
|
||||
PR rtl-optimization/64110
|
||||
* stmt.c (parse_output_constraint): Process '^' and '$'.
|
||||
(parse_input_constraint): Ditto.
|
||||
* lra-constraints.c (process_alt_operands): Process the new
|
||||
constraints.
|
||||
* ira-costs.c (record_reg_classes): Process the new constraint
|
||||
'^'.
|
||||
* genoutput.c (indep_constraints): Add '^' and '$'.
|
||||
* config/i386/sse.md (*vec_dup<mode>): Use '$' instead of '!'.
|
||||
* doc/md.texi: Add description of the new constraints.
|
||||
|
||||
2015-01-15 Thomas Schwinge <thomas@codesourcery.com>
|
||||
Bernd Schmidt <bernds@codesourcery.com>
|
||||
Cesar Philippidis <cesar@codesourcery.com>
|
||||
|
|
|
@ -16713,7 +16713,7 @@
|
|||
(define_insn "*vec_dup<mode>"
|
||||
[(set (match_operand:AVX2_VEC_DUP_MODE 0 "register_operand" "=x,x,x")
|
||||
(vec_duplicate:AVX2_VEC_DUP_MODE
|
||||
(match_operand:<ssescalarmode> 1 "nonimmediate_operand" "m,x,!r")))]
|
||||
(match_operand:<ssescalarmode> 1 "nonimmediate_operand" "m,x,$r")))]
|
||||
"TARGET_AVX2"
|
||||
"@
|
||||
v<sseintprefix>broadcast<bcstscalarsuff>\t{%1, %0|%0, %1}
|
||||
|
|
|
@ -1507,6 +1507,18 @@ in it.
|
|||
Disparage severely the alternative that the @samp{!} appears in.
|
||||
This alternative can still be used if it fits without reloading,
|
||||
but if reloading is needed, some other alternative will be used.
|
||||
|
||||
@cindex @samp{^} in constraint
|
||||
@cindex caret
|
||||
@item ^
|
||||
This constraint is analogous to @samp{?} but it disparages slightly
|
||||
the alternative only if the operand with the @samp{?} needs a reload.
|
||||
|
||||
@cindex @samp{$} in constraint
|
||||
@cindex dollar sign
|
||||
@item $
|
||||
This constraint is analogous to @samp{!} but it disparages severely
|
||||
the alternative only if the operand with the @samp{$} needs a reload.
|
||||
@end table
|
||||
|
||||
@ifset INTERNALS
|
||||
|
|
|
@ -209,7 +209,7 @@ struct constraint_data
|
|||
|
||||
/* All machine-independent constraint characters (except digits) that
|
||||
are handled outside the define*_constraint mechanism. */
|
||||
static const char indep_constraints[] = ",=+%*?!#&g";
|
||||
static const char indep_constraints[] = ",=+%*?!^$#&g";
|
||||
|
||||
static struct constraint_data *
|
||||
constraints_by_letter_table[1 << CHAR_BIT];
|
||||
|
|
|
@ -778,6 +778,10 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
|
|||
c = *++p;
|
||||
break;
|
||||
|
||||
case '^':
|
||||
alt_cost += 2;
|
||||
break;
|
||||
|
||||
case '?':
|
||||
alt_cost += 2;
|
||||
break;
|
||||
|
|
|
@ -1657,6 +1657,7 @@ process_alt_operands (int only_alternative)
|
|||
then REJECT is ignored, but otherwise it gets this much counted
|
||||
against it in addition to the reloading needed. */
|
||||
int reject;
|
||||
int op_reject;
|
||||
/* The number of elements in the following array. */
|
||||
int early_clobbered_regs_num;
|
||||
/* Numbers of operands which are early clobber registers. */
|
||||
|
@ -1806,6 +1807,7 @@ process_alt_operands (int only_alternative)
|
|||
track. */
|
||||
lra_assert (*p != 0 && *p != ',');
|
||||
|
||||
op_reject = 0;
|
||||
/* Scan this alternative's specs for this operand; set WIN
|
||||
if the operand fits any letter in this alternative.
|
||||
Otherwise, clear BADOP if this operand could fit some
|
||||
|
@ -1828,6 +1830,13 @@ process_alt_operands (int only_alternative)
|
|||
early_clobber_p = true;
|
||||
break;
|
||||
|
||||
case '$':
|
||||
op_reject += LRA_MAX_REJECT;
|
||||
break;
|
||||
case '^':
|
||||
op_reject += LRA_LOSER_COST_FACTOR;
|
||||
break;
|
||||
|
||||
case '#':
|
||||
/* Ignore rest of this alternative. */
|
||||
c = '\0';
|
||||
|
@ -2114,6 +2123,7 @@ process_alt_operands (int only_alternative)
|
|||
int const_to_mem = 0;
|
||||
bool no_regs_p;
|
||||
|
||||
reject += op_reject;
|
||||
/* Never do output reload of stack pointer. It makes
|
||||
impossible to do elimination when SP is changed in
|
||||
RTL. */
|
||||
|
|
|
@ -307,6 +307,7 @@ parse_output_constraint (const char **constraint_p, int operand_num,
|
|||
break;
|
||||
|
||||
case '?': case '!': case '*': case '&': case '#':
|
||||
case '$': case '^':
|
||||
case 'E': case 'F': case 'G': case 'H':
|
||||
case 's': case 'i': case 'n':
|
||||
case 'I': case 'J': case 'K': case 'L': case 'M':
|
||||
|
@ -397,6 +398,7 @@ parse_input_constraint (const char **constraint_p, int input_num,
|
|||
|
||||
case '<': case '>':
|
||||
case '?': case '!': case '*': case '#':
|
||||
case '$': case '^':
|
||||
case 'E': case 'F': case 'G': case 'H':
|
||||
case 's': case 'i': case 'n':
|
||||
case 'I': case 'J': case 'K': case 'L': case 'M':
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2015-01-15 Vladimir Makarov <vmakarov@redhat.com>
|
||||
|
||||
PR rtl-optimization/64110
|
||||
* gcc.target/i386/pr64110.c: Add scan-assembler.
|
||||
|
||||
2015-01-15 Thomas Schwinge <thomas@codesourcery.com>
|
||||
James Norris <jnorris@codesourcery.com>
|
||||
Cesar Philippidis <cesar@codesourcery.com>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O3 -march=core-avx2" } */
|
||||
/* { dg-final { scan-assembler "vmovd\[\\t \]" } } */
|
||||
|
||||
int foo (void);
|
||||
int a;
|
||||
|
|
Loading…
Reference in New Issue