60 lines
1.8 KiB
Diff
60 lines
1.8 KiB
Diff
2024-04-18 Jakub Jelinek <jakub@redhat.com>
|
|
|
|
* tree-vect-stmts.c (vectorizable_call): For j == 0 use
|
|
vargs.safe_grow (nargs) rather than vargs.create (nargs), for j != 0
|
|
remove vargs.truncate (0). Instead of vargs.quick_push store into
|
|
vargs[i]. Use vargs[i] instead of gimple_call_arg (new_stmt, i)
|
|
if j != 0.
|
|
|
|
* gcc.c-torture/compile/20240418.c: New test.
|
|
|
|
--- gcc/tree-vect-stmts.c.jj 2021-04-22 15:48:48.228178359 +0200
|
|
+++ gcc/tree-vect-stmts.c 2024-04-18 13:21:46.104061529 +0200
|
|
@@ -3242,9 +3242,7 @@ vectorizable_call (gimple *gs, gimple_st
|
|
{
|
|
/* Build argument list for the vectorized call. */
|
|
if (j == 0)
|
|
- vargs.create (nargs);
|
|
- else
|
|
- vargs.truncate (0);
|
|
+ vargs.safe_grow (nargs);
|
|
|
|
if (slp_node)
|
|
{
|
|
@@ -3252,7 +3250,7 @@ vectorizable_call (gimple *gs, gimple_st
|
|
vec<tree> vec_oprnds0;
|
|
|
|
for (i = 0; i < nargs; i++)
|
|
- vargs.quick_push (gimple_call_arg (stmt, i));
|
|
+ vargs[i] = gimple_call_arg (stmt, i);
|
|
vect_get_slp_defs (vargs, slp_node, &vec_defs);
|
|
vec_oprnds0 = vec_defs[0];
|
|
|
|
@@ -3314,13 +3312,10 @@ vectorizable_call (gimple *gs, gimple_st
|
|
vec_oprnd0
|
|
= vect_get_vec_def_for_operand (op, stmt);
|
|
else
|
|
- {
|
|
- vec_oprnd0 = gimple_call_arg (new_stmt, i);
|
|
- vec_oprnd0
|
|
- = vect_get_vec_def_for_stmt_copy (dt[i], vec_oprnd0);
|
|
- }
|
|
+ vec_oprnd0
|
|
+ = vect_get_vec_def_for_stmt_copy (dt[i], vargs[i]);
|
|
|
|
- vargs.quick_push (vec_oprnd0);
|
|
+ vargs[i] = vec_oprnd0;
|
|
}
|
|
|
|
if (gimple_call_internal_p (stmt)
|
|
--- gcc/testsuite/gcc.c-torture/compile/20240418.c.jj 2024-04-18 13:24:10.180065661 +0200
|
|
+++ gcc/testsuite/gcc.c-torture/compile/20240418.c 2024-04-18 13:19:12.166194018 +0200
|
|
@@ -0,0 +1,7 @@
|
|
+void
|
|
+foo (signed char *p, unsigned long long *q)
|
|
+{
|
|
+ int i;
|
|
+ for (i = 0; i <= 64; i++)
|
|
+ *p++ = __builtin_popcountll (*q++);
|
|
+}
|