2024-04-18 Jakub Jelinek * 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 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++); +}