public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Jakub Jelinek <jakub@redhat.com>
To: git-commits@fedoraproject.org
Subject: [rpms/gcc] rhel-f41-base: 12.0.1-0.9
Date: Mon, 29 Jun 2026 12:29:42 GMT	[thread overview]
Message-ID: <178273618204.1.7702718603087934916.rpms-gcc-b0dddd2d05f2@fedoraproject.org> (raw)

A new commit has been pushed.

Repo   : rpms/gcc
Branch : rhel-f41-base
Commit : b0dddd2d05f29e68631c9155f3eee6a9536c0cf1
Author : Jakub Jelinek <jakub@redhat.com>
Date   : 2022-02-22T11:56:00+01:00
Stats  : +23/-1349 in 5 file(s)
URL    : https://src.fedoraproject.org/rpms/gcc/c/b0dddd2d05f29e68631c9155f3eee6a9536c0cf1?branch=rhel-f41-base

Log:
12.0.1-0.9

---
diff --git a/.gitignore b/.gitignore
index 03460fe..c50297c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -64,3 +64,4 @@
 /gcc-12.0.1-20220205.tar.xz
 /gcc-12.0.1-20220212.tar.xz
 /gcc-12.0.1-20220214.tar.xz
+/gcc-12.0.1-20220222.tar.xz

diff --git a/gcc.spec b/gcc.spec
index 374c15e..45e45f7 100644
--- a/gcc.spec
+++ b/gcc.spec
@@ -1,5 +1,5 @@
-%global DATE 20220214
-%global gitrev 7222fb983d798306a83666324a92fce5e5881eb7
+%global DATE 20220222
+%global gitrev 9780ea50d2a0fb2b07bc9a0f71e28e9c1ef5e235
 %global gcc_version 12.0.1
 %global gcc_major 12
 # Note, gcc_release must be integer, if you want to add suffixes to
@@ -120,7 +120,7 @@
 Summary: Various compilers (C, C++, Objective-C, ...)
 Name: gcc
 Version: %{gcc_version}
-Release: %{gcc_release}.8%{?dist}
+Release: %{gcc_release}.9%{?dist}
 # libgcc, libgfortran, libgomp, libstdc++ and crtstuff have
 # GCC Runtime Exception.
 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
@@ -270,8 +270,6 @@ Patch8: gcc12-no-add-needed.patch
 Patch9: gcc12-Wno-format-security.patch
 Patch10: gcc12-rh1574936.patch
 Patch11: gcc12-d-shared-libphobos.patch
-Patch12: gcc12-ifcvt-revert.patch
-Patch13: gcc12-pr104253.patch
 
 Patch100: gcc12-fortran-fdec-duplicates.patch
 Patch101: gcc12-fortran-flogical-as-integer.patch
@@ -793,8 +791,6 @@ to NVidia PTX capable devices if available.
 %patch10 -p0 -b .rh1574936~
 %endif
 %patch11 -p0 -b .d-shared-libphobos~
-%patch12 -p0 -b .ifcvt-revert~
-%patch13 -p0 -b .pr104253~
 
 %if 0%{?rhel} >= 9
 %patch100 -p1 -b .fortran-fdec-duplicates~
@@ -824,6 +820,7 @@ cp -a libstdc++-v3/config/cpu/i{4,3}86/atomicity.h
 LC_ALL=C sed -i -e 's/\xa0/ /' gcc/doc/options.texi
 
 sed -i -e 's/Common Driver Var(flag_report_bug)/& Init(1)/' gcc/common.opt
+sed -i -e 's/context->report_bug = false;/context->report_bug = true;/' gcc/diagnostic.cc
 
 %ifarch ppc
 if [ -d libstdc++-v3/config/abi/post/powerpc64-linux-gnu ]; then
@@ -3167,6 +3164,23 @@ end
 %endif
 
 %changelog
+* Tue Feb 22 2022 Jakub Jelinek <jakub@redhat.com> 12.0.1-0.9
+- update from trunk
+  - PRs analyzer/104524, analyzer/104560, analyzer/104576, c++/85493,
+	c++/90451, c++/94944, c++/95036, c++/104107, c++/104507, c++/104539,
+	c++/104565, c/104506, c/104510, c/104531, c/104532, debug/104517,
+	debug/104557, fortran/77693, fortran/104211, libstdc++/104542,
+	libstdc++/104559, lto/104617, middle-end/104355, middle-end/104522,
+	rtl-optimization/104447, rtl-optimization/104498,
+	rtl-optimization/104544, sanitizer/102656, target/99708, target/99881,
+	target/100056, target/100874, target/103069, target/104253,
+	target/104257, target/104335, target/104440, target/104448,
+	target/104536, target/104581, target/104598, target/104612,
+	testsuite/104146, tree-optimization/96881, tree-optimization/103771,
+	tree-optimization/104519, tree-optimization/104526,
+	tree-optimization/104543, tree-optimization/104551,
+	tree-optimization/104582, tree-optimization/104604
+
 * Mon Feb 14 2022 Jakub Jelinek <jakub@redhat.com> 12.0.1-0.8
 - update from trunk
   - PRs ada/97504, ada/98724, c/104505, fortran/104228, libstdc++/100912,

