Commit 7f15cc4d by Kugan Vivekanandarajah Committed by Kugan Vivekanandarajah

re PR tree-optimization/86544 (Popcount detection generates different code on C and C++)

gcc/ChangeLog:

2018-07-18  Kugan Vivekanandarajah  <kuganv@linaro.org>

	PR middle-end/86544
	* tree-ssa-phiopt.c (cond_removal_in_popcount_pattern): Handle comparision with EQ_EXPR
	in last stmt.

gcc/testsuite/ChangeLog:

2018-07-18  Kugan Vivekanandarajah  <kuganv@linaro.org>

	PR middle-end/86544
	* g++.dg/tree-ssa/pr86544.C: New test.

From-SVN: r262864
parent d46d010b
2018-07-18 Kugan Vivekanandarajah <kuganv@linaro.org>
PR middle-end/86544
* tree-ssa-phiopt.c (cond_removal_in_popcount_pattern): Handle comparision with EQ_EXPR
in last stmt.
2018-07-18 Kelvin Nilsen <kelvin@gcc.gnu.org> 2018-07-18 Kelvin Nilsen <kelvin@gcc.gnu.org>
* doc/extend.texi (PowerPC AltiVec Built-in Functions): Rename * doc/extend.texi (PowerPC AltiVec Built-in Functions): Rename
......
2018-07-18 Kugan Vivekanandarajah <kuganv@linaro.org>
PR middle-end/86544
* g++.dg/tree-ssa/pr86544.C: New test.
2018-07-18 Jakub Jelinek <jakub@redhat.com> 2018-07-18 Jakub Jelinek <jakub@redhat.com>
PR c++/86550 PR c++/86550
......
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-phiopt3 -fdump-tree-optimized" } */
int PopCount (long b) {
int c = 0;
while (b) {
b &= b - 1;
c++;
}
return c;
}
/* { dg-final { scan-tree-dump-times "__builtin_popcount" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times "if" 0 "phiopt3" } } */
...@@ -1614,8 +1614,22 @@ cond_removal_in_popcount_pattern (basic_block cond_bb, basic_block middle_bb, ...@@ -1614,8 +1614,22 @@ cond_removal_in_popcount_pattern (basic_block cond_bb, basic_block middle_bb,
arg = gimple_assign_rhs1 (cast); arg = gimple_assign_rhs1 (cast);
} }
cond = last_stmt (cond_bb);
/* 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
&& gimple_cond_code (cond) != EQ_EXPR)
|| !integer_zerop (gimple_cond_rhs (cond))
|| arg != gimple_cond_lhs (cond))
return false;
/* Canonicalize. */ /* Canonicalize. */
if (e2->flags & EDGE_TRUE_VALUE) if ((e2->flags & EDGE_TRUE_VALUE
&& gimple_cond_code (cond) == NE_EXPR)
|| (e1->flags & EDGE_TRUE_VALUE
&& gimple_cond_code (cond) == EQ_EXPR))
{ {
std::swap (arg0, arg1); std::swap (arg0, arg1);
std::swap (e1, e2); std::swap (e1, e2);
...@@ -1625,16 +1639,6 @@ cond_removal_in_popcount_pattern (basic_block cond_bb, basic_block middle_bb, ...@@ -1625,16 +1639,6 @@ cond_removal_in_popcount_pattern (basic_block cond_bb, basic_block middle_bb,
if (lhs != arg0 || !integer_zerop (arg1)) if (lhs != arg0 || !integer_zerop (arg1))
return false; return false;
cond = last_stmt (cond_bb);
/* 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
|| !integer_zerop (gimple_cond_rhs (cond))
|| arg != gimple_cond_lhs (cond))
return false;
/* And insert the popcount builtin and cast stmt before the cond_bb. */ /* And insert the popcount builtin and cast stmt before the cond_bb. */
gsi = gsi_last_bb (cond_bb); gsi = gsi_last_bb (cond_bb);
if (cast) if (cast)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment