public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/gcc] rhel-f41-base: 12.0.1-0.3
@ 2026-06-29 12:29 Jakub Jelinek
0 siblings, 0 replies; 3+ messages in thread
From: Jakub Jelinek @ 2026-06-29 12:29 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/gcc
Branch : rhel-f41-base
Commit : 7e47121cf7dc9330f7e6b32ef1fab8dad37a9702
Author : Jakub Jelinek <jakub@redhat.com>
Date : 2022-01-25T14:26:06+01:00
Stats : +1/-1 in 1 file(s)
URL : https://src.fedoraproject.org/rpms/gcc/c/7e47121cf7dc9330f7e6b32ef1fab8dad37a9702?branch=rhel-f41-base
Log:
12.0.1-0.3
---
diff --git a/gcc.spec b/gcc.spec
index 49a94f6..c788889 100644
--- a/gcc.spec
+++ b/gcc.spec
@@ -3156,7 +3156,7 @@ end
%endif
%changelog
-* Tue Jan 24 2022 Jakub Jelinek <jakub@redhat.com> 12.0.1-0.3
+* Tue Jan 25 2022 Jakub Jelinek <jakub@redhat.com> 12.0.1-0.3
- update from trunk
- PRs ada/103538, analyzer/94362, analyzer/103685, analyzer/104062,
analyzer/104089, analyzer/104150, analyzer/104159, bootstrap/104135,
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [rpms/gcc] rhel-f41-base: 12.0.1-0.3
@ 2026-06-29 12:29 Jakub Jelinek
0 siblings, 0 replies; 3+ messages in thread
From: Jakub Jelinek @ 2026-06-29 12:29 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/gcc
Branch : rhel-f41-base
Commit : f5c21772fcce386eafbc1fa45a6321254a572dd8
Author : Jakub Jelinek <jakub@redhat.com>
Date : 2022-01-25T15:24:01+01:00
Stats : +3/-3 in 1 file(s)
URL : https://src.fedoraproject.org/rpms/gcc/c/f5c21772fcce386eafbc1fa45a6321254a572dd8?branch=rhel-f41-base
Log:
12.0.1-0.3
---
diff --git a/gcc12-Wno-format-security.patch b/gcc12-Wno-format-security.patch
index 3abf63b..43e482a 100644
--- a/gcc12-Wno-format-security.patch
+++ b/gcc12-Wno-format-security.patch
@@ -10,7 +10,7 @@
--- gcc/configure.ac.jj 2017-02-13 12:20:53.000000000 +0100
+++ gcc/configure.ac 2017-02-25 12:42:32.859175403 +0100
-@@ -480,7 +480,7 @@ AC_ARG_ENABLE(build-format-warnings,
+@@ -570,7 +570,7 @@ AC_ARG_ENABLE(build-format-warnings,
AS_HELP_STRING([--disable-build-format-warnings],[don't use -Wformat while building GCC]),
[],[enable_build_format_warnings=yes])
AS_IF([test $enable_build_format_warnings = no],
@@ -18,10 +18,10 @@
+ [wf_opt="-Wno-format -Wno-format-security"],[wf_opt=])
ACX_PROG_CXX_WARNING_OPTS(
m4_quote(m4_do([-W -Wall -Wno-narrowing -Wwrite-strings ],
- [-Wcast-qual -Wno-error=format-diag $wf_opt])),
+ [-Wcast-qual $wf_opt])),
--- gcc/configure.jj 2017-02-13 12:20:52.000000000 +0100
+++ gcc/configure 2017-02-25 12:42:50.041946391 +0100
-@@ -6647,7 +6647,7 @@ else
+@@ -7077,7 +7077,7 @@ else
fi
if test $enable_build_format_warnings = no; then :
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [rpms/gcc] rhel-f41-base: 12.0.1-0.3
@ 2026-06-29 12:29 Jakub Jelinek
0 siblings, 0 replies; 3+ messages in thread
From: Jakub Jelinek @ 2026-06-29 12:29 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/gcc
Branch : rhel-f41-base
Commit : 067e0a8c2ecb0694dc7815cd7bffc799b4c96d9a
Author : Jakub Jelinek <jakub@redhat.com>
Date : 2022-01-25T14:02:53+01:00
Stats : +1226/-192 in 9 file(s)
URL : https://src.fedoraproject.org/rpms/gcc/c/067e0a8c2ecb0694dc7815cd7bffc799b4c96d9a?branch=rhel-f41-base
Log:
12.0.1-0.3
---
diff --git a/.gitignore b/.gitignore
index 21dcf61..990b516 100644
--- a/.gitignore
+++ b/.gitignore
@@ -58,3 +58,4 @@
/gcc-12.0.0-20220112.tar.xz
/gcc-12.0.0-20220115.tar.xz
/gcc-12.0.1-20220118.tar.xz
+/gcc-12.0.1-20220125.tar.xz
diff --git a/gcc.spec b/gcc.spec
index 5379e6f..49a94f6 100644
--- a/gcc.spec
+++ b/gcc.spec
@@ -1,4 +1,4 @@
-%global DATE 20220118
+%global DATE 20220125
%global gitrev c682bc883d1a29c3f697f065af23759f3d6757bc
%global gcc_version 12.0.1
%global gcc_major 12
@@ -11,6 +11,7 @@
%global _performance_build 1
# Hardening slows the compiler way too much.
%undefine _hardened_build
+%undefine _auto_set_build_flags
%if 0%{?fedora} > 27 || 0%{?rhel} > 7
# Until annobin is fixed (#1519165).
%undefine _annotated_build
@@ -119,7 +120,7 @@
Summary: Various compilers (C, C++, Objective-C, ...)
Name: gcc
Version: %{gcc_version}
-Release: %{gcc_release}.2%{?dist}
+Release: %{gcc_release}.3%{?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
@@ -269,9 +270,9 @@ Patch8: gcc12-no-add-needed.patch
Patch9: gcc12-Wno-format-security.patch
Patch10: gcc12-rh1574936.patch
Patch11: gcc12-d-shared-libphobos.patch
-Patch12: gcc12-pr104025.patch
-Patch13: gcc12-pr104103.patch
-Patch14: gcc12-pr104104.patch
+Patch12: gcc12-pr104194.patch
+Patch13: gcc12-pr94193.patch
+Patch14: gcc12-ifcvt-revert.patch
Patch100: gcc12-fortran-fdec-duplicates.patch
Patch101: gcc12-fortran-flogical-as-integer.patch
@@ -793,9 +794,9 @@ to NVidia PTX capable devices if available.
%patch10 -p0 -b .rh1574936~
%endif
%patch11 -p0 -b .d-shared-libphobos~
-%patch12 -p0 -b .pr104025~
-%patch13 -p0 -b .pr104103~
-%patch14 -p0 -b .pr104104~
+%patch12 -p0 -b .pr104194~
+%patch13 -p0 -b .pr94193~
+%patch14 -p0 -b .ifcvt-revert~
%if 0%{?rhel} >= 9
%patch100 -p1 -b .fortran-fdec-duplicates~
@@ -3155,6 +3156,36 @@ end
%endif
%changelog
+* Tue Jan 24 2022 Jakub Jelinek <jakub@redhat.com> 12.0.1-0.3
+- update from trunk
+ - PRs ada/103538, analyzer/94362, analyzer/103685, analyzer/104062,
+ analyzer/104089, analyzer/104150, analyzer/104159, bootstrap/104135,
+ bootstrap/104170, c++/20040, c++/55227, c++/91911, c++/101072,
+ c++/101405, c++/101715, c++/102300, c++/102338, c++/103631,
+ c++/103672, c++/103681, c++/104025, c++/104055, c++/104084,
+ c++/104134, c++/104139, c++/104148, c++/104173, c++/104182,
+ c++/104197, c/104115, debug/103874, fortran/102621, fortran/103695,
+ fortran/104127, libgcc/104207, libstdc++/87193, libstdc++/104019,
+ libstdc++/104032, libstdc++/104099, libstdc++/104101,
+ libstdc++/104123, libstdc++/104174, middle-end/100786,
+ middle-end/102860, middle-end/104069, middle-end/104076,
+ middle-end/104140, other/104176, other/104181, preprocessor/104030,
+ rtl-optimization/102478, sanitizer/99673, sanitizer/104158,
+ target/64821, target/94193, target/100784, target/102517,
+ target/103676, target/103771, target/104090, target/104136,
+ target/104188, testsuite/102833, testsuite/103763, testsuite/104021,
+ testsuite/104022, testsuite/104109, tree-optimization/100089,
+ tree-optimization/100740, tree-optimization/101508,
+ tree-optimization/101972, tree-optimization/102087,
+ tree-optimization/102131, tree-optimization/103721,
+ tree-optimization/103997, tree-optimization/104112,
+ tree-optimization/104114, tree-optimization/104152,
+ tree-optimization/104156, tree-optimization/104214
+ - don't emit C++ mangling aliases for compatibility with GCC 8.1 ppc64le
+ IEEE quad long double (PR target/104172)
+- mark IEEE quad long double in DWARF as implicit typedef to _Float128
+ (PR debug/104194)
+
* Tue Jan 18 2022 Jakub Jelinek <jakub@redhat.com> 12.0.1-0.2
- update from trunk
- PRs c++/104007, c++/104074, fortran/103692, ipa/103989, libstdc++/101124,
diff --git a/gcc12-ifcvt-revert.patch b/gcc12-ifcvt-revert.patch
new file mode 100644
index 0000000..2261669
--- /dev/null
+++ b/gcc12-ifcvt-revert.patch
@@ -0,0 +1,1054 @@
+Revert r12-674{3,4,5,6,7,8,9}, as there are several PRs reported against
+those changes: PR104153, PR104154 and PR104198 at least.
+
+--- 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-pr104025.patch b/gcc12-pr104025.patch
deleted file mode 100644
index 3010236..0000000
--- a/gcc12-pr104025.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-2022-01-18 Jakub Jelinek <jakub@redhat.com>
-
- PR c++/104025
- * parser.cc (cp_parser_id_expression): Save and restore input_location
- around cp_parser_skip_entire_template_parameter_list call for
- -Wmissing-template-keyword.
-
- * g++.dg/warn/pr104025.C: New test.
-
---- gcc/cp/parser.cc.jj 2022-01-17 18:05:04.797307506 +0100
-+++ gcc/cp/parser.cc 2022-01-17 20:27:33.642711859 +0100
-@@ -6254,6 +6254,7 @@ cp_parser_id_expression (cp_parser *pars
- OPT_Wmissing_template_keyword))
- {
- saved_token_sentinel toks (parser->lexer, STS_ROLLBACK);
-+ iloc_sentinel ils (UNKNOWN_LOCATION);
- if (cp_parser_skip_entire_template_parameter_list (parser)
- /* An operator after the > suggests that the > ends a
- template-id; a name or literal suggests that the > is an
---- gcc/testsuite/g++.dg/warn/pr104025.C.jj 2022-01-17 20:31:17.320591249 +0100
-+++ gcc/testsuite/g++.dg/warn/pr104025.C 2022-01-17 20:31:09.068706373 +0100
-@@ -0,0 +1,20 @@
-+// PR c++/104025
-+// { dg-do compile }
-+// { dg-options "-Wmissing-template-keyword -fcompare-debug" }
-+
-+void bar (int);
-+
-+struct S { int i; };
-+
-+template <class C>
-+struct T
-+{
-+ int m;
-+ C c;
-+ void foo ()
-+ {
-+ bar (c.i < m);
-+ }
-+};
-+
-+template void T<S>::foo ();
diff --git a/gcc12-pr104103.patch b/gcc12-pr104103.patch
deleted file mode 100644
index cdf421d..0000000
--- a/gcc12-pr104103.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-2022-01-18 Jakub Jelinek <jakub@redhat.com>
-
- PR middle-end/104103
- * gimple-ssa-warn-access.cc (pass_waccess::check_call): Don't check
- .ASAN_MARK calls.
-
---- gcc/gimple-ssa-warn-access.cc.jj 2022-01-16 20:55:46.783932110 +0100
-+++ gcc/gimple-ssa-warn-access.cc 2022-01-18 20:56:13.697780325 +0100
-@@ -4232,6 +4232,11 @@ pass_waccess::check_call (gcall *stmt)
- if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
- check_builtin (stmt);
-
-+ /* .ASAN_MARK doesn't access any vars, only modifies shadow memory. */
-+ if (gimple_call_internal_p (stmt)
-+ && gimple_call_internal_fn (stmt) == IFN_ASAN_MARK)
-+ return;
-+
- if (!m_early_checks_p)
- if (tree callee = gimple_call_fndecl (stmt))
- {
diff --git a/gcc12-pr104104.patch b/gcc12-pr104104.patch
deleted file mode 100644
index d81b3f0..0000000
--- a/gcc12-pr104104.patch
+++ /dev/null
@@ -1,121 +0,0 @@
-2022-01-18 Jakub Jelinek <jakub@redhat.com>
-
- PR target/104104
- * config/i386/sse.md
- (<avx512>_<complexopname>_<mode><maskc_name><round_name>,
- avx512fp16_<complexopname>sh_v8hf<mask_scalarc_name><round_scalarcz_name>,
- avx512dq_mul<mode>3<mask_name>, <avx2_avx512>_permvar<mode><mask_name>,
- avx2_perm<mode>_1<mask_name>, avx512f_perm<mode>_1<mask_name>,
- avx512dq_rangep<mode><mask_name><round_saeonly_name>,
- avx512dq_ranges<mode><mask_scalar_name><round_saeonly_scalar_name>,
- <avx512>_getmant<mode><mask_name><round_saeonly_name>,
- avx512f_vgetmant<mode><mask_scalar_name><round_saeonly_scalar_name>):
- Use vxorps\t%x0, %x0, %x0 instead of vxorps\t{%x0, %x0, %x0}.
-
- * gcc.target/i386/pr104104.c: New test.
-
---- gcc/config/i386/sse.md.jj 2022-01-18 11:58:59.156988142 +0100
-+++ gcc/config/i386/sse.md 2022-01-18 21:20:40.022477778 +0100
-@@ -6539,7 +6539,7 @@ (define_insn "<avx512>_<complexopname>_<
- {
- if (TARGET_DEST_FALSE_DEP_FOR_GLC
- && <maskc_dest_false_dep_for_glc_cond>)
-- output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands);
-+ output_asm_insn ("vxorps\t%x0, %x0, %x0", operands);
- return "v<complexopname><ssemodesuffix>\t{<round_maskc_op3>%2, %1, %0<maskc_operand3>|%0<maskc_operand3>, %1, %2<round_maskc_op3>}";
- }
- [(set_attr "type" "ssemul")
-@@ -6750,7 +6750,7 @@ (define_insn "avx512fp16_<complexopname>
- {
- if (TARGET_DEST_FALSE_DEP_FOR_GLC
- && <mask_scalarc_dest_false_dep_for_glc_cond>)
-- output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands);
-+ output_asm_insn ("vxorps\t%x0, %x0, %x0", operands);
- return "v<complexopname>sh\t{<round_scalarc_mask_op3>%2, %1, %0<mask_scalarc_operand3>|%0<mask_scalarc_operand3>, %1, %2<round_scalarc_mask_op3>}";
- }
- [(set_attr "type" "ssemul")
-@@ -15222,7 +15222,7 @@ (define_insn "avx512dq_mul<mode>3<mask_n
- && <mask3_dest_false_dep_for_glc_cond>
- && !reg_mentioned_p (operands[0], operands[1])
- && !reg_mentioned_p (operands[0], operands[2]))
-- output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands);
-+ output_asm_insn ("vxorps\t%x0, %x0, %x0", operands);
- return "vpmullq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}";
- }
- [(set_attr "type" "sseimul")
-@@ -24658,7 +24658,7 @@ (define_insn "<avx2_avx512>_permvar<mode
- && <mask3_dest_false_dep_for_glc_cond>
- && !reg_mentioned_p (operands[0], operands[1])
- && !reg_mentioned_p (operands[0], operands[2]))
-- output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands);
-+ output_asm_insn ("vxorps\t%x0, %x0, %x0", operands);
- return "vperm<ssemodesuffix>\t{%1, %2, %0<mask_operand3>|%0<mask_operand3>, %2, %1}";
- }
- [(set_attr "type" "sselog")
-@@ -24900,7 +24900,7 @@ (define_insn "avx2_perm<mode>_1<mask_nam
- if (TARGET_DEST_FALSE_DEP_FOR_GLC
- && <mask6_dest_false_dep_for_glc_cond>
- && !reg_mentioned_p (operands[0], operands[1]))
-- output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands);
-+ output_asm_insn ("vxorps\t%x0, %x0, %x0", operands);
- return "vperm<ssemodesuffix>\t{%2, %1, %0<mask_operand6>|%0<mask_operand6>, %1, %2}";
- }
- [(set_attr "type" "sselog")
-@@ -24975,7 +24975,7 @@ (define_insn "avx512f_perm<mode>_1<mask_
- if (TARGET_DEST_FALSE_DEP_FOR_GLC
- && <mask10_dest_false_dep_for_glc_cond>
- && !reg_mentioned_p (operands[0], operands[1]))
-- output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands);
-+ output_asm_insn ("vxorps\t%x0, %x0, %x0", operands);
- return "vperm<ssemodesuffix>\t{%2, %1, %0<mask_operand10>|%0<mask_operand10>, %1, %2}";
- }
- [(set_attr "type" "sselog")
-@@ -26880,7 +26880,7 @@ (define_insn "avx512dq_rangep<mode><mask
- && <mask4_dest_false_dep_for_glc_cond>
- && !reg_mentioned_p (operands[0], operands[1])
- && !reg_mentioned_p (operands[0], operands[2]))
-- output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands);
-+ output_asm_insn ("vxorps\t%x0, %x0, %x0", operands);
- return "vrange<ssemodesuffix>\t{%3, <round_saeonly_mask_op4>%2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2<round_saeonly_mask_op4>, %3}";
- }
- [(set_attr "type" "sse")
-@@ -26903,7 +26903,7 @@ (define_insn "avx512dq_ranges<mode><mask
- && <mask_scalar4_dest_false_dep_for_glc_cond>
- && !reg_mentioned_p (operands[0], operands[1])
- && !reg_mentioned_p (operands[0], operands[2]))
-- output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands);
-+ output_asm_insn ("vxorps\t%x0, %x0, %x0", operands);
- return "vrange<ssescalarmodesuffix>\t{%3, <round_saeonly_scalar_mask_op4>%2, %1, %0<mask_scalar_operand4>|%0<mask_scalar_operand4>, %1, %<iptr>2<round_saeonly_scalar_mask_op4>, %3}";
- }
- [(set_attr "type" "sse")
-@@ -26949,7 +26949,7 @@ (define_insn "<avx512>_getmant<mode><mas
- if (TARGET_DEST_FALSE_DEP_FOR_GLC
- && <mask3_dest_false_dep_for_glc_cond>
- && MEM_P (operands[1]))
-- output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands);
-+ output_asm_insn ("vxorps\t%x0, %x0, %x0", operands);
- return "vgetmant<ssemodesuffix>\t{%2, <round_saeonly_mask_op3>%1, %0<mask_operand3>|%0<mask_operand3>, %1<round_saeonly_mask_op3>, %2}";
- }
- [(set_attr "prefix" "evex")
-@@ -26971,7 +26971,7 @@ (define_insn "avx512f_vgetmant<mode><mas
- && <mask_scalar4_dest_false_dep_for_glc_cond>
- && !reg_mentioned_p (operands[0], operands[1])
- && !reg_mentioned_p (operands[0], operands[2]))
-- output_asm_insn ("vxorps\t{%x0, %x0, %x0}", operands);
-+ output_asm_insn ("vxorps\t%x0, %x0, %x0", operands);
- return "vgetmant<ssescalarmodesuffix>\t{%3, <round_saeonly_scalar_mask_op4>%2, %1, %0<mask_scalar_operand4>|%0<mask_scalar_operand4>, %1, %<iptr>2<round_saeonly_scalar_mask_op4>, %3}";
- }
- [(set_attr "prefix" "evex")
---- gcc/testsuite/gcc.target/i386/pr104104.c.jj 2022-01-18 21:38:17.007906673 +0100
-+++ gcc/testsuite/gcc.target/i386/pr104104.c 2022-01-18 21:36:10.475623148 +0100
-@@ -0,0 +1,10 @@
-+/* PR target/104104 */
-+/* { dg-do assemble { target vect_simd_clones } } */
-+/* { dg-require-effective-target masm_intel } */
-+/* { dg-options "-march=alderlake -masm=intel -O1 -fallow-store-data-races -funroll-all-loops" } */
-+
-+__attribute__ ((simd)) short int
-+foo (void)
-+{
-+ return 0;
-+}
diff --git a/gcc12-pr104194.patch b/gcc12-pr104194.patch
new file mode 100644
index 0000000..f0747c7
--- /dev/null
+++ b/gcc12-pr104194.patch
@@ -0,0 +1,92 @@
+2022-01-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/104194
+ * dwarf2out.cc (long_double_as_float128): New function.
+ (modified_type_die): For powerpc64le IEEE 754 quad long double
+ and complex long double emit those as DW_TAG_typedef to
+ _Float128 or complex _Float128 base type.
+
+--- gcc/dwarf2out.cc.jj 2022-01-25 05:47:53.987454934 +0100
++++ gcc/dwarf2out.cc 2022-01-25 11:54:25.100522089 +0100
+@@ -13568,6 +13568,47 @@ qualified_die_p (dw_die_ref die, int *ma
+ return type;
+ }
+
++/* If TYPE is long double or complex long double that
++ should be emitted as artificial typedef to _Float128 or
++ complex _Float128, return the type it should be emitted as.
++ This is done in case the target already supports 16-byte
++ composite floating point type (ibm_extended_format). */
++
++static tree
++long_double_as_float128 (tree type)
++{
++ if (type != long_double_type_node
++ && type != complex_long_double_type_node)
++ return NULL_TREE;
++
++ machine_mode mode, fmode;
++ if (TREE_CODE (type) == COMPLEX_TYPE)
++ mode = TYPE_MODE (TREE_TYPE (type));
++ else
++ mode = TYPE_MODE (type);
++ if (known_eq (GET_MODE_SIZE (mode), 16) && !MODE_COMPOSITE_P (mode))
++ FOR_EACH_MODE_IN_CLASS (fmode, MODE_FLOAT)
++ if (known_eq (GET_MODE_SIZE (fmode), 16)
++ && MODE_COMPOSITE_P (fmode))
++ {
++ if (type == long_double_type_node)
++ {
++ if (float128_type_node
++ && (TYPE_MODE (float128_type_node)
++ == TYPE_MODE (type)))
++ return float128_type_node;
++ return NULL_TREE;
++ }
++ for (int i = 0; i < NUM_FLOATN_NX_TYPES; i++)
++ if (COMPLEX_FLOATN_NX_TYPE_NODE (i) != NULL_TREE
++ && (TYPE_MODE (COMPLEX_FLOATN_NX_TYPE_NODE (i))
++ == TYPE_MODE (type)))
++ return COMPLEX_FLOATN_NX_TYPE_NODE (i);
++ }
++
++ return NULL_TREE;
++}
++
+ /* Given a pointer to an arbitrary ..._TYPE tree node, return a debugging
+ entry that chains the modifiers specified by CV_QUALS in front of the
+ given type. REVERSE is true if the type is to be interpreted in the
+@@ -13848,7 +13889,32 @@ modified_type_die (tree type, int cv_qua
+ }
+ else if (is_base_type (type))
+ {
+- mod_type_die = base_type_die (type, reverse);
++ /* If a target supports long double as different floating point
++ modes with the same 16-byte size, use normal DW_TAG_base_type
++ only for the composite (ibm_extended_real_format) type and
++ for the other for the time being emit instead a "_Float128"
++ or "complex _Float128" DW_TAG_base_type and a "long double"
++ or "complex long double" typedef to it. */
++ if (tree other_type = long_double_as_float128 (type))
++ {
++ dw_die_ref other_die;
++ if (TYPE_NAME (other_type))
++ other_die
++ = modified_type_die (other_type, TYPE_UNQUALIFIED, reverse,
++ context_die);
++ else
++ {
++ other_die = base_type_die (type, reverse);
++ add_child_die (comp_unit_die (), other_die);
++ add_name_attribute (other_die,
++ TREE_CODE (type) == COMPLEX_TYPE
++ ? "complex _Float128" : "_Float128");
++ }
++ mod_type_die = new_die_raw (DW_TAG_typedef);
++ add_AT_die_ref (mod_type_die, DW_AT_type, other_die);
++ }
++ else
++ mod_type_die = base_type_die (type, reverse);
+
+ /* The DIE with DW_AT_endianity is placed right after the naked DIE. */
+ if (reverse_base_type)
diff --git a/gcc12-pr94193.patch b/gcc12-pr94193.patch
new file mode 100644
index 0000000..e669a81
--- /dev/null
+++ b/gcc12-pr94193.patch
@@ -0,0 +1,39 @@
+2022-01-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/94193
+ * config/rs6000/rs6000.md (feclearexceptsi, feraiseexceptsi):
+ Use general_operand instead of const_int_operand, drop constraint
+ and FAIL if operands[1] is not CONST_INT_P.
+
+--- gcc/config/rs6000/rs6000.md.jj 2022-01-25 05:48:01.497340303 +0100
++++ gcc/config/rs6000/rs6000.md 2022-01-25 13:48:13.752709482 +0100
+@@ -6959,12 +6959,12 @@ (define_expand "fegetroundsi"
+ ;; Because of these restrictions, this only expands on the desired
+ ;; cases and fallback to a call to libc on any other case.
+ (define_expand "feclearexceptsi"
+- [(use (match_operand:SI 1 "const_int_operand" "n"))
++ [(use (match_operand:SI 1 "general_operand"))
+ (set (match_operand:SI 0 "gpc_reg_operand")
+ (const_int 0))]
+ "TARGET_HARD_FLOAT"
+ {
+- if (!OPTION_GLIBC)
++ if (!OPTION_GLIBC || !CONST_INT_P (operands[1]))
+ FAIL;
+
+ unsigned int fe = INTVAL (operands[1]);
+@@ -6999,12 +6999,12 @@ (define_expand "feclearexceptsi"
+ ;; Because of these restrictions, this only expands on the desired
+ ;; cases and fallback to a call to libc on any other case.
+ (define_expand "feraiseexceptsi"
+- [(use (match_operand:SI 1 "const_int_operand" "n"))
++ [(use (match_operand:SI 1 "general_operand"))
+ (set (match_operand:SI 0 "gpc_reg_operand")
+ (const_int 0))]
+ "TARGET_HARD_FLOAT"
+ {
+- if (!OPTION_GLIBC)
++ if (!OPTION_GLIBC || !CONST_INT_P (operands[1]))
+ FAIL;
+
+ unsigned int fe = INTVAL (operands[1]);
diff --git a/sources b/sources
index 43d2957..fcd533a 100644
--- a/sources
+++ b/sources
@@ -1,4 +1,4 @@
-SHA512 (gcc-12.0.1-20220118.tar.xz) = 5fab239e915e71a8986a122e3f897f2236f21f0f183da33cad2ace8f34823cd8f32c7c0dfceffbfeae17cd99b656f242d30ddeb94eaafe3edf858ea88ec59016
+SHA512 (gcc-12.0.1-20220125.tar.xz) = 09c4b7d7fe3e8a2c0f4181da717e476c0868b2bb1c86cdd22482ee4235aebb9eb0c89b5f87b9a0e6852e0cc2876b652c60457996a86dc6e9b9b02ca2ff87613f
SHA512 (isl-0.18.tar.bz2) = 85d0b40f4dbf14cb99d17aa07048cdcab2dc3eb527d2fbb1e84c41b2de5f351025370e57448b63b2b8a8cf8a0843a089c3263f9baee1542d5c2e1cb37ed39d94
SHA512 (newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz) = 002a48a7b689a81abbf16161bcaec001a842e67dfbe372e9e109092703bfc666675f16198f60ca429370e8850d564547dc505df81bc3aaca4ce6defbc014ad6c
SHA512 (nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz) = f6d10db94fa1570ae0f94df073fa3c73c8e5ee16d59070b53d94f7db0de8a031bc44d7f3f1852533da04b625ce758e022263855ed43cfc6867e0708d001e53c7
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-06-29 12:29 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-06-29 12:29 [rpms/gcc] rhel-f41-base: 12.0.1-0.3 Jakub Jelinek
-- strict thread matches above, loose matches on Subject: below --
2026-06-29 12:29 Jakub Jelinek
2026-06-29 12:29 Jakub Jelinek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox