[gcc r16-9099] tree-optimization/125686 - missing bits in PR125646 fix

Richard Biener rguenth@gcc.gnu.org
Mon Jun 15 13:38:28 GMT 2026


https://gcc.gnu.org/g:a30040ef981c89f2fd9f966c96ec28b5b46c8a18

commit r16-9099-ga30040ef981c89f2fd9f966c96ec28b5b46c8a18
Author: Richard Biener <rguenther@suse.de>
Date:   Wed Jun 10 13:50:16 2026 +0200

    tree-optimization/125686 - missing bits in PR125646 fix
    
    The following patches up synth_lshift_by_additions and
    apply_binop_and_append_stmt to set the correct vector type on
    the pattern stmt generated.
    
            PR tree-optimization/125686
            * tree-vect-patterns.cc (synth_lshift_by_additions): Specify
            pattern vector type.
            (apply_binop_and_append_stmt): Likewise.
            (vect_synth_mult_by_constant): Adjust.
    
    (cherry picked from commit de7756c90f3bebdf02492842ec355d7e18745e7b)

Diff:
---
 gcc/tree-vect-patterns.cc | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
index 8d1bfde19ad8..d1f36fd87c62 100644
--- a/gcc/tree-vect-patterns.cc
+++ b/gcc/tree-vect-patterns.cc
@@ -4244,7 +4244,7 @@ target_supports_mult_synth_alg (struct algorithm *alg, mult_variant var,
 static gimple *
 synth_lshift_by_additions (vec_info *vinfo,
 			   tree dest, tree op, HOST_WIDE_INT amnt,
-			   stmt_vec_info stmt_info)
+			   stmt_vec_info stmt_info, tree vectype)
 {
   HOST_WIDE_INT i;
   tree itype = TREE_TYPE (op);
@@ -4258,7 +4258,7 @@ synth_lshift_by_additions (vec_info *vinfo,
         = gimple_build_assign (tmp_var, PLUS_EXPR, prev_res, prev_res);
       prev_res = tmp_var;
       if (i < amnt - 1)
-	append_pattern_def_seq (vinfo, stmt_info, stmt);
+	append_pattern_def_seq (vinfo, stmt_info, stmt, vectype);
       else
 	return stmt;
     }
@@ -4276,7 +4276,8 @@ synth_lshift_by_additions (vec_info *vinfo,
 static tree
 apply_binop_and_append_stmt (vec_info *vinfo,
 			     tree_code code, tree op1, tree op2,
-			     stmt_vec_info stmt_vinfo, bool synth_shift_p)
+			     stmt_vec_info stmt_vinfo, tree vectype,
+			     bool synth_shift_p)
 {
   if (integer_zerop (op2)
       && (code == LSHIFT_EXPR
@@ -4294,13 +4295,14 @@ apply_binop_and_append_stmt (vec_info *vinfo,
       && synth_shift_p)
     {
       stmt = synth_lshift_by_additions (vinfo, tmp_var, op1,
-					TREE_INT_CST_LOW (op2), stmt_vinfo);
-      append_pattern_def_seq (vinfo, stmt_vinfo, stmt);
+					TREE_INT_CST_LOW (op2), stmt_vinfo,
+					vectype);
+      append_pattern_def_seq (vinfo, stmt_vinfo, stmt, vectype);
       return tmp_var;
     }
 
   stmt = gimple_build_assign (tmp_var, code, op1, op2);
-  append_pattern_def_seq (vinfo, stmt_vinfo, stmt);
+  append_pattern_def_seq (vinfo, stmt_vinfo, stmt, vectype);
   return tmp_var;
 }
 
@@ -4420,7 +4422,7 @@ vect_synth_mult_by_constant (vec_info *vinfo, tree op, tree val,
 	  if (synth_shift_p)
 	    stmt
 	      = synth_lshift_by_additions (vinfo, accum_tmp, accumulator,
-					   alg.log[i], stmt_vinfo);
+					   alg.log[i], stmt_vinfo, vectype);
 	  else
 	    stmt = gimple_build_assign (accum_tmp, LSHIFT_EXPR, accumulator,
 					 shft_log);
@@ -4428,14 +4430,14 @@ vect_synth_mult_by_constant (vec_info *vinfo, tree op, tree val,
 	case alg_add_t_m2:
 	  tmp_var
 	    = apply_binop_and_append_stmt (vinfo, LSHIFT_EXPR, op, shft_log,
-					   stmt_vinfo, synth_shift_p);
+					   stmt_vinfo, vectype, synth_shift_p);
 	  stmt = gimple_build_assign (accum_tmp, PLUS_EXPR, accumulator,
 				       tmp_var);
 	  break;
 	case alg_sub_t_m2:
 	  tmp_var = apply_binop_and_append_stmt (vinfo, LSHIFT_EXPR, op,
 						 shft_log, stmt_vinfo,
-						 synth_shift_p);
+						 vectype, synth_shift_p);
 	  /* In some algorithms the first step involves zeroing the
 	     accumulator.  If subtracting from such an accumulator
 	     just emit the negation directly.  */
@@ -4448,26 +4450,30 @@ vect_synth_mult_by_constant (vec_info *vinfo, tree op, tree val,
 	case alg_add_t2_m:
 	  tmp_var
 	    = apply_binop_and_append_stmt (vinfo, LSHIFT_EXPR, accumulator,
-					   shft_log, stmt_vinfo, synth_shift_p);
+					   shft_log, stmt_vinfo, vectype,
+					   synth_shift_p);
 	  stmt = gimple_build_assign (accum_tmp, PLUS_EXPR, tmp_var, op);
 	  break;
 	case alg_sub_t2_m:
 	  tmp_var
 	    = apply_binop_and_append_stmt (vinfo, LSHIFT_EXPR, accumulator,
-					   shft_log, stmt_vinfo, synth_shift_p);
+					   shft_log, stmt_vinfo, vectype,
+					   synth_shift_p);
 	  stmt = gimple_build_assign (accum_tmp, MINUS_EXPR, tmp_var, op);
 	  break;
 	case alg_add_factor:
 	  tmp_var
 	    = apply_binop_and_append_stmt (vinfo, LSHIFT_EXPR, accumulator,
-					   shft_log, stmt_vinfo, synth_shift_p);
+					   shft_log, stmt_vinfo, vectype,
+					   synth_shift_p);
 	  stmt = gimple_build_assign (accum_tmp, PLUS_EXPR, accumulator,
 				       tmp_var);
 	  break;
 	case alg_sub_factor:
 	  tmp_var
 	    = apply_binop_and_append_stmt (vinfo, LSHIFT_EXPR, accumulator,
-					   shft_log, stmt_vinfo, synth_shift_p);
+					   shft_log, stmt_vinfo, vectype,
+					   synth_shift_p);
 	  stmt = gimple_build_assign (accum_tmp, MINUS_EXPR, tmp_var,
 				      accumulator);
 	  break;


More information about the Gcc-cvs mailing list