aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-constraints.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2016-01-29 18:47:17 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2016-01-29 18:47:17 +0000
commit9eb1ca69e1ebd98cc8e401b5ae271b988e3ab84a (patch)
treef72efae70813e3fdbe36d5a4563ab3bf55869ca0 /gcc/lra-constraints.c
parent6bbacdb54436ea71d77f70f625c4a97f5c245329 (diff)
downloadgcc-9eb1ca69e1ebd98cc8e401b5ae271b988e3ab84a.zip
gcc-9eb1ca69e1ebd98cc8e401b5ae271b988e3ab84a.tar.gz
gcc-9eb1ca69e1ebd98cc8e401b5ae271b988e3ab84a.tar.bz2
re PR target/69299 (-mavx performance degradation with r232088)
2016-01-29 Vladimir Makarov <vmakarov@redhat.com> PR target/69299 * config/i386/constraints.md (Bm): Describe as special memory constraint. * doc/md.texi (DEFINE_SPECIAL_MEMORY_CONSTRAINT): Describe it. * genoutput.c (main): Process DEFINE_SPECIAL_MEMORY_CONSTRAINT. * genpreds.c (struct constraint_data): Add is_special_memory. (have_special_memory_constraints, special_memory_start): New static vars. (special_memory_end): Ditto. (add_constraint): Add new arg is_special_memory. Add code to process its true value. Update have_special_memory_constraints. (process_define_constraint): Pass the new arg. (process_define_register_constraint): Ditto. (choose_enum_order): Process special memory. (write_tm_preds_h): Generate enum const CT_SPECIAL_MEMORY and function insn_extra_special_memory_constraint. (main): Process DEFINE_SPECIAL_MEMORY_CONSTRAINT. * gensupport.c (process_rtx): Process DEFINE_SPECIAL_MEMORY_CONSTRAINT. * ira-costs.c (record_reg_classes): Process CT_SPECIAL_MEMORY. * ira-lives.c (single_reg_class): Use insn_extra_special_memory_constraint. * ira.c (ira_setup_alts): Process CT_SPECIAL_MEMORY. * lra-constraints.c (process_alt_operands): Ditto. (curr_insn_transform): Use insn_extra_special_memory_constraint. * recog.c (asm_operand_ok, preprocess_constraints): Process CT_SPECIAL_MEMORY. * reload.c (find_reloads): Ditto. * rtl.def (DEFINE_SPECIFAL_MEMORY_CONSTRAINT): New. * stmt.c (parse_input_constraint): Use insn_extra_special_memory_constraint. From-SVN: r232993
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r--gcc/lra-constraints.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index fb19416..9a7121f 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -400,7 +400,7 @@ valid_address_p (struct address_info *ad)
}
/* Return true if the eliminated form of memory reference OP satisfies
- extra memory constraint CONSTRAINT. */
+ extra (special) memory constraint CONSTRAINT. */
static bool
satisfies_memory_constraint_p (rtx op, enum constraint_num constraint)
{
@@ -2038,6 +2038,14 @@ process_alt_operands (int only_alternative)
if (constraint_satisfied_p (op, cn))
win = true;
break;
+
+ case CT_SPECIAL_MEMORY:
+ if (MEM_P (op)
+ && satisfies_memory_constraint_p (op, cn))
+ win = true;
+ else if (spilled_pseudo_p (op))
+ win = true;
+ break;
}
break;
@@ -3701,7 +3709,8 @@ curr_insn_transform (bool check_only_p)
constraint += CONSTRAINT_LEN (c, constraint))
{
enum constraint_num cn = lookup_constraint (constraint);
- if (insn_extra_memory_constraint (cn)
+ if ((insn_extra_memory_constraint (cn)
+ || insn_extra_special_memory_constraint (cn))
&& satisfies_memory_constraint_p (tem, cn))
break;
}