----- Message d'origine ---- De : Andrew Haley <aph@xxxxxxxxxx> À : gcc-help@xxxxxxxxxxx Envoyé le : Mer 20 avril 2011, 10h 55min 15s Objet : Re: Re : Re : OR in Generic or Gimple On 20/04/11 09:40, charfi asma wrote: > >> int y =x+10; >> if ((y > 1) || (y < 9)) .... >> >> I get this: >> >> int main() () >> { >> int D.2071; >> >> { >> int x; >> int y; >> >> x = 6; >> y = x + 10; >> if (1 != 0) goto <D.2069>; else goto <D.2070>; >> <D.2069>: >> D.2071 = 10; >> return D.2071; >> <D.2070>: >> D.2071 = 0; >> return D.2071; >> } >> D.2071 = 0; >> return D.2071; >> } >> >> Any way, did so know which generic tree code or gimple statement used to >> generate this ? why if ((y > 1) || (y < 9)) is translated to if (1!=0) ?? > > Well, we know that x == 6, so y == 6 + 10. Therefore we know that > (y == 1) || (y==0) is false. > > So, the expression (y == 1) || (y==0) can be replaced with 1 != 0 . > > Andrew. > > Andrew, 1!=0 is true ;) and the OR expression is if ((y > 1) || (y < 9)) that >is > > also true. I did not say that gcc make a mistake in evaluating this but I would > > like to know how it is translated in gimple which generic tree code are used, > where it does this transfo from if ((y > 1) || (y < 9)) to (1!=0) ? in the > gimplify function or when it builds generic if it builds it .... It looks like constant folding. Hard to say, because no gcc version I have does it. With 4.6 I get: x = 6; y = x + 10; if (y == 1) goto <D.2069>; else goto <D.2071>; <D.2071>: if (y == 0) goto <D.2069>; else goto <D.2070>; <D.2069>: D.2072 = 10; return D.2072; <D.2070>: D.2072 = 0; return D.2072; Are you using optimization? Andrew. Ah!! that's it Andrew, thank you very much, In fact I used -Os :) when I remove this flag I get the same gimple than yours :) but I thought that gcc does its optimizations in the SSA and only early optimizations (Inter procedural optimizations IPA) are done in early stages. Did this mean that gcc also perform optimizations in gimple ?? like constant propagation ? thank you very much Asma