https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92295

--- Comment #1 from Hongtao.liu <crazylht at gmail dot com> ---
Created attachment 47143
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47143&action=edit
This patch can fix this issue

In ix86_expand_vector_init_concat, vector are initialized per 2 elements,
that's why it failed to generate vpbroadcast, any purpose of this code???

----------
13784      /* FIXME: We process inputs backward to help RA.  PR 36222.  */      
13785      i = n - 1;                                                           
13786      j = (n >> 1) - 1;                                                    
13787      for (; i > 0; i -= 2, j--)                                           
13788        {                                                                  
13789          first[j] = gen_reg_rtx (cmode);                                  
13790          v = gen_rtvec (2, ops[i - 1], ops[i]);                           
13791          ix86_expand_vector_init (false, first[j],                        
13792                                   gen_rtx_PARALLEL (cmode, v));           
13793        }                                                                  
13794                                                                           
13795      n >>= 1;                                                             
13796      if (n > 4)
------------

it can be implemented like
---
13776      /* FIXME: We process inputs backward to help RA.  PR 36222.  */      
13777      i = n - 1;                                                           
13778      for (j = 1; j != -1; j--)                                            
13779        {                                                                  
13780          half[j] = gen_reg_rtx (half_mode);                               
13781          switch (n >> 1)                                                  
13782            {                                                              
13783            case 2:                                                        
13784              v = gen_rtvec (2, ops[i-1], ops[i]);                         
13785              i -= 2;                                                      
13786              break;                                                       
13787            case 4:                                                        
13788              v = gen_rtvec (4, ops[i-3], ops[i-2], ops[i-1], ops[i]);     
13789              i -= 4;                                                      
13790              break;                                                       
13791            case 8:                                                        
13792              v = gen_rtvec (8, ops[i-7], ops[i-6], ops[i-5], ops[i-4],    
13793                             ops[i-3], ops[i-2], ops[i-1], ops[i]);        
13794              i -= 8;                                                      
13795              break;                                                       
13796            default:                                                       
13797              gcc_unreachable ();                                          
13798            }                                                              
13799          ix86_expand_vector_init (false, half[j],                         
13800                                   gen_rtx_PARALLEL (half_mode, v));       
13801        }                                                                  
13802                                                                           
13803      ix86_expand_vector_init_concat (mode, target, half, 2);              
13804      break;   
---

Bootstrap and regression test is ok.

Reply via email to