summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-07 16:18:09 +0000
committerH.J. Lu <hjl.tools@gmail.com>2015-08-07 11:03:03 -0700
commitdbc649165f365ee38f31d4dfef8744ee609277e6 (patch)
tree464cec596ca7369ef85101d96480f33fa3211599
parenta4f892adb911c05326e62ec8ae8d3995abb288ce (diff)
downloadgcc-hjl/pr67029/gcc-5-branch.tar.gz
Add alternative_mask to ira_implicitly_set_insn_hard_regshjl/pr67029/gcc-5-branch
Since ira_implicitly_set_insn_hard_regs may be called outside of ira-lives.c, it can't use the local variable, preferred_alternatives. This patch adds an alternative_mask argument to ira_implicitly_set_insn_hard_regs. Backport from trunk: gcc/ PR rtl-optimization/67029 * ira-color.c: Include "recog.h" before including "ira-int.h". * target-globals.c: Likewise. * ira-lives.c (ira_implicitly_set_insn_hard_regs): Add an adds an alternative_mask argument and use it instead of preferred_alternatives. * ira.h (ira_implicitly_set_insn_hard_regs): Moved to ... * ira-int.h (ira_implicitly_set_insn_hard_regs): Here. * sched-deps.c: Include "ira-int.h" after including "ira.h". (sched_analyze_insn): Update call to ira_implicitly_set_insn_hard_regs. * sel-sched.c: Include "ira-int.h" after including "ira.h". (implicit_clobber_conflict_p): Update call to ira_implicitly_set_insn_hard_regs. gcc/testsuite/ PR rtl-optimization/67029 * gcc.dg/pr67029.c: New test.
-rw-r--r--gcc/ChangeLog20
-rw-r--r--gcc/ira-color.c1
-rw-r--r--gcc/ira-int.h2
-rw-r--r--gcc/ira-lives.c4
-rw-r--r--gcc/ira.h1
-rw-r--r--gcc/sched-deps.c4
-rw-r--r--gcc/sel-sched.c4
-rw-r--r--gcc/target-globals.c1
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/pr67029.c14
10 files changed, 54 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 207b798abc9..30932d99e48 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,23 @@
+2015-08-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ Backport from trunk:
+ 2015-08-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR rtl-optimization/67029
+ * ira-color.c: Include "recog.h" before including "ira-int.h".
+ * target-globals.c: Likewise.
+ * ira-lives.c (ira_implicitly_set_insn_hard_regs): Add an
+ adds an alternative_mask argument and use it instead of
+ preferred_alternatives.
+ * ira.h (ira_implicitly_set_insn_hard_regs): Moved to ...
+ * ira-int.h (ira_implicitly_set_insn_hard_regs): Here.
+ * sched-deps.c: Include "ira-int.h" after including "ira.h".
+ (sched_analyze_insn): Update call to
+ ira_implicitly_set_insn_hard_regs.
+ * sel-sched.c: Include "ira-int.h" after including "ira.h".
+ (implicit_clobber_conflict_p): Update call to
+ ira_implicitly_set_insn_hard_regs.
+
2015-08-07 Kirill Yukhin <kirill.yukhin@intel.com>
* config/i386/i386.md (define_attr "isa"): Addd avx512vl and
diff --git a/gcc/ira-color.c b/gcc/ira-color.c
index ff1fe8a78ad..e104f00d3ac 100644
--- a/gcc/ira-color.c
+++ b/gcc/ira-color.c
@@ -63,6 +63,7 @@ along with GCC; see the file COPYING3. If not see
#include "reload.h"
#include "params.h"
#include "df.h"
+#include "recog.h"
#include "ira-int.h"
typedef struct allocno_hard_regs *allocno_hard_regs_t;
diff --git a/gcc/ira-int.h b/gcc/ira-int.h
index c2853dcdd37..c1c545cc11f 100644
--- a/gcc/ira-int.h
+++ b/gcc/ira-int.h
@@ -1045,6 +1045,8 @@ extern void ira_debug_live_ranges (void);
extern void ira_create_allocno_live_ranges (void);
extern void ira_compress_allocno_live_ranges (void);
extern void ira_finish_allocno_live_ranges (void);
+extern void ira_implicitly_set_insn_hard_regs (HARD_REG_SET *,
+ alternative_mask);
/* ira-conflicts.c */
extern void ira_debug_conflicts (bool);
diff --git a/gcc/ira-lives.c b/gcc/ira-lives.c
index b29f5722bfc..81d3208f1d2 100644
--- a/gcc/ira-lives.c
+++ b/gcc/ira-lives.c
@@ -837,7 +837,8 @@ single_reg_operand_class (int op_num)
might be used by insn reloads because the constraints are too
strict. */
void
-ira_implicitly_set_insn_hard_regs (HARD_REG_SET *set)
+ira_implicitly_set_insn_hard_regs (HARD_REG_SET *set,
+ alternative_mask preferred)
{
int i, c, regno = 0;
enum reg_class cl;
@@ -860,7 +861,6 @@ ira_implicitly_set_insn_hard_regs (HARD_REG_SET *set)
mode = (GET_CODE (op) == SCRATCH
? GET_MODE (op) : PSEUDO_REGNO_MODE (regno));
cl = NO_REGS;
- alternative_mask preferred = preferred_alternatives;
for (; (c = *p); p += CONSTRAINT_LEN (c, p))
if (c == '#')
preferred &= ~ALTERNATIVE_BIT (0);
diff --git a/gcc/ira.h b/gcc/ira.h
index 19797809292..dca99e8560e 100644
--- a/gcc/ira.h
+++ b/gcc/ira.h
@@ -190,7 +190,6 @@ extern void ira_init (void);
extern void ira_setup_eliminable_regset (void);
extern rtx ira_eliminate_regs (rtx, machine_mode);
extern void ira_set_pseudo_classes (bool, FILE *);
-extern void ira_implicitly_set_insn_hard_regs (HARD_REG_SET *);
extern void ira_expand_reg_equiv (void);
extern void ira_update_equiv_info_by_shuffle_insn (int, int, rtx_insn *);
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index 5434831d3df..459a468ac9f 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -56,6 +56,7 @@ along with GCC; see the file COPYING3. If not see
#include "params.h"
#include "cselib.h"
#include "ira.h"
+#include "ira-int.h"
#include "target.h"
#ifdef INSN_SCHEDULING
@@ -2907,7 +2908,8 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, rtx_insn *insn)
extract_insn (insn);
preprocess_constraints (insn);
- ira_implicitly_set_insn_hard_regs (&temp);
+ alternative_mask prefrred = get_preferred_alternatives (insn);
+ ira_implicitly_set_insn_hard_regs (&temp, prefrred);
AND_COMPL_HARD_REG_SET (temp, ira_no_alloc_regs);
IOR_HARD_REG_SET (implicit_reg_pending_clobbers, temp);
}
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index 988f9d50719..0a322a84dcb 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -54,6 +54,7 @@ along with GCC; see the file COPYING3. If not see
#include "rtlhooks-def.h"
#include "emit-rtl.h"
#include "ira.h"
+#include "ira-int.h"
#include "rtl-iter.h"
#ifdef INSN_SCHEDULING
@@ -2124,7 +2125,8 @@ implicit_clobber_conflict_p (insn_t through_insn, expr_t expr)
/* Calculate implicit clobbers. */
extract_insn (insn);
preprocess_constraints (insn);
- ira_implicitly_set_insn_hard_regs (&temp);
+ alternative_mask prefrred = get_preferred_alternatives (insn);
+ ira_implicitly_set_insn_hard_regs (&temp, prefrred);
AND_COMPL_HARD_REG_SET (temp, ira_no_alloc_regs);
/* If any implicit clobber registers intersect with regular ones in
diff --git a/gcc/target-globals.c b/gcc/target-globals.c
index 6983b5cc9b5..8b6f3abd647 100644
--- a/gcc/target-globals.c
+++ b/gcc/target-globals.c
@@ -57,6 +57,7 @@ along with GCC; see the file COPYING3. If not see
#include "optabs.h"
#include "libfuncs.h"
#include "cfgloop.h"
+#include "recog.h"
#include "ira-int.h"
#include "builtins.h"
#include "gcse.h"
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d862db0b6cf..4ed3602764d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2015-08-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ Backport from trunk:
+ 2015-08-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR rtl-optimization/67029
+ * gcc.dg/pr67029.c: New test.
+
2015-08-07 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/66929
diff --git a/gcc/testsuite/gcc.dg/pr67029.c b/gcc/testsuite/gcc.dg/pr67029.c
new file mode 100644
index 00000000000..f0023e524e9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr67029.c
@@ -0,0 +1,14 @@
+/* { dg-do compile { target { int128 && scheduling } } } */
+/* { dg-options "-O2 -fschedule-insns" } */
+/* { dg-additional-options "-fstack-protector" { target fstack_protector } } */
+
+extern void fn2 (char *);
+__int128 a, b;
+int
+fn1 (void)
+{
+ char e[32];
+ fn2 (e);
+ b = 9 * (a >> 1);
+ return 0;
+}