On Thu, Nov 6, 2014 at 2:40 AM, Richard Biener <rguent...@suse.de> wrote: > On Thu, 6 Nov 2014, Richard Biener wrote: > >> On Wed, 5 Nov 2014, Andrew Pinski wrote: >> >> > Hi, >> > I was trying to hook up tree-ssa-phiopt to match-and-simplify using >> > either gimple_build (or rather using gimple_simplify depending on if >> > we want to produce cond_expr for conditional move). I ran into a >> > problem. >> > With the pattern below: >> > /* a ? 0 : 1 -> a if 0 and 1 are integral types. */ >> > (simplify >> > (cond_expr @0 integer_zerop integer_onep) >> > (if (INTEGRAL_TYPE_P (type)) >> > (convert @0))) >> >> Ok, so you are capturing a GENERIC expr here but nothing knows that. >> It would work if you'd do (ugh) >> >> (for op (lt le eq ne ge gt) >> (simplify >> (cond_expr (op @0 @1) integer_zerop integer_onep) >> (if (INTEGRAL_TYPE_P (type)) >> (convert (op @0 @1))))) >> (simplify >> (cond_expr SSA_NAME@0 integer_zerop integer_onep) >> (if (INTEGRAL_TYPE_P (type)) >> (convert @0)))) >> >> as a workaround. To make your version work will require (quite) >> some special-casing in the code generator or maybe the resimplify >> helper. Let me see if I can cook up a "simple" fix. > > Sth like below (for the real fix this has to be replicated in > all gimple_resimplifyN functions). I'm missing a testcase > where the pattern would apply (and not be already folded by fold), > so I didn't check if it actually works.
You do need to check if seq is NULL though as gimple_build depends on seq not being NULL. But otherwise yes this works for me. > > Bah, of course we should fix COND_EXPRs to not embed a GENERIC > expr... Yes totally agree. For my changes to tree-ssa-phiopt, I no longer embed it. Though we need to change loop ifconvert still. Thanks, Andrew > > Richard. > > Index: gcc/gimple-match-head.c > =================================================================== > --- gcc/gimple-match-head.c (revision 217035) > +++ gcc/gimple-match-head.c (working copy) > @@ -90,6 +90,13 @@ gimple_resimplify1 (gimple_seq *seq, > code_helper *res_code, tree type, tree *res_ops, > tree (*valueize)(tree)) > { > + /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. */ > + if (COMPARISON_CLASS_P (res_ops[0])) > + res_ops[0] = gimple_build (seq, > + TREE_CODE (res_ops[0]), TREE_TYPE (res_ops[0]), > + TREE_OPERAND (res_ops[0], 0), > + TREE_OPERAND (res_ops[0], 1)); > + > if (constant_for_folding (res_ops[0])) > { > tree tem = NULL_TREE; >