From de6fba39f3ad3790ba8efe47c764b5fe167155d3 Mon Sep 17 00:00:00 2001
From: Ulrich Weigand <uweigand@de.ibm.com>
Date: Fri, 21 Nov 2014 15:33:27 +0000
Subject: [PATCH] re PR rtl-optimization/63952 (bootstrap failure (ICE in
 prepare_cmp_insn) on s390x in libjava)

	PR rtl-optimization/63952
	* optabs.c (prepare_cmp_insn): Do not call can_compare_p for CCmode.
	* config/s390/s390.md ("cbranchcc4"): Accept any s390_comparison.
	Remove incorrect TARGET_HARD_FLOAT check and no-op expander code.

From-SVN: r217929
---
 gcc/ChangeLog           |  7 +++++++
 gcc/config/s390/s390.md | 11 ++++-------
 gcc/optabs.c            |  7 +++++--
 3 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4a4597877f3b..9e0926120d02 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-11-21  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+	PR rtl-optimization/63952
+	* optabs.c (prepare_cmp_insn): Do not call can_compare_p for CCmode.
+	* config/s390/s390.md ("cbranchcc4"): Accept any s390_comparison.
+	Remove incorrect TARGET_HARD_FLOAT check and no-op expander code.
+
 2014-11-21  Ilya Tocar  <ilya.tocar@intel.com>
 
 	* common/config/i386/i386-common.c (OPTION_MASK_ISA_AVX512IFMA_SET,
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index b9fbf23513d5..6ba656474697 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -8142,16 +8142,13 @@
 
 (define_expand "cbranchcc4"
   [(set (pc)
-        (if_then_else (match_operator 0 "s390_eqne_operator"
+        (if_then_else (match_operator 0 "s390_comparison"
         	       [(match_operand 1 "cc_reg_operand" "")
-                        (match_operand 2 "const0_operand" "")])
+                        (match_operand 2 "const_int_operand" "")])
 		      (label_ref (match_operand 3 "" ""))
                       (pc)))]
-  "TARGET_HARD_FLOAT"
-  "s390_emit_jump (operands[3],
-    s390_emit_compare (GET_CODE (operands[0]), operands[1], operands[2]));
-   DONE;")
-
+  ""
+  "")
 
 
 ;;
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 35ee7ece9aed..f8d584eeeb11 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -4167,8 +4167,11 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx_code comparison, rtx size,
 
   if (GET_MODE_CLASS (mode) == MODE_CC)
     {
-      gcc_assert (can_compare_p (comparison, CCmode, ccp_jump));
-      *ptest = gen_rtx_fmt_ee (comparison, VOIDmode, x, y);
+      enum insn_code icode = optab_handler (cbranch_optab, CCmode);
+      test = gen_rtx_fmt_ee (comparison, VOIDmode, x, y);
+      gcc_assert (icode != CODE_FOR_nothing
+                  && insn_operand_matches (icode, 0, test));
+      *ptest = test;
       return;
     }
 
-- 
GitLab