[PATCH] Some further match.pd optimizations with nop_convert (PR tree-optimization/92734)

Richard Biener rguenther@suse.de
Thu Dec 5 15:16:00 GMT 2019


On December 5, 2019 2:03:24 PM GMT+01:00, Marc Glisse <marc.glisse@inria.fr> wrote:
>On Wed, 4 Dec 2019, Jakub Jelinek wrote:
>
>> --- gcc/match.pd.jj	2019-12-03 10:20:00.244913801 +0100
>> +++ gcc/match.pd	2019-12-03 13:36:01.084435697 +0100
>> @@ -2159,20 +2159,26 @@ (define_operator_list COND_TERNARY
>>   /* A - (A +- B)       -> -+ B */
>>   /* A +- (B -+ A)      ->  +- B */
>>   (simplify
>> -    (minus (plus:c @0 @1) @0)
>> -    @1)
>> +   (minus (nop_convert (plus:c (nop_convert @0) @1)) @0)
>> +   (view_convert @1))
>
>I know I introduced nop_convert, and it can be convenient, but IIRC it
>also has some limitations.
>
>int f(int b,unsigned c){
>   int a=c;
>   int d=a+b;
>   return d-a;
>}
>int g(int a, int b){
>   int d=(unsigned)a+b;
>   return d-a;
>}
>int h(int b,int a){
>   int d=a+b;
>   return d-a;
>}
>
>While g and h are properly optimized during forwprop1, f isn't, because
>
>nop_convert sees that 'a' comes from a conversion, and only returns d 
>(unlike 'convert?' which would try both a and d).
>
>When inside nop_convert we have an operation, say (nop_convert (plus
>...)), there is no ambiguity, so we are fine. With just (nop_convert
>@0), 
>less so.
>
>It happens that during EVRP, for some reason (different valuization 
>function?), nop_convert does not match the conversion, and we do
>optimize 
>f. But that almost looks like an accident.
>
>convert? with explicit checks would probably work better for the inner 
>conversion, except that handling the vector view_convert case may
>become 
>painful. I didn't think too hard about possible fancy tricks like a
>second 
>nop_convert:
>
>(minus (nop_convert (plus:c (nop_convert @0) @1)) (nop_convert @0))

If use gets more and more we can make nop_convert a first class citizen and allow a? Variant. Or handle all predicates as? Variant. 

Richard. 



More information about the Gcc-patches mailing list