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.
This commit is contained in:
parent
57424087e8
commit
2df1df945f
2 changed files with 18 additions and 1 deletions
|
@ -8832,7 +8832,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)))
|
||||
|
|
16
gcc/testsuite/gcc.c-torture/compile/pr106030.c
Normal file
16
gcc/testsuite/gcc.c-torture/compile/pr106030.c
Normal file
|
@ -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);
|
||||
}
|
Loading…
Add table
Reference in a new issue