From ee0f1f2294baaecfa0c038fe7e8361949d1ebd68 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Sat, 20 May 2023 21:14:23 +0000 Subject: [PATCH] Fix PR 109919: ICE in emit_move_insn with some bit tests The problem is I used expand_expr with the target but we don't want to use the target here as it is the wrong mode for the original expression. The testcase would ICE deap down while trying to do a move to use the target. Anyways just calling expand_expr with NULL_EXPR fixes the issue. Committed as obvious after a bootstrap/test on x86_64-linux-gnu. PR middle-end/109919 gcc/ChangeLog: * expr.cc (expand_single_bit_test): Don't use the target for expand_expr. gcc/testsuite/ChangeLog: * gcc.c-torture/compile/pr109919-1.c: New test. --- gcc/expr.cc | 2 +- gcc/testsuite/gcc.c-torture/compile/pr109919-1.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr109919-1.c diff --git a/gcc/expr.cc b/gcc/expr.cc index 6849c9627d09..30c58c8dc5c9 100644 --- a/gcc/expr.cc +++ b/gcc/expr.cc @@ -12956,7 +12956,7 @@ expand_single_bit_test (location_t loc, enum tree_code code, intermediate_type = ops_unsigned ? unsigned_type : signed_type; inner = fold_convert_loc (loc, intermediate_type, inner); - rtx inner0 = expand_expr (inner, target, VOIDmode, EXPAND_NORMAL); + rtx inner0 = expand_expr (inner, NULL_RTX, VOIDmode, EXPAND_NORMAL); inner0 = extract_bit_field (inner0, 1, bitnum, 1, target, operand_mode, mode, 0, NULL); diff --git a/gcc/testsuite/gcc.c-torture/compile/pr109919-1.c b/gcc/testsuite/gcc.c-torture/compile/pr109919-1.c new file mode 100644 index 000000000000..bb612a1f020d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr109919-1.c @@ -0,0 +1,9 @@ +/* { dg-options "-fno-tree-dce -fno-tree-vrp" } */ +int a; +int main() { + int b = 1; + while (a) { + short c = b && ((a || a) & (a * c)); + } + return 0; +} -- 2.47.3