Re: [PATCH, CHKP, i386, PR target/65167] Avoid motion of bounds args during scheduling

2015-02-25 Thread Uros Bizjak
On Wed, Feb 25, 2015 at 3:47 PM, Uros Bizjak  wrote:
> Hello!
>
>> 2015-02-25  Ilya Enkovich  
>>
>> 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  
>>
>> PR target/65167
>> * gcc.target/i386/pr65167.c: New.
>
> OK for mainline with a small change below.

Ah, I missed the explanation w.r.t __builtin_apply_args in the PR.

The patch is OK as it is.

Thanks,
Uros.


Re: [PATCH, CHKP, i386, PR target/65167] Avoid motion of bounds args during scheduling

2015-02-25 Thread Uros Bizjak
Hello!

> 2015-02-25  Ilya Enkovich  
>
> 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  
>
> PR target/65167
> * gcc.target/i386/pr65167.c: New.

OK for mainline with a small change below.

+  if (TARGET_MPX && BND_REGNO_P (regno))
+return true;

The check for TARGET_MPX is not needed.

Uros.


[PATCH, CHKP, i386, PR target/65167] Avoid motion of bounds args during scheduling

2015-02-25 Thread Ilya Enkovich
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  

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  

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 000..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;
+}