aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIlya Enkovich <ilya.enkovich@intel.com>2015-02-25 15:05:48 +0000
committerIlya Enkovich <ienkovich@gcc.gnu.org>2015-02-25 15:05:48 +0000
commita2273e72f3bbb2ddbeb720e60f3f33d68530f5df (patch)
tree38f2c159faf2827a2e0e4842481ea166392c88a9 /gcc
parenteeaccc07751f304cfe79fa5b7706264f6d56f5a5 (diff)
downloadgcc-a2273e72f3bbb2ddbeb720e60f3f33d68530f5df.zip
gcc-a2273e72f3bbb2ddbeb720e60f3f33d68530f5df.tar.gz
gcc-a2273e72f3bbb2ddbeb720e60f3f33d68530f5df.tar.bz2
re PR target/65167 (ICE: in assign_by_spills, at lra-assigns.c:1383 (unable to find a register to spill) with -O -fschedule-insns -fcheck-pointer-bounds -mmpx)
gcc/ PR target/65167 * gcc/config/i386/i386.c (ix86_function_arg_regno_p): Support bounds registers. (avoid_func_arg_motion): Add dependencies for BNDSTX insns. gcc/testsuite/ PR target/65167 * gcc.target/i386/pr65167.c: New. From-SVN: r220970
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr65167.c11
4 files changed, 36 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1e2b609..6e9faf9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2015-02-25 Ilya Enkovich <ilya.enkovich@intel.com>
+
+ PR target/65167
+ * gcc/config/i386/i386.c (ix86_function_arg_regno_p): Support
+ bounds registers.
+ (avoid_func_arg_motion): Add dependencies for BNDSTX insns.
+
2015-02-25 Alan Lawrence <alan.lawrence@arm.com>
PR target/64997
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index bc4fb4b..a1cb5da 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -6120,6 +6120,9 @@ ix86_function_arg_regno_p (int regno)
int i;
const int *parm_regs;
+ if (TARGET_MPX && BND_REGNO_P (regno))
+ return true;
+
if (!TARGET_64BIT)
{
if (TARGET_MACHO)
@@ -26898,6 +26901,16 @@ avoid_func_arg_motion (rtx_insn *first_arg, rtx_insn *insn)
rtx set;
rtx tmp;
+ /* Add anti dependencies for bounds stores. */
+ if (INSN_P (insn)
+ && GET_CODE (PATTERN (insn)) == PARALLEL
+ && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == UNSPEC
+ && XINT (XVECEXP (PATTERN (insn), 0, 0), 1) == UNSPEC_BNDSTX)
+ {
+ add_dependence (first_arg, insn, REG_DEP_ANTI);
+ return;
+ }
+
set = single_set (insn);
if (!set)
return;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 49bf525..199b967 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-02-25 Ilya Enkovich <ilya.enkovich@intel.com>
+
+ PR target/65167
+ * gcc.target/i386/pr65167.c: New.
+
2015-02-25 Kai Tietz <ktietz@redhat.com>
PR tree-optimization/61917
diff --git a/gcc/testsuite/gcc.target/i386/pr65167.c b/gcc/testsuite/gcc.target/i386/pr65167.c
new file mode 100644
index 0000000..35f3d6b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr65167.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target mpx } */
+/* { dg-options "-O -fschedule-insns -fcheck-pointer-bounds -mmpx" } */
+
+void bar(int *a, int *b, int *c, int *d, int *e, int *f);
+
+int foo (int *a, int *b, int *c, int *d, int *e, int *f)
+{
+ bar (a, b, c, d, e, f);
+ return *f;
+}