From 9b7542b9c27aad34dfd70f4d6c3cc9034b9327a8 Mon Sep 17 00:00:00 2001
From: Joern Rennecke <joern.rennecke@embecosm.com>
Date: Thu, 29 Nov 2012 02:39:20 +0000
Subject: [PATCH] * config/epiphany/epiphany.md (isub_i+1): Work around
 generator bug.

From-SVN: r193919
---
 gcc/ChangeLog                   |  2 ++
 gcc/config/epiphany/epiphany.md | 17 ++++++++++-------
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6a4c7ee3527c..fb11de07682e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -10,6 +10,8 @@
 	* config/epiphany/t-epiphany (SPECS): Set.
 	(specs): New rule.
 
+	* config/epiphany/epiphany.md (isub_i+1): Work around generator bug.
+
 2012-11-28  Jakub Jelinek  <jakub@redhat.com>
 
 	PR debug/36728
diff --git a/gcc/config/epiphany/epiphany.md b/gcc/config/epiphany/epiphany.md
index 21e619c2deaf..fb55e3846fd1 100644
--- a/gcc/config/epiphany/epiphany.md
+++ b/gcc/config/epiphany/epiphany.md
@@ -1024,19 +1024,22 @@
 ; use next_active_insn to look at the 'following' insn.  That should
 ; exist, because peephole2 runs after reload, and there has to be
 ; a return after an fp_int insn.
+; ??? However, we can not even ordinarily match the preceding insn;
+; there is some bug in the generators such that then it leaves out
+; the check for PARALLEL before the length check for the then-second
+; main insn.  Observed when compiling compatibility-atomic-c++0x.cc
+; from libstdc++-v3.
 (define_peephole2
-  [(match_parallel 5 "float_operation" [(match_operand 6 "" "")])
-   (match_parallel 3 "float_operation"
+  [(match_parallel 3 "float_operation"
      [(set (match_operand:SI 0 "gpr_operand" "")
 	   (match_operator:SI 4 "addsub_operator"
 	     [(match_operand:SI 1 "gpr_operand" "")
 	      (match_operand:SI 2 "gpr_operand" "")]))
       (clobber (reg:CC_FP CCFP_REGNUM))])]
-  "get_attr_sched_use_fpu (peep2_next_insn (0))
-   && peep2_regno_dead_p (2, CC_REGNUM)
-   && get_attr_sched_use_fpu (next_active_insn (peep2_next_insn (1)))"
-  [(match_dup 5)
-   (parallel [(set (match_dup 0) (match_dup 4))
+  "get_attr_sched_use_fpu (prev_active_insn (peep2_next_insn (0)))
+   && peep2_regno_dead_p (1, CC_REGNUM)
+   && get_attr_sched_use_fpu (next_active_insn (peep2_next_insn (0)))"
+  [(parallel [(set (match_dup 0) (match_dup 4))
 	      (clobber (reg:CC CC_REGNUM))])]
 )
 
-- 
GitLab