On Sun, May 20, 2012 at 1:40 AM, Andrew Pinski <pins...@gmail.com> wrote: > The problem here is that tree-if-conv.c produces COND_EXPR instead of > the MAX/MIN EXPRs. When I added the expansion from COND_EXPR to > conditional moves, I assumes that the expressions which should have > been converted into MAX_EXPR/MIN_EXPR have already happened. > > This fixes the problem by having tree-if-conv fold the expression so > the MIN_EXPR/MAX_EXPR appears in the IR rather than COND_EXPR and the > expansion happens correctly to the min/max rtl rather than just > through the conditional move ones. > > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
As we are unconditionally building a gimple_assign from the folding result you need to re-gimplify it. The code was using build3 instead of fold_build3 to avoid that and to make sure we create a plain COND_EXPR we can later CSE / simplify properly. Generating a MAX_EXPR directly is certainly fine (can we always vectorize that?), but I suppose simply changing the code to use fold_build3 will have unwanted fallout (consider folds habit to insert conversions that are not requried on gimple). So I'd rather prefer to abstract the build3 (COND_EXPR,... into a helper function that uses fold_ternary and only if the result is an invariant/register or a MIN/MAX_EXPR use the result, canonicalizing it properly. Richard. > Thanks, > Andrew Pinski > > ChangeLog: > * tree-if-conv.c (predicate_scalar_phi): Call fold_build3 instead of build3. > (predicate_mem_writes): Likewise.