[PATCH 3/3][POPCOUNT] Remove unnecessary if condition in phiopt

Kugan Vivekanandarajah kugan.vivekanandarajah@linaro.org
Wed Jun 27 05:09:00 GMT 2018


Hi Richard,

Thanks for the review,

On 25 June 2018 at 20:20, Richard Biener <richard.guenther@gmail.com> wrote:
> On Fri, Jun 22, 2018 at 11:16 AM Kugan Vivekanandarajah
> <kugan.vivekanandarajah@linaro.org> wrote:
>>
>> gcc/ChangeLog:
>
> @@ -1516,6 +1521,114 @@ minmax_replacement (basic_block cond_bb,
> basic_block middle_bb,
>
>    return true;
>  }
> +/* Convert
> +
> +   <bb 2>
> +   if (b_4(D) != 0)
> +   goto <bb 3>
>
> vertical space before the comment.
Done.

>
> +                                 edge e0 ATTRIBUTE_UNUSED, edge e1
> ATTRIBUTE_UNUSED,
>
> why pass them if they are unused?
Removed.

>
> +  if (stmt_count != 2)
> +    return false;
>
> so what about the case when there is no conversion?
Done.

>
> +  /* Check that we have a popcount builtin.  */
> +  if (!is_gimple_call (popcount)
> +      || !gimple_call_builtin_p (popcount, BUILT_IN_NORMAL))
> +    return false;
> +  tree fndecl = gimple_call_fndecl (popcount);
> +  if ((DECL_FUNCTION_CODE (fndecl) != BUILT_IN_POPCOUNT)
> +      && (DECL_FUNCTION_CODE (fndecl) != BUILT_IN_POPCOUNTL)
> +      && (DECL_FUNCTION_CODE (fndecl) != BUILT_IN_POPCOUNTLL))
> +    return false;
>
> look at popcount handling in tree-vrp.c how to properly also handle
> IFN_POPCOUNT.
> (CASE_CFN_POPCOUNT)
Done.
>
> +  /* Cond_bb has a check for b_4 != 0 before calling the popcount
> +     builtin.  */
> +  if (gimple_code (cond) != GIMPLE_COND
> +      || gimple_cond_code (cond) != NE_EXPR
> +      || TREE_CODE (gimple_cond_lhs (cond)) != SSA_NAME
> +      || rhs != gimple_cond_lhs (cond))
> +    return false;
>
> The check for SSA_NAME is redundant.
> You fail to check that gimple_cond_rhs is zero.
Done.

>
> +  /* Remove the popcount builtin and cast stmt.  */
> +  gsi = gsi_for_stmt (popcount);
> +  gsi_remove (&gsi, true);
> +  gsi = gsi_for_stmt (cast);
> +  gsi_remove (&gsi, true);
> +
> +  /* And insert the popcount builtin and cast stmt before the cond_bb.  */
> +  gsi = gsi_last_bb (cond_bb);
> +  gsi_insert_before (&gsi, popcount, GSI_NEW_STMT);
> +  gsi_insert_before (&gsi, cast, GSI_NEW_STMT);
>
> use gsi_move_before ().  You need to reset flow sensitive info on the
> LHS of the popcount call as well as on the LHS of the cast.
Done.

>
> You fail to check the PHI operand on the false edge.  Consider
>
>  if (b != 0)
>    res = __builtin_popcount (b);
>  else
>    res = 1;
>
> You fail to check the PHI operand on the true edge.  Consider
>
>  res = 0;
>  if (b != 0)
>    {
>       __builtin_popcount (b);
>       res = 2;
>    }
>
> and using -fno-tree-dce and whatever you need to keep the
> popcount call in the IL.  A gimple testcase for phiopt will do.
>
> Your testcase relies on popcount detection.  Please write it
> using __builtin_popcount instead.  Write one with a cast and
> one without.
Added the testcases.

Is this OK now.

Thanks,
Kugan
>
> Thanks,
> Richard.
>
>
>> 2018-06-22  Kugan Vivekanandarajah  <kuganv@linaro.org>
>>
>>     * tree-ssa-phiopt.c (cond_removal_in_popcount_pattern): New.
>>     (tree_ssa_phiopt_worker): Call cond_removal_in_popcount_pattern.
>>
>> gcc/testsuite/ChangeLog:
>>
>> 2018-06-22  Kugan Vivekanandarajah  <kuganv@linaro.org>
>>
>>     * gcc.dg/tree-ssa/popcount3.c: New test.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0003-improve-phiopt-for-builtin-popcount.patch
Type: text/x-patch
Size: 8195 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20180627/ef0ae793/attachment.bin>


More information about the Gcc-patches mailing list