* [PATCH] tree-optimization/111614 - missing convert in undistribute_bitref_for_vector
@ 2023-09-28 9:24 Richard Biener
0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2023-09-28 9:24 UTC (permalink / raw)
To: gcc-patches
The following adjusts a flawed guard for converting the first vector
of the sum we create in undistribute_bitref_for_vector.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
PR tree-optimization/111614
* tree-ssa-reassoc.cc (undistribute_bitref_for_vector): Properly
convert the first vector when required.
* gcc.dg/torture/pr111614.c: New testcase.
---
gcc/testsuite/gcc.dg/torture/pr111614.c | 23 +++++++++++++++++++++
gcc/tree-ssa-reassoc.cc | 27 ++++++++++++++-----------
2 files changed, 38 insertions(+), 12 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/torture/pr111614.c
diff --git a/gcc/testsuite/gcc.dg/torture/pr111614.c b/gcc/testsuite/gcc.dg/torture/pr111614.c
new file mode 100644
index 00000000000..0f3ecbae86c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr111614.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+int a, b, c, d, e;
+static void f() {
+ int *g = &b;
+ b = 1;
+ for (; b >= 0; b--) {
+ c = 0;
+ for (; c <= 1; c++)
+ e = 0;
+ for (; e <= 1; e++) {
+ int h, i = h = 13;
+ for (; h; h--)
+ i = i << a;
+ d &= i + c + 9 + *g;
+ }
+ }
+}
+int main() {
+ f();
+ for (;;)
+ ;
+}
diff --git a/gcc/tree-ssa-reassoc.cc b/gcc/tree-ssa-reassoc.cc
index eda03bf98a6..41ee36413b5 100644
--- a/gcc/tree-ssa-reassoc.cc
+++ b/gcc/tree-ssa-reassoc.cc
@@ -2102,12 +2102,24 @@ undistribute_bitref_for_vector (enum tree_code opcode,
{
sum = build_and_add_sum (vec_type, sum_vec,
valid_vecs[i + 1], opcode);
+ /* Update the operands only after build_and_add_sum,
+ so that we don't have to repeat the placement algorithm
+ of build_and_add_sum. */
+ if (sum_vec == tvec
+ && !useless_type_conversion_p (vec_type, TREE_TYPE (sum_vec)))
+ {
+ gimple_stmt_iterator gsi = gsi_for_stmt (sum);
+ tree vce = build1 (VIEW_CONVERT_EXPR, vec_type, sum_vec);
+ tree lhs = make_ssa_name (vec_type);
+ gimple *g = gimple_build_assign (lhs, VIEW_CONVERT_EXPR, vce);
+ gimple_set_uid (g, gimple_uid (sum));
+ gsi_insert_before (&gsi, g, GSI_NEW_STMT);
+ gimple_assign_set_rhs1 (sum, lhs);
+ update_stmt (sum);
+ }
if (!useless_type_conversion_p (vec_type,
TREE_TYPE (valid_vecs[i + 1])))
{
- /* Update the operands only after build_and_add_sum,
- so that we don't have to repeat the placement algorithm
- of build_and_add_sum. */
gimple_stmt_iterator gsi = gsi_for_stmt (sum);
tree vce = build1 (VIEW_CONVERT_EXPR, vec_type,
valid_vecs[i + 1]);
@@ -2116,15 +2128,6 @@ undistribute_bitref_for_vector (enum tree_code opcode,
gimple_set_uid (g, gimple_uid (sum));
gsi_insert_before (&gsi, g, GSI_NEW_STMT);
gimple_assign_set_rhs2 (sum, lhs);
- if (sum_vec == tvec)
- {
- vce = build1 (VIEW_CONVERT_EXPR, vec_type, sum_vec);
- lhs = make_ssa_name (vec_type);
- g = gimple_build_assign (lhs, VIEW_CONVERT_EXPR, vce);
- gimple_set_uid (g, gimple_uid (sum));
- gsi_insert_before (&gsi, g, GSI_NEW_STMT);
- gimple_assign_set_rhs1 (sum, lhs);
- }
update_stmt (sum);
}
sum_vec = gimple_get_lhs (sum);
--
2.35.3
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-09-28 9:24 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-28 9:24 [PATCH] tree-optimization/111614 - missing convert in undistribute_bitref_for_vector Richard Biener
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).