diff mbox

PR target/72748: Convert V1TImode register to TImode in debug insn

Message ID 20160729183413.GA20050@intel.com
State New
Headers show

Commit Message

H.J. Lu July 29, 2016, 6:34 p.m. UTC
TImode register referenced in debug insn can be converted to V1TImode by
scalar to vector optimization.  When converting a TImode store to V1TImode,
we need to check all debug insns on its use chain to convert the V1TImode
register to SUBREG TImode if source register is undefined.

Tested on x86-64.  OK for trunk?

H.J.
---
gcc/

	PR target/72748
	* config/i386/i386.c (timode_scalar_chain::convert_insn): Call
	fix_debug_reg_uses after changing source register mode to
	V1TImode if source register is undefined.

gcc/testsuite/

	* gcc.target/i386/pr72748.c: New test.
---
 gcc/config/i386/i386.c                  |  6 ++++++
 gcc/testsuite/gcc.target/i386/pr72748.c | 27 +++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr72748.c

Comments

Uros Bizjak July 30, 2016, 9:57 a.m. UTC | #1
On Fri, Jul 29, 2016 at 8:34 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> TImode register referenced in debug insn can be converted to V1TImode by
> scalar to vector optimization.  When converting a TImode store to V1TImode,
> we need to check all debug insns on its use chain to convert the V1TImode
> register to SUBREG TImode if source register is undefined.
>
> Tested on x86-64.  OK for trunk?

OK.

Thanks,
Uros.

> H.J.
> ---
> gcc/
>
>         PR target/72748
>         * config/i386/i386.c (timode_scalar_chain::convert_insn): Call
>         fix_debug_reg_uses after changing source register mode to
>         V1TImode if source register is undefined.
>
> gcc/testsuite/
>
>         * gcc.target/i386/pr72748.c: New test.
> ---
>  gcc/config/i386/i386.c                  |  6 ++++++
>  gcc/testsuite/gcc.target/i386/pr72748.c | 27 +++++++++++++++++++++++++++
>  2 files changed, 33 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr72748.c
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 7c8bb17..93eaab1 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -3858,6 +3858,12 @@ timode_scalar_chain::convert_insn (rtx_insn *insn)
>    switch (GET_CODE (src))
>      {
>      case REG:
> +      PUT_MODE (src, V1TImode);
> +      /* Call fix_debug_reg_uses only if SRC is never defined.  */
> +      if (!DF_REG_DEF_CHAIN (REGNO (src)))
> +       fix_debug_reg_uses (src);
> +      break;
> +
>      case MEM:
>        PUT_MODE (src, V1TImode);
>        break;
> diff --git a/gcc/testsuite/gcc.target/i386/pr72748.c b/gcc/testsuite/gcc.target/i386/pr72748.c
> new file mode 100644
> index 0000000..0d5e4f5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr72748.c
> @@ -0,0 +1,27 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -g" } */
> +
> +volatile int a;
> +int c, d, e, f, g, h;
> +
> +int fn1 ()
> +{
> +  int i;
> +  for (; d;)
> +    {
> +      if (e)
> +        break;
> +      g = 0;
> +      int j[4];
> +      for (h = 0; h < 4; h++)
> +        g++;
> +      for (; c < 2; c++)
> +        {
> +          e = j[g];
> +          i = j[0];
> +          f = 4;
> +        }
> +      f |= d;
> +    }
> +  return a;
> +}
> --
> 2.7.4
>
diff mbox

Patch

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 7c8bb17..93eaab1 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -3858,6 +3858,12 @@  timode_scalar_chain::convert_insn (rtx_insn *insn)
   switch (GET_CODE (src))
     {
     case REG:
+      PUT_MODE (src, V1TImode);
+      /* Call fix_debug_reg_uses only if SRC is never defined.  */
+      if (!DF_REG_DEF_CHAIN (REGNO (src)))
+	fix_debug_reg_uses (src);
+      break;
+
     case MEM:
       PUT_MODE (src, V1TImode);
       break;
diff --git a/gcc/testsuite/gcc.target/i386/pr72748.c b/gcc/testsuite/gcc.target/i386/pr72748.c
new file mode 100644
index 0000000..0d5e4f5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr72748.c
@@ -0,0 +1,27 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2 -g" } */
+
+volatile int a;
+int c, d, e, f, g, h;
+
+int fn1 ()
+{ 
+  int i;
+  for (; d;)
+    { 
+      if (e)
+        break;
+      g = 0;
+      int j[4];
+      for (h = 0; h < 4; h++)
+        g++;
+      for (; c < 2; c++)
+        { 
+          e = j[g];
+          i = j[0];
+          f = 4;
+        }
+      f |= d;
+    }
+  return a;
+}