Hi, This patch adds support for bounds registers into args recognition mechanism used by scheduler. Bootstrapped and tested on x86_64-unknown-linux-gnu. OK for trunk?
Thanks, Ilya -- gcc/ 2015-02-25 Ilya Enkovich <ilya.enkov...@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. gcc/testsuite/ 2015-02-25 Ilya Enkovich <ilya.enkov...@intel.com> PR target/65167 * gcc.target/i386/pr65167.c: New. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 71a5b22..acbe25f 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -6068,6 +6068,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) @@ -26846,6 +26849,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/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; +}