After the conversion for phiopt's conditional operand to use maybe_push_res_to_seq, it was found that gimple_extract will extract out from REALPART_EXPR/IMAGPART_EXPR/VCE and BIT_FIELD_REF, a memory load. But that extraction was not needed as memory loads are not simplified in match and simplify. So gimple_extract should return false in those cases.
Changes since v1: * Move the rejection to gimple_extract from factor_out_conditional_operation. GCC13: the function is in gimple-match-head.cc rather than gimple-match-exports.cc. Bootstrapped and tested on x86_64-linux-gnu. PR tree-optimization/116412 gcc/ChangeLog: * gimple-match-head.cc (gimple_extract): Return false if op0 was not a SSA name nor a min invariant for REALPART_EXPR/IMAGPART_EXPR/VCE and BIT_FIELD_REF. gcc/testsuite/ChangeLog: * gcc.dg/torture/pr116412-1.c: New test. Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> (cherry picked from commit c7b76a076cb2c6ded7ae208464019b04cb0531a2) --- gcc/gimple-match-head.cc | 6 ++++++ gcc/testsuite/gcc.dg/torture/pr116412-1.c | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr116412-1.c diff --git a/gcc/gimple-match-head.cc b/gcc/gimple-match-head.cc index 21843d7870b..b3e7792a8fa 100644 --- a/gcc/gimple-match-head.cc +++ b/gcc/gimple-match-head.cc @@ -945,6 +945,9 @@ gimple_extract (gimple *stmt, gimple_match_op *res_op, || code == VIEW_CONVERT_EXPR) { tree op0 = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0); + /* op0 needs to be a SSA name or an min invariant. */ + if (TREE_CODE (op0) != SSA_NAME && !is_gimple_min_invariant (op0)) + return false; res_op->set_op (code, type, valueize_op (op0)); return true; } @@ -952,6 +955,9 @@ gimple_extract (gimple *stmt, gimple_match_op *res_op, { tree rhs1 = gimple_assign_rhs1 (stmt); tree op0 = valueize_op (TREE_OPERAND (rhs1, 0)); + /* op0 needs to be a SSA name or an min invariant. */ + if (TREE_CODE (op0) != SSA_NAME && !is_gimple_min_invariant (op0)) + return false; res_op->set_op (code, type, op0, TREE_OPERAND (rhs1, 1), TREE_OPERAND (rhs1, 2), diff --git a/gcc/testsuite/gcc.dg/torture/pr116412-1.c b/gcc/testsuite/gcc.dg/torture/pr116412-1.c new file mode 100644 index 00000000000..3bc26ecd8b8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr116412-1.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +double f(_Complex double a, _Complex double *b, int c) +{ + if (c) return __real__ a; + return __real__ *b; +} -- 2.43.0