public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH][ARM/AArch64] PR 68088: Fix RTL checking ICE due to subregs inside accumulator forwarding check
@ 2015-10-28 10:08 Kyrill Tkachov
  2015-10-29 13:50 ` Marcus Shawcroft
  2015-11-06 12:26 ` Nikolai Bozhenov
  0 siblings, 2 replies; 15+ messages in thread
From: Kyrill Tkachov @ 2015-10-28 10:08 UTC (permalink / raw)
  To: GCC Patches
  Cc: Marcus Shawcroft, Ramana Radhakrishnan, Richard Earnshaw,
	James Greenhalgh

[-- Attachment #1: Type: text/plain, Size: 1420 bytes --]

Hi all,

This RTL checking error occurs on aarch64 in aarch_accumulator_forwarding when processing an msubsi insn
with subregs:
(insn 15 14 16 3 (set (reg/v:SI 78 [ i ])
         (minus:SI (subreg:SI (reg/v:DI 76 [ aul ]) 0)
             (mult:SI (subreg:SI (reg:DI 83) 0)
                 (subreg:SI (reg:DI 75 [ _20 ]) 0)))) schedice.c:10 357 {*msubsi}

The register_operand predicate for that pattern allows subregs (I think correctly).
The code in aarch_accumulator_forwarding doesn't take that into account and ends up
taking a REGNO of a SUBREG, causing a checking error.

This patch fixes that by stripping the subregs off the accumulator rtx before
checking that the inner expression is a REG and taking its REGNO.

The testcase now works fine with an aarch64-none-elf toolchain configure for RTL checking.

The testcase is taken verbatim from the BZ entry for PR 68088.
Since this function is shared between arm and aarch64 I've bootstrapped and tested it on both
and I'll need ok's for both ports.

Ok for trunk?

Thanks,
Kyrill

2015-10-28  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

     PR target/68088
     * config/arm/aarch-common.c (aarch_strip_subreg): New function.
     (aarch_accumulator_forwarding): Strip subregs from accumulator rtx
     when appropriate.

2015-10-28  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

     * gcc.target/aarch64/pr68088_1.c: New test.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: aarch64-accum-rtl-check-fix.patch --]
[-- Type: text/x-patch; name=aarch64-accum-rtl-check-fix.patch, Size: 2777 bytes --]

commit 7ce1b9ec8b8486cab34071a9c120db13e7c3b96a
Author: Kyrylo Tkachov <kyrylo.tkachov@arm.com>
Date:   Tue Oct 27 11:42:19 2015 +0000

    [ARM/AArch64] PR 68088: Fix RTL checking ICE due to subregs inside accumulator forwarding check

diff --git a/gcc/config/arm/aarch-common.c b/gcc/config/arm/aarch-common.c
index a940a02..2a21c4e 100644
--- a/gcc/config/arm/aarch-common.c
+++ b/gcc/config/arm/aarch-common.c
@@ -389,6 +389,15 @@ arm_mac_accumulator_is_result (rtx producer, rtx consumer)
           && !reg_overlap_mentioned_p (result, op1));
 }
 
+/* If X is a subreg return the value it contains, otherwise
+   return X unchanged.  */
+
+static rtx
+aarch_strip_subreg (rtx x)
+{
+  return GET_CODE (x) == SUBREG ? SUBREG_REG (x) : x;
+}
+
 /* Return non-zero if the destination of PRODUCER feeds the accumulator
    operand of an MLA-like operation.  */
 
@@ -420,14 +429,14 @@ aarch_accumulator_forwarding (rtx_insn *producer, rtx_insn *consumer)
     case PLUS:
       /* Possibly an MADD.  */
       if (GET_CODE (XEXP (mla, 0)) == MULT)
-	accumulator = XEXP (mla, 1);
+	accumulator = aarch_strip_subreg (XEXP (mla, 1));
       else
 	return 0;
       break;
     case MINUS:
       /* Possibly an MSUB.  */
       if (GET_CODE (XEXP (mla, 1)) == MULT)
-	accumulator = XEXP (mla, 0);
+	accumulator = aarch_strip_subreg (XEXP (mla, 0));
       else
 	return 0;
       break;
@@ -441,7 +450,7 @@ aarch_accumulator_forwarding (rtx_insn *producer, rtx_insn *consumer)
 
 	    {
 	      /* FMADD/FMSUB.  */
-	      accumulator = XEXP (mla, 2);
+	      accumulator = aarch_strip_subreg (XEXP (mla, 2));
 	    }
 	  else if (REG_P (XEXP (mla, 1))
 		   && GET_CODE (XEXP (mla, 2)) == NEG
@@ -449,7 +458,7 @@ aarch_accumulator_forwarding (rtx_insn *producer, rtx_insn *consumer)
 		       || GET_CODE (XEXP (mla, 0)) == NEG))
 	    {
 	      /* FNMADD/FNMSUB.  */
-	      accumulator = XEXP (XEXP (mla, 2), 0);
+	      accumulator = aarch_strip_subreg (XEXP (XEXP (mla, 2), 0));
 	    }
 	  else
 	    return 0;
@@ -460,6 +469,9 @@ aarch_accumulator_forwarding (rtx_insn *producer, rtx_insn *consumer)
 	return 0;
     }
 
+  if (!REG_P (accumulator))
+    return 0;
+
   return (REGNO (dest) == REGNO (accumulator));
 }
 
diff --git a/gcc/testsuite/gcc.target/aarch64/pr68088_1.c b/gcc/testsuite/gcc.target/aarch64/pr68088_1.c
new file mode 100644
index 0000000..49c6aa1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr68088_1.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void bar (unsigned long);
+
+void
+foo (unsigned long aul, unsigned m, unsigned i)
+{
+  while (1)
+    {
+      aul += i;
+      i = aul % m;
+      bar (aul);
+    }
+}

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2015-11-09  9:22 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-28 10:08 [PATCH][ARM/AArch64] PR 68088: Fix RTL checking ICE due to subregs inside accumulator forwarding check Kyrill Tkachov
2015-10-29 13:50 ` Marcus Shawcroft
2015-10-29 14:00   ` Kyrill Tkachov
2015-10-29 14:02     ` Marcus Shawcroft
2015-10-29 14:18       ` Kyrill Tkachov
2015-11-06 11:39         ` Kyrill Tkachov
2015-11-06 11:50         ` Ramana Radhakrishnan
2015-11-06 12:26 ` Nikolai Bozhenov
2015-11-06 13:46   ` Ramana Radhakrishnan
2015-11-06 17:08     ` Nikolai Bozhenov
2015-11-06 17:09       ` Kyrill Tkachov
2015-11-06 17:16         ` Kyrill Tkachov
2015-11-09  8:14           ` Nikolai Bozhenov
2015-11-09  9:22             ` Kyrill Tkachov
2015-11-06 17:32         ` Nikolai Bozhenov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).