public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-8522] expand: Fix up expand_cond_expr_using_cmove [PR106030]
@ 2022-06-28 15:38 Jakub Jelinek
0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2022-06-28 15:38 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:d068623e5b109e635e2ec2acfcf15e7c50c7f15c
commit r12-8522-gd068623e5b109e635e2ec2acfcf15e7c50c7f15c
Author: Jakub Jelinek <jakub@redhat.com>
Date: Tue Jun 21 11:38:59 2022 +0200
expand: Fix up expand_cond_expr_using_cmove [PR106030]
If expand_cond_expr_using_cmove can't find a cmove optab for a particular
mode, it tries to promote the mode and perform the cmove in the promoted
mode.
The testcase in the patch ICEs on arm because in that case we pass temp which
has the promoted mode (SImode) as target to expand_operands where the
operands have the non-promoted mode (QImode).
Later on the function uses paradoxical subregs:
if (GET_MODE (op1) != mode)
op1 = gen_lowpart (mode, op1);
if (GET_MODE (op2) != mode)
op2 = gen_lowpart (mode, op2);
to change the operand modes.
The following patch fixes it by passing NULL_RTX as target if it has
promoted mode.
2022-06-21 Jakub Jelinek <jakub@redhat.com>
PR middle-end/106030
* expr.cc (expand_cond_expr_using_cmove): Pass NULL_RTX instead of
temp to expand_operands if mode has been promoted.
* gcc.c-torture/compile/pr106030.c: New test.
(cherry picked from commit 2df1df945fac85d7b3d084001414a66a2709d8fe)
Diff:
---
gcc/expr.cc | 3 ++-
gcc/testsuite/gcc.c-torture/compile/pr106030.c | 16 ++++++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/gcc/expr.cc b/gcc/expr.cc
index 5f7142b975a..dee3fc6148c 100644
--- a/gcc/expr.cc
+++ b/gcc/expr.cc
@@ -8783,7 +8783,8 @@ expand_cond_expr_using_cmove (tree treeop0 ATTRIBUTE_UNUSED,
expanding_cond_expr_using_cmove = true;
start_sequence ();
expand_operands (treeop1, treeop2,
- temp, &op1, &op2, EXPAND_NORMAL);
+ mode == orig_mode ? temp : NULL_RTX, &op1, &op2,
+ EXPAND_NORMAL);
if (TREE_CODE (treeop0) == SSA_NAME
&& (srcstmt = get_def_for_expr_class (treeop0, tcc_comparison)))
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr106030.c b/gcc/testsuite/gcc.c-torture/compile/pr106030.c
new file mode 100644
index 00000000000..7514b348ff9
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr106030.c
@@ -0,0 +1,16 @@
+/* PR middle-end/106030 */
+
+int a, b, c;
+
+char
+foo (int x, int y)
+{
+ return x * y;
+}
+
+void
+bar (void)
+{
+ char d = (foo <= b) * a;
+ c = foo (2 != bar, d);
+}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-06-28 15:38 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-28 15:38 [gcc r12-8522] expand: Fix up expand_cond_expr_using_cmove [PR106030] Jakub Jelinek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).