public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-10013] tree-optimization/111614 - missing convert in undistribute_bitref_for_vector
@ 2023-11-27 13:09 Richard Biener
0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2023-11-27 13:09 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:e4b5aca4433bd1c6de4ea2585700770bba8eb0d7
commit r12-10013-ge4b5aca4433bd1c6de4ea2585700770bba8eb0d7
Author: Richard Biener <rguenther@suse.de>
Date: Thu Sep 28 09:41:30 2023 +0200
tree-optimization/111614 - missing convert in undistribute_bitref_for_vector
The following adjusts a flawed guard for converting the first vector
of the sum we create in undistribute_bitref_for_vector.
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.
(cherry picked from commit 88d79b9b03eccf39921d13c2cbd1acc50aeda126)
Diff:
---
gcc/testsuite/gcc.dg/torture/pr111614.c | 23 +++++++++++++++++++++++
gcc/tree-ssa-reassoc.cc | 27 +++++++++++++++------------
2 files changed, 38 insertions(+), 12 deletions(-)
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 e3d521e3267..1863d4e361a 100644
--- a/gcc/tree-ssa-reassoc.cc
+++ b/gcc/tree-ssa-reassoc.cc
@@ -2101,12 +2101,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]);
@@ -2115,15 +2127,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);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-11-27 13:09 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-27 13:09 [gcc r12-10013] 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).