[Bug tree-optimization/92980] [miss optimization]redundant load missed by fre.

wwwhhhyyy333 at gmail dot com gcc-bugzilla@gcc.gnu.org
Thu Jan 16 02:55:00 GMT 2020


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

--- Comment #9 from Hongyu Wang <wwwhhhyyy333 at gmail dot com> ---
(In reply to Hongtao.liu from comment #6)
> New fail by removal

> unix/-m32: gcc.dg/tree-ssa/copy-headers-5.c scan-tree-dump ch2 "is now
> do-while loop"
> unix/-m32: gcc.dg/tree-ssa/copy-headers-5.c scan-tree-dump-times ch2 "  if "
> 3
> unix/-m32: gcc.dg/tree-ssa/copy-headers-7.c scan-tree-dump ch2 "is now
> do-while loop"
> unix/-m32: gcc.dg/tree-ssa/copy-headers-7.c scan-tree-dump-times ch2 "Will
> duplicate bb" 3
> unix/-m32: gcc.dg/tree-ssa/pr81744.c scan-tree-dump-times pcom "Store-stores
> chain" 2
> unix/-m64: gcc.dg/tree-ssa/copy-headers-5.c scan-tree-dump ch2 "is now
> do-while loop"
> unix/-m64: gcc.dg/tree-ssa/copy-headers-5.c scan-tree-dump-times ch2 "  if "
> 3
> unix/-m64: gcc.dg/tree-ssa/copy-headers-7.c scan-tree-dump ch2 "is now
> do-while loop"
> unix/-m64: gcc.dg/tree-ssa/copy-headers-7.c scan-tree-dump-times ch2 "Will
> duplicate bb" 3

I looked into this and found it is because of current judgement for do-while
loop:

----------
 <bb 2> [local count: 114863532]:  
 goto <bb 4>; [100.00%]            

 <bb 3> [local count: 1014686025]: 
 i.0_1 = (unsigned int) i_11;      
 _2 = i.0_1 * 4;                   
 _3 = a_14(D) + _2;                
 _4 = *_3;                         
 _5 = i_11 + 1;                    
 _6 = (unsigned int) _5;           
 _7 = _6 * 4;                      
 _8 = a_14(D) + _7;                
 _9 = *_8;                         
 if (_4 > _9)                      
   goto <bb 5>; [5.50%]            
 else                              
   goto <bb 6>; [94.50%]           

 <bb 6> [local count: 958878294]:  

 <bb 4> [local count: 1073741824]: 
 # i_11 = PHI <0(2), _5(6)>        
 _10 = n_13(D) + -1;               
 if (_10 > i_11)                   
   goto <bb 3>; [94.50%]           
 else                              
   goto <bb 5>; [5.50%]            

 <bb 5> [local count: 114863532]:  
 # _12 = PHI <0(3), 1(4)>          
 return _12;                       

This is regarded as a do-while loop because the it satisfies all the condition
for do-while loop judgement:

1) Loop latch is empty.
2) The latch has single predecessor.
3) The latch predecessor will exit loop.

But I don't think the loop above is a do-while loop, so does the conditions
need to be modified?


More information about the Gcc-bugs mailing list