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

--- Comment #8 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
OK, the difference seems to be that on x86_64 even with -m32 we vectorize
kill_me:

__attribute__((noinline))
void kill_me (struct a * a)
{
  int * vectp.6;
  vector(2) int * vectp_a.5;

  <bb 2> [local count: 1073741824]:
  MEM <vector(2) int> [(int *)a_2(D)] = { 0, 0 };
  a_2(D)->c = 0;
  return;
}

which leads different modref summary:

   Limits: 32 bases, 16 refs
      Base 0: alias set 1
        Ref 0: alias set 1
          access: Parm 0 param offset:0 offset:0 size:64 max_size:64
      Base 1: alias set 2
        Ref 0: alias set 1
          access: Parm 0 param offset:0 offset:64 size:32 max_size:32
  kills:
     Parm 0 param offset:0 offset:0 size:96 max_size:96
  Try dse
  parm 0 flags: no_indirect_clobber no_direct_escape no_indirect_escape
no_direct_read no_indirect_read

compared to:

  loads:                                                                        
    Limits: 32 bases, 16 refs                                                   
  stores:                                                                       
    Limits: 32 bases, 16 refs                                                   
      Base 0: alias set 2                                                       
        Ref 0: alias set 1                                                      
          access: Parm 0 param offset:0 offset:0 size:32 max_size:96            
  kills:                                                                        
     Parm 0 param offset:0 offset:0 size:96 max_size:96                         
  Try dse                                                                       
  parm 0 flags: no_indirect_clobber no_direct_escape no_indirect_escape
no_direct_read no_indirect_read

Both summaries are correct and I wonder why bytewise DSE does not like the
second.

Reply via email to