aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <quic_apinski@quicinc.com>2024-08-19 08:06:36 -0700
committerAndrew Pinski <quic_apinski@quicinc.com>2024-08-20 15:05:37 -0700
commitc7b76a076cb2c6ded7ae208464019b04cb0531a2 (patch)
treedf96ea8f786ab26753f373ea75a09270da161e72
parent5d5193f0734fb4706940f7ac79899da25250be9d (diff)
downloadgcc-c7b76a076cb2c6ded7ae208464019b04cb0531a2.zip
gcc-c7b76a076cb2c6ded7ae208464019b04cb0531a2.tar.gz
gcc-c7b76a076cb2c6ded7ae208464019b04cb0531a2.tar.bz2
match: Reject non-ssa name/min invariants in gimple_extract [PR116412]
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. Bootstrapped and tested on x86_64-linux-gnu. PR tree-optimization/116412 gcc/ChangeLog: * gimple-match-exports.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_apinski@quicinc.com>
-rw-r--r--gcc/gimple-match-exports.cc6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr116412-1.c6
2 files changed, 12 insertions, 0 deletions
diff --git a/gcc/gimple-match-exports.cc b/gcc/gimple-match-exports.cc
index 15d54b7..86e4010 100644
--- a/gcc/gimple-match-exports.cc
+++ b/gcc/gimple-match-exports.cc
@@ -740,6 +740,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;
}
@@ -747,6 +750,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 0000000..3bc26ec
--- /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;
+}