diff --git a/gcc12-ifcvt-revert.patch b/gcc12-ifcvt-revert.patch
deleted file mode 100644
index dd13271..0000000
--- a/gcc12-ifcvt-revert.patch
+++ /dev/null
@@ -1,1141 +0,0 @@
-Revert r12-674{3,4,5,6,7,8,9} and r12-7114, as there are several PRs reported
-against those changes still unresolved.
-
---- gcc/ifcvt.cc
-+++ gcc/ifcvt.cc
-@@ -3391,11 +3391,7 @@ noce_convert_multiple_sets_1 (struct noce_if_info *if_info,
-   rtx cond = noce_get_condition (jump, &cond_earliest, false);
- 
-   rtx cc_cmp = cond_exec_get_condition (jump);
--  if (cc_cmp)
--    cc_cmp = copy_rtx (cc_cmp);
-   rtx rev_cc_cmp = cond_exec_get_condition (jump, /* get_reversed */ true);
--  if (rev_cc_cmp)
--    rev_cc_cmp = copy_rtx (rev_cc_cmp);
- 
-   rtx_insn *insn;
-   int count = 0;
-@@ -3519,7 +3515,6 @@ noce_convert_multiple_sets_1 (struct noce_if_info *if_info,
-       unsigned cost1 = 0, cost2 = 0;
-       rtx_insn *seq, *seq1, *seq2;
-       rtx temp_dest = NULL_RTX, temp_dest1 = NULL_RTX, temp_dest2 = NULL_RTX;
--      bool read_comparison = false;
- 
-       seq1 = try_emit_cmove_seq (if_info, temp, cond,
- 				 new_val, old_val, need_cmov,
-@@ -3529,41 +3524,10 @@ noce_convert_multiple_sets_1 (struct noce_if_info *if_info,
- 	 as well.  This allows the backend to emit a cmov directly without
- 	 creating an additional compare for each.  If successful, costing
- 	 is easier and this sequence is usually preferred.  */
--      seq2 = try_emit_cmove_seq (if_info, temp, cond,
-+      seq2 = try_emit_cmove_seq (if_info, target, cond,
- 				 new_val, old_val, need_cmov,
- 				 &cost2, &temp_dest2, cc_cmp, rev_cc_cmp);
- 
--      /* The backend might have created a sequence that uses the
--	 condition.  Check this.  */
--      rtx_insn *walk = seq2;
--      while (walk)
--	{
--	  rtx set = single_set (walk);
--
--	  if (!set || !SET_SRC (set))
--	    {
--	      walk = NEXT_INSN (walk);
--	      continue;
--	    }
--
--	  rtx src = SET_SRC (set);
--
--	  if (XEXP (set, 1) && GET_CODE (XEXP (set, 1)) == IF_THEN_ELSE)
--	    ; /* We assume that this is the cmove created by the backend that
--		 naturally uses the condition.  Therefore we ignore it.  */
--	  else
--	    {
--	      if (reg_mentioned_p (XEXP (cond, 0), src)
--		  || reg_mentioned_p (XEXP (cond, 1), src))
--		{
--		  read_comparison = true;
--		  break;
--		}
--	    }
--
--	  walk = NEXT_INSN (walk);
--	}
--
-       /* Check which version is less expensive.  */
-       if (seq1 != NULL_RTX && (cost1 <= cost2 || seq2 == NULL_RTX))
- 	{
-@@ -3576,8 +3540,6 @@ noce_convert_multiple_sets_1 (struct noce_if_info *if_info,
- 	{
- 	  seq = seq2;
- 	  temp_dest = temp_dest2;
--	  if (!second_try && read_comparison)
--	    *last_needs_comparison = count;
- 	}
-       else
- 	{
-@@ -3596,12 +3558,6 @@ noce_convert_multiple_sets_1 (struct noce_if_info *if_info,
-       unmodified_insns->safe_push (insn);
-     }
- 
--  /* Even if we did not actually need the comparison, we want to make sure
--     to try a second time in order to get rid of the temporaries.  */
--  if (*last_needs_comparison == -1)
--    *last_needs_comparison = 0;
--
--
-   return true;
- }
- 
---- gcc/config/rs6000/rs6000.cc
-+++ gcc/config/rs6000/rs6000.cc
-@@ -16373,10 +16373,10 @@ rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
-     c = GEU;
- 
-   if (code == SMAX || code == UMAX)
--    target = emit_conditional_move (dest, { c, op0, op1, mode },
-+    target = emit_conditional_move (dest, c, op0, op1, mode,
- 				    op0, op1, mode, 0);
-   else
--    target = emit_conditional_move (dest, { c, op0, op1, mode },
-+    target = emit_conditional_move (dest, c, op0, op1, mode,
- 				    op1, op0, mode, 0);
-   gcc_assert (target);
-   if (target != dest)
-@@ -22769,7 +22769,7 @@ rs6000_emit_swsqrt (rtx dst, rtx src, bool recip)
- 
-       if (mode == SFmode)
- 	{
--	  rtx target = emit_conditional_move (e, { GT, src, zero, mode },
-+	  rtx target = emit_conditional_move (e, GT, src, zero, mode,
- 					      e, zero, mode, 0);
- 	  if (target != e)
- 	    emit_move_insn (e, target);
---- gcc/expmed.cc
-+++ gcc/expmed.cc
-@@ -4124,8 +4124,8 @@ expand_sdiv_pow2 (scalar_int_mode mode, rtx op0, HOST_WIDE_INT d)
-       temp = force_reg (mode, temp);
- 
-       /* Construct "temp2 = (temp2 < 0) ? temp : temp2".  */
--      temp2 = emit_conditional_move (temp2, { LT, temp2, const0_rtx, mode },
--				     temp, temp2, mode, 0);
-+      temp2 = emit_conditional_move (temp2, LT, temp2, const0_rtx,
-+				     mode, temp, temp2, mode, 0);
-       if (temp2)
- 	{
- 	  rtx_insn *seq = get_insns ();
-@@ -6127,10 +6127,10 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
- 	return 0;
- 
-       if (and_them)
--	tem = emit_conditional_move (target, { code, op0, op1, mode },
-+	tem = emit_conditional_move (target, code, op0, op1, mode,
- 				     tem, const0_rtx, GET_MODE (tem), 0);
-       else
--	tem = emit_conditional_move (target, { code, op0, op1, mode },
-+	tem = emit_conditional_move (target, code, op0, op1, mode,
- 				     trueval, tem, GET_MODE (tem), 0);
- 
-       if (tem == 0)
---- gcc/expr.cc
-+++ gcc/expr.cc
-@@ -8824,9 +8824,8 @@ expand_cond_expr_using_cmove (tree treeop0 ATTRIBUTE_UNUSED,
-     op2 = gen_lowpart (mode, op2);
- 
-   /* Try to emit the conditional move.  */
--  insn = emit_conditional_move (temp,
--				{ comparison_code, op00, op01,
--				  comparison_mode },
-+  insn = emit_conditional_move (temp, comparison_code,
-+				op00, op01, comparison_mode,
- 				op1, op2, mode,
- 				unsignedp);
- 
-@@ -9717,9 +9716,8 @@ expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode,
- 	    start_sequence ();
- 
- 	    /* Try to emit the conditional move.  */
--	    insn = emit_conditional_move (target,
--					  { comparison_code,
--					    op0, cmpop1, mode },
-+	    insn = emit_conditional_move (target, comparison_code,
-+					  op0, cmpop1, mode,
- 					  op0, op1, mode,
- 					  unsignedp);
- 
---- gcc/ifcvt.cc
-+++ gcc/ifcvt.cc
-@@ -83,7 +83,7 @@ static rtx_insn *last_active_insn (basic_block, int);
- static rtx_insn *find_active_insn_before (basic_block, rtx_insn *);
- static rtx_insn *find_active_insn_after (basic_block, rtx_insn *);
- static basic_block block_fallthru (basic_block);
--static rtx cond_exec_get_condition (rtx_insn *, bool);
-+static rtx cond_exec_get_condition (rtx_insn *);
- static rtx noce_get_condition (rtx_insn *, rtx_insn **, bool);
- static int noce_operand_ok (const_rtx);
- static void merge_if_block (ce_if_block *);
-@@ -98,14 +98,6 @@ static int dead_or_predicable (basic_block, basic_block, basic_block,
- 			       edge, int);
- static void noce_emit_move_insn (rtx, rtx);
- static rtx_insn *block_has_only_trap (basic_block);
--static void need_cmov_or_rewire (basic_block, hash_set<rtx_insn *> *,
--				 hash_map<rtx_insn *, int> *);
--static bool noce_convert_multiple_sets_1 (struct noce_if_info *,
--					  hash_set<rtx_insn *> *,
--					  hash_map<rtx_insn *, int> *,
--					  auto_vec<rtx> *,
--					  auto_vec<rtx> *,
--					  auto_vec<rtx_insn *> *, int *);
- \f
- /* Count the number of non-jump active insns in BB.  */
- 
-@@ -433,7 +425,7 @@ cond_exec_process_insns (ce_if_block *ce_info ATTRIBUTE_UNUSED,
- /* Return the condition for a jump.  Do not do any special processing.  */
- 
- static rtx
--cond_exec_get_condition (rtx_insn *jump, bool get_reversed = false)
-+cond_exec_get_condition (rtx_insn *jump)
- {
-   rtx test_if, cond;
- 
-@@ -445,10 +437,8 @@ cond_exec_get_condition (rtx_insn *jump, bool get_reversed = false)
- 
-   /* If this branches to JUMP_LABEL when the condition is false,
-      reverse the condition.  */
--  if (get_reversed
--      || (GET_CODE (XEXP (test_if, 2)) == LABEL_REF
--	  && label_ref_label (XEXP (test_if, 2))
--	  == JUMP_LABEL (jump)))
-+  if (GET_CODE (XEXP (test_if, 2)) == LABEL_REF
-+      && label_ref_label (XEXP (test_if, 2)) == JUMP_LABEL (jump))
-     {
-       enum rtx_code rev = reversed_comparison_code (cond, jump);
-       if (rev == UNKNOWN)
-@@ -780,7 +770,7 @@ static int noce_try_addcc (struct noce_if_info *);
- static int noce_try_store_flag_constants (struct noce_if_info *);
- static int noce_try_store_flag_mask (struct noce_if_info *);
- static rtx noce_emit_cmove (struct noce_if_info *, rtx, enum rtx_code, rtx,
--			    rtx, rtx, rtx, rtx = NULL, rtx = NULL);
-+			    rtx, rtx, rtx);
- static int noce_try_cmove (struct noce_if_info *);
- static int noce_try_cmove_arith (struct noce_if_info *);
- static rtx noce_get_alt_condition (struct noce_if_info *, rtx, rtx_insn **);
-@@ -1719,8 +1709,7 @@ noce_try_store_flag_mask (struct noce_if_info *if_info)
- 
- static rtx
- noce_emit_cmove (struct noce_if_info *if_info, rtx x, enum rtx_code code,
--		 rtx cmp_a, rtx cmp_b, rtx vfalse, rtx vtrue, rtx cc_cmp,
--		 rtx rev_cc_cmp)
-+		 rtx cmp_a, rtx cmp_b, rtx vfalse, rtx vtrue)
- {
-   rtx target ATTRIBUTE_UNUSED;
-   int unsignedp ATTRIBUTE_UNUSED;
-@@ -1752,30 +1741,23 @@ noce_emit_cmove (struct noce_if_info *if_info, rtx x, enum rtx_code code,
-       end_sequence ();
-     }
- 
--  unsignedp = (code == LTU || code == GEU
--	       || code == LEU || code == GTU);
--
--  if (cc_cmp != NULL_RTX && rev_cc_cmp != NULL_RTX)
--    target = emit_conditional_move (x, cc_cmp, rev_cc_cmp,
--				    vtrue, vfalse, GET_MODE (x));
--  else
-+  /* Don't even try if the comparison operands are weird
-+     except that the target supports cbranchcc4.  */
-+  if (! general_operand (cmp_a, GET_MODE (cmp_a))
-+      || ! general_operand (cmp_b, GET_MODE (cmp_b)))
-     {
--      /* Don't even try if the comparison operands are weird
--	 except that the target supports cbranchcc4.  */
--      if (! general_operand (cmp_a, GET_MODE (cmp_a))
--	  || ! general_operand (cmp_b, GET_MODE (cmp_b)))
--	{
--	  if (!have_cbranchcc4
--	      || GET_MODE_CLASS (GET_MODE (cmp_a)) != MODE_CC
--	      || cmp_b != const0_rtx)
--	    return NULL_RTX;
--	}
--
--      target = emit_conditional_move (x, { code, cmp_a, cmp_b, VOIDmode },
--				      vtrue, vfalse, GET_MODE (x),
--				      unsignedp);
-+      if (!have_cbranchcc4
-+	  || GET_MODE_CLASS (GET_MODE (cmp_a)) != MODE_CC
-+	  || cmp_b != const0_rtx)
-+	return NULL_RTX;
-     }
- 
-+  unsignedp = (code == LTU || code == GEU
-+	       || code == LEU || code == GTU);
-+
-+  target = emit_conditional_move (x, code, cmp_a, cmp_b, VOIDmode,
-+				  vtrue, vfalse, GET_MODE (x),
-+				  unsignedp);
-   if (target)
-     return target;
- 
-@@ -1811,9 +1793,8 @@ noce_emit_cmove (struct noce_if_info *if_info, rtx x, enum rtx_code code,
- 
-       promoted_target = gen_reg_rtx (GET_MODE (reg_vtrue));
- 
--      target = emit_conditional_move (promoted_target,
--				      { code, cmp_a, cmp_b, VOIDmode },
--				      reg_vtrue, reg_vfalse,
-+      target = emit_conditional_move (promoted_target, code, cmp_a, cmp_b,
-+				      VOIDmode, reg_vtrue, reg_vfalse,
- 				      GET_MODE (reg_vtrue), unsignedp);
-       /* Nope, couldn't do it in that mode either.  */
-       if (!target)
-@@ -3160,50 +3141,6 @@ bb_valid_for_noce_process_p (basic_block test_bb, rtx cond,
-   return false;
- }
- 
--/* Helper function to emit a cmov sequence encapsulated in
--   start_sequence () and end_sequence ().  If NEED_CMOV is true
--   we call noce_emit_cmove to create a cmove sequence.  Otherwise emit
--   a simple move.  If successful, store the first instruction of the
--   sequence in TEMP_DEST and the sequence costs in SEQ_COST.  */
--
--static rtx_insn*
--try_emit_cmove_seq (struct noce_if_info *if_info, rtx temp,
--		    rtx cond, rtx new_val, rtx old_val, bool need_cmov,
--		    unsigned *cost, rtx *temp_dest,
--		    rtx cc_cmp = NULL, rtx rev_cc_cmp = NULL)
--{
--  rtx_insn *seq = NULL;
--  *cost = 0;
--
--  rtx x = XEXP (cond, 0);
--  rtx y = XEXP (cond, 1);
--  rtx_code cond_code = GET_CODE (cond);
--
--  start_sequence ();
--
--  if (need_cmov)
--    *temp_dest = noce_emit_cmove (if_info, temp, cond_code,
--				  x, y, new_val, old_val, cc_cmp, rev_cc_cmp);
--  else
--    {
--      *temp_dest = temp;
--      if (if_info->then_else_reversed)
--	noce_emit_move_insn (temp, old_val);
--      else
--	noce_emit_move_insn (temp, new_val);
--    }
--
--  if (*temp_dest != NULL_RTX)
--    {
--      seq = get_insns ();
--      *cost = seq_cost (seq, if_info->speed_p);
--    }
--
--  end_sequence ();
--
--  return seq;
--}
--
- /* We have something like:
- 
-      if (x > y)
-@@ -3261,6 +3198,7 @@ noce_convert_multiple_sets (struct noce_if_info *if_info)
-   rtx cond = noce_get_condition (jump, &cond_earliest, false);
-   rtx x = XEXP (cond, 0);
-   rtx y = XEXP (cond, 1);
-+  rtx_code cond_code = GET_CODE (cond);
- 
-   /* The true targets for a conditional move.  */
-   auto_vec<rtx> targets;
-@@ -3269,139 +3207,8 @@ noce_convert_multiple_sets (struct noce_if_info *if_info)
-   auto_vec<rtx> temporaries;
-   /* The insns we've emitted.  */
-   auto_vec<rtx_insn *> unmodified_insns;
--
--  hash_set<rtx_insn *> need_no_cmov;
--  hash_map<rtx_insn *, int> rewired_src;
--
--  need_cmov_or_rewire (then_bb, &need_no_cmov, &rewired_src);
--
--  int last_needs_comparison = -1;
--
--  bool ok = noce_convert_multiple_sets_1
--    (if_info, &need_no_cmov, &rewired_src, &targets, &temporaries,
--     &unmodified_insns, &last_needs_comparison);
--  if (!ok)
--      return false;
--
--  /* If there are insns that overwrite part of the initial
--     comparison, we can still omit creating temporaries for
--     the last of them.
--     As the second try will always create a less expensive,
--     valid sequence, we do not need to compare and can discard
--     the first one.  */
--  if (last_needs_comparison != -1)
--    {
--      end_sequence ();
--      start_sequence ();
--      ok = noce_convert_multiple_sets_1
--	(if_info, &need_no_cmov, &rewired_src, &targets, &temporaries,
--	 &unmodified_insns, &last_needs_comparison);
--      /* Actually we should not fail anymore if we reached here,
--	 but better still check.  */
--      if (!ok)
--	  return false;
--    }
--
--  /* We must have seen some sort of insn to insert, otherwise we were
--     given an empty BB to convert, and we can't handle that.  */
--  gcc_assert (!unmodified_insns.is_empty ());
--
--  /* Now fixup the assignments.  */
--  for (unsigned i = 0; i < targets.length (); i++)
--    if (targets[i] != temporaries[i])
--      noce_emit_move_insn (targets[i], temporaries[i]);
--
--  /* Actually emit the sequence if it isn't too expensive.  */
--  rtx_insn *seq = get_insns ();
--
--  if (!targetm.noce_conversion_profitable_p (seq, if_info))
--    {
--      end_sequence ();
--      return FALSE;
--    }
--
--  for (insn = seq; insn; insn = NEXT_INSN (insn))
--    set_used_flags (insn);
--
--  /* Mark all our temporaries and targets as used.  */
--  for (unsigned i = 0; i < targets.length (); i++)
--    {
--      set_used_flags (temporaries[i]);
--      set_used_flags (targets[i]);
--    }
--
--  set_used_flags (cond);
--  set_used_flags (x);
--  set_used_flags (y);
--
--  unshare_all_rtl_in_chain (seq);
--  end_sequence ();
--
--  if (!seq)
--    return FALSE;
--
--  for (insn = seq; insn; insn = NEXT_INSN (insn))
--    if (JUMP_P (insn)
--	|| recog_memoized (insn) == -1)
--      return FALSE;
--
--  emit_insn_before_setloc (seq, if_info->jump,
--			   INSN_LOCATION (unmodified_insns.last ()));
--
--  /* Clean up THEN_BB and the edges in and out of it.  */
--  remove_edge (find_edge (test_bb, join_bb));
--  remove_edge (find_edge (then_bb, join_bb));
--  redirect_edge_and_branch_force (single_succ_edge (test_bb), join_bb);
--  delete_basic_block (then_bb);
--  num_true_changes++;
--
--  /* Maybe merge blocks now the jump is simple enough.  */
--  if (can_merge_blocks_p (test_bb, join_bb))
--    {
--      merge_blocks (test_bb, join_bb);
--      num_true_changes++;
--    }
--
--  num_updated_if_blocks++;
--  if_info->transform_name = "noce_convert_multiple_sets";
--  return TRUE;
--}
--
--/* This goes through all relevant insns of IF_INFO->then_bb and tries to
--   create conditional moves.  In case a simple move sufficis the insn
--   should be listed in NEED_NO_CMOV.  The rewired-src cases should be
--   specified via REWIRED_SRC.  TARGETS, TEMPORARIES and UNMODIFIED_INSNS
--   are specified and used in noce_convert_multiple_sets and should be passed
--   to this function..  */
--
--static bool
--noce_convert_multiple_sets_1 (struct noce_if_info *if_info,
--			      hash_set<rtx_insn *> *need_no_cmov,
--			      hash_map<rtx_insn *, int> *rewired_src,
--			      auto_vec<rtx> *targets,
--			      auto_vec<rtx> *temporaries,
--			      auto_vec<rtx_insn *> *unmodified_insns,
--			      int *last_needs_comparison)
--{
--  basic_block then_bb = if_info->then_bb;
--  rtx_insn *jump = if_info->jump;
--  rtx_insn *cond_earliest;
--
--  /* Decompose the condition attached to the jump.  */
--  rtx cond = noce_get_condition (jump, &cond_earliest, false);
--
--  rtx cc_cmp = cond_exec_get_condition (jump);
--  rtx rev_cc_cmp = cond_exec_get_condition (jump, /* get_reversed */ true);
--
--  rtx_insn *insn;
-   int count = 0;
- 
--  targets->truncate (0);
--  temporaries->truncate (0);
--  unmodified_insns->truncate (0);
--
--  bool second_try = *last_needs_comparison != -1;
--
-   FOR_BB_INSNS (then_bb, insn)
-     {
-       /* Skip over non-insns.  */
-@@ -3412,53 +3219,26 @@ noce_convert_multiple_sets_1 (struct noce_if_info *if_info,
-       gcc_checking_assert (set);
- 
-       rtx target = SET_DEST (set);
--      rtx temp;
--
-+      rtx temp = gen_reg_rtx (GET_MODE (target));
-       rtx new_val = SET_SRC (set);
--      if (int *ii = rewired_src->get (insn))
--	new_val = simplify_replace_rtx (new_val, (*targets)[*ii],
--					(*temporaries)[*ii]);
-       rtx old_val = target;
- 
--      /* As we are transforming
--	 if (x > y)
--	   {
--	     a = b;
--	     c = d;
--	   }
--	 into
--	   a = (x > y) ...
--	   c = (x > y) ...
--
--	 we potentially check x > y before every set.
--	 Even though the check might be removed by subsequent passes, this means
--	 that we cannot transform
--	   if (x > y)
--	     {
--	       x = y;
--	       ...
--	     }
--	 into
--	   x = (x > y) ...
--	   ...
--	 since this would invalidate x and the following to-be-removed checks.
--	 Therefore we introduce a temporary every time we are about to
--	 overwrite a variable used in the check.  Costing of a sequence with
--	 these is going to be inaccurate so only use temporaries when
--	 needed.
--
--	 If performing a second try, we know how many insns require a
--	 temporary.  For the last of these, we can omit creating one.  */
--      if (reg_overlap_mentioned_p (target, cond)
--	  && (!second_try || count < *last_needs_comparison))
--	temp = gen_reg_rtx (GET_MODE (target));
--      else
--	temp = target;
--
--      /* We have identified swap-style idioms before.  A normal
--	 set will need to be a cmov while the first instruction of a swap-style
--	 idiom can be a regular move.  This helps with costing.  */
--      bool need_cmov = !need_no_cmov->contains (insn);
-+      /* If we were supposed to read from an earlier write in this block,
-+	 we've changed the register allocation.  Rewire the read.  While
-+	 we are looking, also try to catch a swap idiom.  */
-+      for (int i = count - 1; i >= 0; --i)
-+	if (reg_overlap_mentioned_p (new_val, targets[i]))
-+	  {
-+	    /* Catch a "swap" style idiom.  */
-+	    if (find_reg_note (insn, REG_DEAD, new_val) != NULL_RTX)
-+	      /* The write to targets[i] is only live until the read
-+		 here.  As the condition codes match, we can propagate
-+		 the set to here.  */
-+	      new_val = SET_SRC (single_set (unmodified_insns[i]));
-+	    else
-+	      new_val = temporaries[i];
-+	    break;
-+	  }
- 
-       /* If we had a non-canonical conditional jump (i.e. one where
- 	 the fallthrough is to the "else" case) we need to reverse
-@@ -3478,9 +3258,7 @@ noce_convert_multiple_sets_1 (struct noce_if_info *if_info,
- 	 we'll end up trying to emit r4:HI = cond ? (r1:SI) : (r3:HI).
- 	 Wrap the two cmove operands into subregs if appropriate to prevent
- 	 that.  */
--
--      if (!CONSTANT_P (new_val)
--	  && GET_MODE (new_val) != GET_MODE (temp))
-+      if (GET_MODE (new_val) != GET_MODE (temp))
- 	{
- 	  machine_mode src_mode = GET_MODE (new_val);
- 	  machine_mode dst_mode = GET_MODE (temp);
-@@ -3491,8 +3269,7 @@ noce_convert_multiple_sets_1 (struct noce_if_info *if_info,
- 	    }
- 	  new_val = lowpart_subreg (dst_mode, new_val, src_mode);
- 	}
--      if (!CONSTANT_P (old_val)
--	  && GET_MODE (old_val) != GET_MODE (temp))
-+      if (GET_MODE (old_val) != GET_MODE (temp))
- 	{
- 	  machine_mode src_mode = GET_MODE (old_val);
- 	  machine_mode dst_mode = GET_MODE (temp);
-@@ -3504,80 +3281,101 @@ noce_convert_multiple_sets_1 (struct noce_if_info *if_info,
- 	  old_val = lowpart_subreg (dst_mode, old_val, src_mode);
- 	}
- 
--      /* Try emitting a conditional move passing the backend the
--	 canonicalized comparison.  The backend is then able to
--	 recognize expressions like
--
--	   if (x > y)
--	     y = x;
--
--	 as min/max and emit an insn, accordingly.  */
--      unsigned cost1 = 0, cost2 = 0;
--      rtx_insn *seq, *seq1, *seq2;
--      rtx temp_dest = NULL_RTX, temp_dest1 = NULL_RTX, temp_dest2 = NULL_RTX;
-+      /* Actually emit the conditional move.  */
-+      rtx temp_dest = noce_emit_cmove (if_info, temp, cond_code,
-+				       x, y, new_val, old_val);
- 
--      seq1 = try_emit_cmove_seq (if_info, temp, cond,
--				 new_val, old_val, need_cmov,
--				 &cost1, &temp_dest1);
--
--      /* Here, we try to pass the backend a non-canonicalized cc comparison
--	 as well.  This allows the backend to emit a cmov directly without
--	 creating an additional compare for each.  If successful, costing
--	 is easier and this sequence is usually preferred.  */
--      seq2 = try_emit_cmove_seq (if_info, target, cond,
--				 new_val, old_val, need_cmov,
--				 &cost2, &temp_dest2, cc_cmp, rev_cc_cmp);
--
--      /* Check which version is less expensive.  */
--      if (seq1 != NULL_RTX && (cost1 <= cost2 || seq2 == NULL_RTX))
--	{
--	  seq = seq1;
--	  temp_dest = temp_dest1;
--	  if (!second_try)
--	    *last_needs_comparison = count;
--	}
--      else if (seq2 != NULL_RTX)
--	{
--	  seq = seq2;
--	  temp_dest = temp_dest2;
--	}
--      else
-+      /* If we failed to expand the conditional move, drop out and don't
-+	 try to continue.  */
-+      if (temp_dest == NULL_RTX)
- 	{
--	  /* Nothing worked, bail out.  */
- 	  end_sequence ();
- 	  return FALSE;
- 	}
- 
--      /* End the sub sequence and emit to the main sequence.  */
--      emit_insn (seq);
--
-       /* Bookkeeping.  */
-       count++;
--      targets->safe_push (target);
--      temporaries->safe_push (temp_dest);
--      unmodified_insns->safe_push (insn);
-+      targets.safe_push (target);
-+      temporaries.safe_push (temp_dest);
-+      unmodified_insns.safe_push (insn);
-     }
- 
--  return true;
--}
-+  /* We must have seen some sort of insn to insert, otherwise we were
-+     given an empty BB to convert, and we can't handle that.  */
-+  gcc_assert (!unmodified_insns.is_empty ());
-+
-+  /* Now fixup the assignments.  */
-+  for (int i = 0; i < count; i++)
-+    noce_emit_move_insn (targets[i], temporaries[i]);
-+
-+  /* Actually emit the sequence if it isn't too expensive.  */
-+  rtx_insn *seq = get_insns ();
-+
-+  if (!targetm.noce_conversion_profitable_p (seq, if_info))
-+    {
-+      end_sequence ();
-+      return FALSE;
-+    }
-+
-+  for (insn = seq; insn; insn = NEXT_INSN (insn))
-+    set_used_flags (insn);
-+
-+  /* Mark all our temporaries and targets as used.  */
-+  for (int i = 0; i < count; i++)
-+    {
-+      set_used_flags (temporaries[i]);
-+      set_used_flags (targets[i]);
-+    }
- 
-+  set_used_flags (cond);
-+  set_used_flags (x);
-+  set_used_flags (y);
- 
-+  unshare_all_rtl_in_chain (seq);
-+  end_sequence ();
-+
-+  if (!seq)
-+    return FALSE;
-+
-+  for (insn = seq; insn; insn = NEXT_INSN (insn))
-+    if (JUMP_P (insn)
-+	|| recog_memoized (insn) == -1)
-+      return FALSE;
-+
-+  emit_insn_before_setloc (seq, if_info->jump,
-+			   INSN_LOCATION (unmodified_insns.last ()));
-+
-+  /* Clean up THEN_BB and the edges in and out of it.  */
-+  remove_edge (find_edge (test_bb, join_bb));
-+  remove_edge (find_edge (then_bb, join_bb));
-+  redirect_edge_and_branch_force (single_succ_edge (test_bb), join_bb);
-+  delete_basic_block (then_bb);
-+  num_true_changes++;
-+
-+  /* Maybe merge blocks now the jump is simple enough.  */
-+  if (can_merge_blocks_p (test_bb, join_bb))
-+    {
-+      merge_blocks (test_bb, join_bb);
-+      num_true_changes++;
-+    }
-+
-+  num_updated_if_blocks++;
-+  if_info->transform_name = "noce_convert_multiple_sets";
-+  return TRUE;
-+}
- 
- /* Return true iff basic block TEST_BB is comprised of only
-    (SET (REG) (REG)) insns suitable for conversion to a series
-    of conditional moves.  Also check that we have more than one set
-    (other routines can handle a single set better than we would), and
--   fewer than PARAM_MAX_RTL_IF_CONVERSION_INSNS sets.  While going
--   through the insns store the sum of their potential costs in COST.  */
-+   fewer than PARAM_MAX_RTL_IF_CONVERSION_INSNS sets.  */
- 
- static bool
--bb_ok_for_noce_convert_multiple_sets (basic_block test_bb, unsigned *cost)
-+bb_ok_for_noce_convert_multiple_sets (basic_block test_bb)
- {
-   rtx_insn *insn;
-   unsigned count = 0;
-   unsigned param = param_max_rtl_if_conversion_insns;
--  bool speed_p = optimize_bb_for_speed_p (test_bb);
--  unsigned potential_cost = 0;
- 
-   FOR_BB_INSNS (test_bb, insn)
-     {
-@@ -3600,9 +3398,9 @@ bb_ok_for_noce_convert_multiple_sets (basic_block test_bb, unsigned *cost)
-       if (!REG_P (dest))
- 	return false;
- 
--      if (!((REG_P (src) || CONSTANT_P (src))
--	    || (GET_CODE (src) == SUBREG && REG_P (SUBREG_REG (src))
--	      && subreg_lowpart_p (src))))
-+      if (!(REG_P (src)
-+	   || (GET_CODE (src) == SUBREG && REG_P (SUBREG_REG (src))
-+	       && subreg_lowpart_p (src))))
- 	return false;
- 
-       /* Destination must be appropriate for a conditional write.  */
-@@ -3613,13 +3411,9 @@ bb_ok_for_noce_convert_multiple_sets (basic_block test_bb, unsigned *cost)
-       if (!can_conditionally_move_p (GET_MODE (dest)))
- 	return false;
- 
--      potential_cost += insn_cost (insn, speed_p);
--
-       count++;
-     }
- 
--  *cost += potential_cost;
--
-   /* If we would only put out one conditional move, the other strategies
-      this pass tries are better optimized and will be more appropriate.
-      Some targets want to strictly limit the number of conditional moves
-@@ -3667,24 +3461,11 @@ noce_process_if_block (struct noce_if_info *if_info)
-      to calculate a value for x.
-      ??? For future expansion, further expand the "multiple X" rules.  */
- 
--  /* First look for multiple SETS.  The original costs already include
--     a base cost of COSTS_N_INSNS (2): one instruction for the compare
--     (which we will be needing either way) and one instruction for the
--     branch.  When comparing costs we want to use the branch instruction
--     cost and the sets vs. the cmovs generated here.  Therefore subtract
--     the costs of the compare before checking.
--     ??? Actually, instead of the branch instruction costs we might want
--     to use COSTS_N_INSNS (BRANCH_COST ()) as in other places.  */
--
--  unsigned potential_cost = if_info->original_cost - COSTS_N_INSNS (1);
--  unsigned old_cost = if_info->original_cost;
-+  /* First look for multiple SETS.  */
-   if (!else_bb
-       && HAVE_conditional_move
--      && bb_ok_for_noce_convert_multiple_sets (then_bb, &potential_cost))
-+      && bb_ok_for_noce_convert_multiple_sets (then_bb))
-     {
--      /* Temporarily set the original costs to what we estimated so
--	 we can determine if the transformation is worth it.  */
--      if_info->original_cost = potential_cost;
-       if (noce_convert_multiple_sets (if_info))
- 	{
- 	  if (dump_file && if_info->transform_name)
-@@ -3692,9 +3473,6 @@ noce_process_if_block (struct noce_if_info *if_info)
- 		     if_info->transform_name);
- 	  return TRUE;
- 	}
--
--      /* Restore the original costs.  */
--      if_info->original_cost = old_cost;
-     }
- 
-   bool speed_p = optimize_bb_for_speed_p (test_bb);
-@@ -4036,89 +3814,6 @@ check_cond_move_block (basic_block bb,
-   return TRUE;
- }
- 
--/* Find local swap-style idioms in BB and mark the first insn (1)
--   that is only a temporary as not needing a conditional move as
--   it is going to be dead afterwards anyway.
--
--     (1) int tmp = a;
--	 a = b;
--	 b = tmp;
--
--	 ifcvt
--	 -->
--
--	 tmp = a;
--	 a = cond ? b : a_old;
--	 b = cond ? tmp : b_old;
--
--    Additionally, store the index of insns like (2) when a subsequent
--    SET reads from their destination.
--
--    (2) int c = a;
--	int d = c;
--
--	ifcvt
--	-->
--
--	c = cond ? a : c_old;
--	d = cond ? d : c;     // Need to use c rather than c_old here.
--*/
--
--static void
--need_cmov_or_rewire (basic_block bb,
--		     hash_set<rtx_insn *> *need_no_cmov,
--		     hash_map<rtx_insn *, int> *rewired_src)
--{
--  rtx_insn *insn;
--  int count = 0;
--  auto_vec<rtx_insn *> insns;
--  auto_vec<rtx> dests;
--
--  /* Iterate over all SETs, storing the destinations
--     in DEST.
--     - If we hit a SET that reads from a destination
--       that we have seen before and the corresponding register
--       is dead afterwards, the register does not need to be
--       moved conditionally.
--     - If we encounter a previously changed register,
--       rewire the read to the original source.  */
--  FOR_BB_INSNS (bb, insn)
--    {
--      rtx set, src, dest;
--
--      if (!active_insn_p (insn))
--	continue;
--
--      set = single_set (insn);
--      if (set == NULL_RTX)
--	continue;
--
--      src = SET_SRC (set);
--      if (SUBREG_P (src))
--	src = SUBREG_REG (src);
--      dest = SET_DEST (set);
--
--      /* Check if the current SET's source is the same
--	 as any previously seen destination.
--	 This is quadratic but the number of insns in BB
--	 is bounded by PARAM_MAX_RTL_IF_CONVERSION_INSNS.  */
--      if (REG_P (src))
--	for (int i = count - 1; i >= 0; --i)
--	  if (reg_overlap_mentioned_p (src, dests[i]))
--	    {
--	      if (find_reg_note (insn, REG_DEAD, src) != NULL_RTX)
--		need_no_cmov->add (insns[i]);
--	      else
--		rewired_src->put (insn, i);
--	    }
--
--      insns.safe_push (insn);
--      dests.safe_push (dest);
--
--      count++;
--    }
--}
--
- /* Given a basic block BB suitable for conditional move conversion,
-    a condition COND, and pointer maps THEN_VALS and ELSE_VALS containing
-    the register values depending on COND, emit the insns in the block as
---- gcc/optabs.cc
-+++ gcc/optabs.cc
-@@ -52,8 +52,6 @@ static void prepare_float_lib_cmp (rtx, rtx, enum rtx_code, rtx *,
- static rtx expand_unop_direct (machine_mode, optab, rtx, rtx, int);
- static void emit_libcall_block_1 (rtx_insn *, rtx, rtx, rtx, bool);
- 
--static rtx emit_conditional_move_1 (rtx, rtx, rtx, rtx, machine_mode);
--
- /* Debug facility for use in GDB.  */
- void debug_optab_libfuncs (void);
- \f
-@@ -626,13 +624,12 @@ expand_doubleword_shift_condmove (scalar_int_mode op1_mode, optab binoptab,
- 
-   /* Select between them.  Do the INTO half first because INTO_SUPERWORD
-      might be the current value of OUTOF_TARGET.  */
--  if (!emit_conditional_move (into_target, { cmp_code, cmp1, cmp2, op1_mode },
-+  if (!emit_conditional_move (into_target, cmp_code, cmp1, cmp2, op1_mode,
- 			      into_target, into_superword, word_mode, false))
-     return false;
- 
-   if (outof_target != 0)
--    if (!emit_conditional_move (outof_target,
--				{ cmp_code, cmp1, cmp2, op1_mode },
-+    if (!emit_conditional_move (outof_target, cmp_code, cmp1, cmp2, op1_mode,
- 				outof_target, outof_superword,
- 				word_mode, false))
-       return false;
-@@ -4854,8 +4851,8 @@ emit_indirect_jump (rtx loc)
-    is not supported.  */
- 
- rtx
--emit_conditional_move (rtx target, struct rtx_comparison comp,
--		       rtx op2, rtx op3,
-+emit_conditional_move (rtx target, enum rtx_code code, rtx op0, rtx op1,
-+		       machine_mode cmode, rtx op2, rtx op3,
- 		       machine_mode mode, int unsignedp)
- {
-   rtx comparison;
-@@ -4877,33 +4874,31 @@ emit_conditional_move (rtx target, struct rtx_comparison comp,
-   /* If one operand is constant, make it the second one.  Only do this
-      if the other operand is not constant as well.  */
- 
--  if (swap_commutative_operands_p (comp.op0, comp.op1))
-+  if (swap_commutative_operands_p (op0, op1))
-     {
--      std::swap (comp.op0, comp.op1);
--      comp.code = swap_condition (comp.code);
-+      std::swap (op0, op1);
-+      code = swap_condition (code);
-     }
- 
-   /* get_condition will prefer to generate LT and GT even if the old
-      comparison was against zero, so undo that canonicalization here since
-      comparisons against zero are cheaper.  */
-+  if (code == LT && op1 == const1_rtx)
-+    code = LE, op1 = const0_rtx;
-+  else if (code == GT && op1 == constm1_rtx)
-+    code = GE, op1 = const0_rtx;
- 
--  if (comp.code == LT && comp.op1 == const1_rtx)
--    comp.code = LE, comp.op1 = const0_rtx;
--  else if (comp.code == GT && comp.op1 == constm1_rtx)
--    comp.code = GE, comp.op1 = const0_rtx;
--
--  if (comp.mode == VOIDmode)
--    comp.mode = GET_MODE (comp.op0);
-+  if (cmode == VOIDmode)
-+    cmode = GET_MODE (op0);
- 
--  enum rtx_code orig_code = comp.code;
-+  enum rtx_code orig_code = code;
-   bool swapped = false;
-   if (swap_commutative_operands_p (op2, op3)
--      && ((reversed =
--	   reversed_comparison_code_parts (comp.code, comp.op0, comp.op1, NULL))
--	  != UNKNOWN))
-+      && ((reversed = reversed_comparison_code_parts (code, op0, op1, NULL))
-+          != UNKNOWN))
-     {
-       std::swap (op2, op3);
--      comp.code = reversed;
-+      code = reversed;
-       swapped = true;
-     }
- 
-@@ -4920,10 +4915,8 @@ emit_conditional_move (rtx target, struct rtx_comparison comp,
- 
-   for (int pass = 0; ; pass++)
-     {
--      comp.code = unsignedp ? unsigned_condition (comp.code) : comp.code;
--      comparison =
--	simplify_gen_relational (comp.code, VOIDmode,
--				 comp.mode, comp.op0, comp.op1);
-+      code = unsignedp ? unsigned_condition (code) : code;
-+      comparison = simplify_gen_relational (code, VOIDmode, cmode, op0, op1);
- 
-       /* We can get const0_rtx or const_true_rtx in some circumstances.  Just
- 	 punt and let the caller figure out how best to deal with this
-@@ -4934,16 +4927,24 @@ emit_conditional_move (rtx target, struct rtx_comparison comp,
- 	  save_pending_stack_adjust (&save);
- 	  last = get_last_insn ();
- 	  do_pending_stack_adjust ();
--	  machine_mode cmpmode = comp.mode;
-+	  machine_mode cmpmode = cmode;
- 	  prepare_cmp_insn (XEXP (comparison, 0), XEXP (comparison, 1),
- 			    GET_CODE (comparison), NULL_RTX, unsignedp,
- 			    OPTAB_WIDEN, &comparison, &cmpmode);
- 	  if (comparison)
- 	    {
--	       rtx res = emit_conditional_move_1 (target, comparison,
--						  op2, op3, mode);
--	       if (res != NULL_RTX)
--		 return res;
-+	      class expand_operand ops[4];
-+
-+	      create_output_operand (&ops[0], target, mode);
-+	      create_fixed_operand (&ops[1], comparison);
-+	      create_input_operand (&ops[2], op2, mode);
-+	      create_input_operand (&ops[3], op3, mode);
-+	      if (maybe_expand_insn (icode, 4, ops))
-+		{
-+		  if (ops[0].value != target)
-+		    convert_move (target, ops[0].value, false);
-+		  return target;
-+		}
- 	    }
- 	  delete_insns_since (last);
- 	  restore_pending_stack_adjust (&save);
-@@ -4955,88 +4956,17 @@ emit_conditional_move (rtx target, struct rtx_comparison comp,
-       /* If the preferred op2/op3 order is not usable, retry with other
- 	 operand order, perhaps it will expand successfully.  */
-       if (swapped)
--	comp.code = orig_code;
--      else if ((reversed =
--		reversed_comparison_code_parts (orig_code, comp.op0, comp.op1,
-+	code = orig_code;
-+      else if ((reversed = reversed_comparison_code_parts (orig_code, op0, op1,
- 							   NULL))
- 	       != UNKNOWN)
--	comp.code = reversed;
-+	code = reversed;
-       else
- 	return NULL_RTX;
-       std::swap (op2, op3);
-     }
- }
- 
--/* Helper function that, in addition to COMPARISON, also tries
--   the reversed REV_COMPARISON with swapped OP2 and OP3.  As opposed
--   to when we pass the specific constituents of a comparison, no
--   additional insns are emitted for it.  It might still be necessary
--   to emit more than one insn for the final conditional move, though.  */
--
--rtx
--emit_conditional_move (rtx target, rtx comparison, rtx rev_comparison,
--		       rtx op2, rtx op3, machine_mode mode)
--{
--  rtx res = emit_conditional_move_1 (target, comparison, op2, op3, mode);
--
--  if (res != NULL_RTX)
--    return res;
--
--  return emit_conditional_move_1 (target, rev_comparison, op3, op2, mode);
--}
--
--/* Helper for emitting a conditional move.  */
--
--static rtx
--emit_conditional_move_1 (rtx target, rtx comparison,
--			 rtx op2, rtx op3, machine_mode mode)
--{
--  enum insn_code icode;
--
--  if (comparison == NULL_RTX || !COMPARISON_P (comparison))
--    return NULL_RTX;
--
--  /* If the two source operands are identical, that's just a move.
--     As the comparison comes in non-canonicalized, we must make
--     sure not to discard any possible side effects.  If there are
--     side effects, just let the target handle it.  */
--  if (!side_effects_p (comparison) && rtx_equal_p (op2, op3))
--    {
--      if (!target)
--	target = gen_reg_rtx (mode);
--
--      emit_move_insn (target, op3);
--      return target;
--    }
--
--  if (mode == VOIDmode)
--    mode = GET_MODE (op2);
--
--  icode = direct_optab_handler (movcc_optab, mode);
--
--  if (icode == CODE_FOR_nothing)
--    return NULL_RTX;
--
--  if (!target)
--    target = gen_reg_rtx (mode);
--
--  class expand_operand ops[4];
--
--  create_output_operand (&ops[0], target, mode);
--  create_fixed_operand (&ops[1], comparison);
--  create_input_operand (&ops[2], op2, mode);
--  create_input_operand (&ops[3], op3, mode);
--
--  if (maybe_expand_insn (icode, 4, ops))
--    {
--      if (ops[0].value != target)
--	convert_move (target, ops[0].value, false);
--      return target;
--    }
--
--  return NULL_RTX;
--}
--
- 
- /* Emit a conditional negate or bitwise complement using the
-    negcc or notcc optabs if available.  Return NULL_RTX if such operations
---- gcc/optabs.h
-+++ gcc/optabs.h
-@@ -279,8 +279,8 @@ extern void emit_indirect_jump (rtx);
- #endif
- 
- /* Emit a conditional move operation.  */
--rtx emit_conditional_move (rtx, rtx_comparison, rtx, rtx, machine_mode, int);
--rtx emit_conditional_move (rtx, rtx, rtx, rtx, rtx, machine_mode);
-+rtx emit_conditional_move (rtx, enum rtx_code, rtx, rtx, machine_mode,
-+			   rtx, rtx, machine_mode, int);
- 
- /* Emit a conditional negate or bitwise complement operation.  */
- rtx emit_conditional_neg_or_complement (rtx, rtx_code, machine_mode, rtx,
---- gcc/rtl.h
-+++ gcc/rtl.h
-@@ -4604,16 +4604,7 @@ word_register_operation_p (const_rtx x)
-       return true;
-     }
- }
--
--/* Holds an rtx comparison to simplify passing many parameters pertaining to a
--   single comparison.  */
--
--struct rtx_comparison {
--  rtx_code code;
--  rtx op0, op1;
--  machine_mode mode;
--};
--
-+    
- /* gtype-desc.cc.  */
- extern void gt_ggc_mx (rtx &);
- extern void gt_pch_nx (rtx &);

diff --git a/gcc12-pr104253.patch b/gcc12-pr104253.patch
deleted file mode 100644
index 5560524..0000000
--- a/gcc12-pr104253.patch
+++ /dev/null
@@ -1,200 +0,0 @@
-If you are on a PowerPC system where the default long double is IEEE
-128-bit, GCC will use the wrong names for some of the conversion functions
-for the __ibm128 type.
-
-What is happening is when the defult long double is IEEE 128-bit, the
-various convert, truncation, and extend functions did not specify a
-default name for the conversion.  The machine indepentent portions of the
-compiler would construct a call with an 'if' name (IFmode being the mode
-for IBM 128-bit floating point).  This patch specifies to use the
-tradiational 'tf' name for these conversion functions.
-
-2022-01-28  Michael Meissner  <meissner@the-meissners.org>
-
-gcc/
-	PR target/104253
-	* config/rs6000/rs6000.cc (init_float128_ibm): Use the TF names
-	for builtin conversions between __ibm128 and DImode when long
-	double uses the IEEE 128-bit format.
-
-gcc/testsuite/
-	PR target/104253
-	* gcc.target/powerpc/pr104253.c: New test.
----
- gcc/config/rs6000/rs6000.cc                 |   6 +
- gcc/testsuite/gcc.target/powerpc/pr104253.c | 154 ++++++++++++++++++++
- 2 files changed, 160 insertions(+)
- create mode 100644 gcc/testsuite/gcc.target/powerpc/pr104253.c
-
---- gcc/config/rs6000/rs6000.cc
-+++ gcc/config/rs6000/rs6000.cc
-@@ -11113,6 +11113,12 @@ init_float128_ibm (machine_mode mode)
-       set_conv_libfunc (trunc_optab, DDmode, mode, "__dpd_trunctfdd");
-       set_conv_libfunc (sext_optab, TDmode, mode, "__dpd_extendtftd");
- 
-+      set_conv_libfunc (sfix_optab, DImode, mode, "__fixtfdi");
-+      set_conv_libfunc (ufix_optab, DImode, mode, "__fixunstfdi");
-+
-+      set_conv_libfunc (sfloat_optab, mode, DImode, "__floatditf");
-+      set_conv_libfunc (ufloat_optab, mode, DImode, "__floatunditf");
-+
-       if (TARGET_POWERPC64)
- 	{
- 	  set_conv_libfunc (sfix_optab, TImode, mode, "__fixtfti");
---- gcc/testsuite/gcc.target/powerpc/pr104253.c
-+++ gcc/testsuite/gcc.target/powerpc/pr104253.c
-@@ -0,0 +1,154 @@
-+/*
-+ * Require float128 support because __ibm128 currently is not enabled unless we
-+ * also have __float128 support.
-+ */
-+
-+/* { dg-do run } */
-+/* { require-effective-target ppc_float128_sw } */
-+/* { dg-options "-O2 -mvsx -mfloat128" } */
-+
-+/*
-+ * PR target/104253
-+ *
-+ * Verify that the various conversions to and from __ibm128 work.  When the
-+ *  default for long double is changed to IEEE 128-bit, originally GCC would
-+ *  call the functions using an 'if' name instead of 'tf.
-+ */
-+
-+#include <stdlib.h>
-+
-+extern float              ibm128_to_sf  (__ibm128) __attribute__((noinline));
-+extern double             ibm128_to_df  (__ibm128) __attribute__((noinline));
-+extern int                ibm128_to_si  (__ibm128) __attribute__((noinline));
-+extern long long          ibm128_to_di  (__ibm128) __attribute__((noinline));
-+extern unsigned int       ibm128_to_usi (__ibm128) __attribute__((noinline));
-+extern unsigned long long ibm128_to_udi (__ibm128) __attribute__((noinline));
-+
-+extern __ibm128 sf_to_ibm128  (float)              __attribute__((noinline));
-+extern __ibm128 df_to_ibm128  (double)             __attribute__((noinline));
-+extern __ibm128 si_to_ibm128  (int)                __attribute__((noinline));
-+extern __ibm128 di_to_ibm128  (long long)          __attribute__((noinline));
-+extern __ibm128 usi_to_ibm128 (unsigned int)       __attribute__((noinline));
-+extern __ibm128 udi_to_ibm128 (unsigned long long) __attribute__((noinline));
-+
-+float
-+ibm128_to_sf  (__ibm128 x)
-+{
-+  return x;
-+}
-+
-+double
-+ibm128_to_df  (__ibm128 x)
-+{
-+  return x;
-+}
-+
-+int
-+ibm128_to_si  (__ibm128 x)
-+{
-+  return x;
-+}
-+
-+long long
-+ibm128_to_di  (__ibm128 x)
-+{
-+  return x;
-+}
-+
-+unsigned int
-+ibm128_to_usi (__ibm128 x)
-+{
-+  return x;
-+}
-+
-+unsigned long long
-+ibm128_to_udi (__ibm128 x)
-+{
-+  return x;
-+}
-+
-+__ibm128
-+sf_to_ibm128  (float x)
-+{
-+  return x;
-+}
-+
-+__ibm128
-+df_to_ibm128  (double x)
-+{
-+  return x;
-+}
-+
-+__ibm128
-+si_to_ibm128  (int x)
-+{
-+  return x;
-+}
-+
-+__ibm128
-+di_to_ibm128  (long long x)
-+{
-+  return x;
-+}
-+
-+__ibm128
-+usi_to_ibm128 (unsigned int x)
-+{
-+  return x;
-+}
-+
-+__ibm128
-+udi_to_ibm128 (unsigned long long x)
-+{
-+  return x;
-+}
-+
-+volatile float			seven_sf	= 7.0f;
-+volatile double			seven_df	= 7.0;
-+volatile int			seven_si	= 7;
-+volatile long long		seven_di	= 7LL;
-+volatile unsigned int		seven_usi	= 7U;
-+volatile unsigned long long	seven_udi	= 7ULL;
-+volatile __ibm128		seven_ibm128	= 7.0;
-+
-+int
-+main (void)
-+{
-+  if (seven_ibm128 != sf_to_ibm128 (seven_sf))
-+    abort ();
-+
-+  if (seven_ibm128 != df_to_ibm128 (seven_df))
-+    abort ();
-+
-+  if (seven_ibm128 != si_to_ibm128 (seven_si))
-+    abort ();
-+
-+  if (seven_ibm128 != di_to_ibm128 (seven_di))
-+    abort ();
-+
-+  if (seven_ibm128 != usi_to_ibm128 (seven_usi))
-+    abort ();
-+
-+  if (seven_ibm128 != udi_to_ibm128 (seven_udi))
-+    abort ();
-+
-+  if (seven_sf != ibm128_to_sf (seven_ibm128))
-+    abort ();
-+
-+  if (seven_df != ibm128_to_df (seven_ibm128))
-+    abort ();
-+
-+  if (seven_si != ibm128_to_si (seven_ibm128))
-+    abort ();
-+
-+  if (seven_di != ibm128_to_di (seven_ibm128))
-+    abort ();
-+
-+  if (seven_usi != ibm128_to_usi (seven_ibm128))
-+    abort ();
-+
-+  if (seven_udi != ibm128_to_udi (seven_ibm128))
-+    abort ();
-+
-+  return 0;
-+}

diff --git a/sources b/sources
index 1819cf3..87303d0 100644
--- a/sources
+++ b/sources
@@ -1,4 +1,4 @@
-SHA512 (gcc-12.0.1-20220214.tar.xz) = a6f590b9facf2c80ec73d41ccd5bcd404722b76f7ff06d82f30b8b956349df4efa049b72285be1a76da52e851ef327b8fe42d05ea7e62149b2a4236611a8355f
+SHA512 (gcc-12.0.1-20220222.tar.xz) = 70426bab483df8ddcc58f80f709c087cb3c9e4992ddb910dc55986fbf8a0aa4067f401e3c2fad1e7a5d7832e18d3f24316ccd7a18db6601059a4b46325c6a899
 SHA512 (isl-0.18.tar.bz2) = 85d0b40f4dbf14cb99d17aa07048cdcab2dc3eb527d2fbb1e84c41b2de5f351025370e57448b63b2b8a8cf8a0843a089c3263f9baee1542d5c2e1cb37ed39d94
 SHA512 (newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz) = 002a48a7b689a81abbf16161bcaec001a842e67dfbe372e9e109092703bfc666675f16198f60ca429370e8850d564547dc505df81bc3aaca4ce6defbc014ad6c
 SHA512 (nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz) = f6d10db94fa1570ae0f94df073fa3c73c8e5ee16d59070b53d94f7db0de8a031bc44d7f3f1852533da04b625ce758e022263855ed43cfc6867e0708d001e53c7

                 reply	other threads:[~2026-06-29 12:29 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=178273618204.1.7702718603087934916.rpms-gcc-b0dddd2d05f2@fedoraproject.org \
    --to=jakub@redhat.com \
    --cc=git-commits@fedoraproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox