tree-optimization/111614 - missing convert in undistribute_bitref_for_vector
Checks
Commit Message
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
new file mode 100644
@@ -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 (;;)
+ ;
+}
@@ -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);