Skip to content

Commit

Permalink
backport: re PR tree-optimization/81503 (Wrong code at -O2)
Browse files Browse the repository at this point in the history
[gcc]

2017-09-05  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	Backport from mainline
	2017-08-29  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
		    Jakub Jelinek  <jakub@redhat.com>
		    Richard Biener  <rguenther@suse.de>

	PR tree-optimization/81503
	* gimple-ssa-strength-reduction.c (replace_mult_candidate): Ensure
	folded constant fits in the target type; reorder tests for clarity.

[gcc/testsuite]

2017-09-05  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	Backport from mainline
	2017-08-29  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
		    Jakub Jelinek  <jakub@redhat.com>
		    Richard Biener  <rguenther@suse.de>

	PR tree-optimization/81503
	* gcc.c-torture/execute/pr81503.c: New file.

From-SVN: r251743
  • Loading branch information
wschmidt-ibm authored and William Schmidt committed Sep 5, 2017
1 parent db72abb commit 540b5cb
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 83 deletions.
11 changes: 11 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
2017-09-05 Bill Schmidt <wschmidt@linux.vnet.ibm.com>

Backport from mainline
2017-08-29 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
Jakub Jelinek <jakub@redhat.com>
Richard Biener <rguenther@suse.de>

PR tree-optimization/81503
* gimple-ssa-strength-reduction.c (replace_mult_candidate): Ensure
folded constant fits in the target type; reorder tests for clarity.

2017-09-05 Pierre-Marie de Rodat <derodat@adacore.com>

Backport from trunk
Expand Down
166 changes: 83 additions & 83 deletions gcc/gimple-ssa-strength-reduction.c
Original file line number Diff line number Diff line change
Expand Up @@ -2044,104 +2044,104 @@ replace_mult_candidate (slsr_cand_t c, tree basis_name, widest_int bump)
tree target_type = TREE_TYPE (gimple_assign_lhs (c->cand_stmt));
enum tree_code cand_code = gimple_assign_rhs_code (c->cand_stmt);

/* It is highly unlikely, but possible, that the resulting
bump doesn't fit in a HWI. Abandon the replacement
in this case. This does not affect siblings or dependents
of C. Restriction to signed HWI is conservative for unsigned
types but allows for safe negation without twisted logic. */
if (wi::fits_shwi_p (bump)
&& bump.to_shwi () != HOST_WIDE_INT_MIN
/* It is not useful to replace casts, copies, negates, or adds of
an SSA name and a constant. */
&& cand_code != SSA_NAME
&& !CONVERT_EXPR_CODE_P (cand_code)
&& cand_code != PLUS_EXPR
&& cand_code != POINTER_PLUS_EXPR
&& cand_code != MINUS_EXPR
&& cand_code != NEGATE_EXPR)
{
enum tree_code code = PLUS_EXPR;
tree bump_tree;
gimple *stmt_to_print = NULL;
/* It is not useful to replace casts, copies, negates, or adds of
an SSA name and a constant. */
if (cand_code == SSA_NAME
|| CONVERT_EXPR_CODE_P (cand_code)
|| cand_code == PLUS_EXPR
|| cand_code == POINTER_PLUS_EXPR
|| cand_code == MINUS_EXPR
|| cand_code == NEGATE_EXPR)
return;

enum tree_code code = PLUS_EXPR;
tree bump_tree;
gimple *stmt_to_print = NULL;

/* If the basis name and the candidate's LHS have incompatible
types, introduce a cast. */
if (!useless_type_conversion_p (target_type, TREE_TYPE (basis_name)))
basis_name = introduce_cast_before_cand (c, target_type, basis_name);
if (wi::neg_p (bump))
{
code = MINUS_EXPR;
bump = -bump;
}
/* If the basis name and the candidate's LHS have incompatible
types, introduce a cast. */
if (!useless_type_conversion_p (target_type, TREE_TYPE (basis_name)))
basis_name = introduce_cast_before_cand (c, target_type, basis_name);
if (wi::neg_p (bump))
{
code = MINUS_EXPR;
bump = -bump;
}

/* It is possible that the resulting bump doesn't fit in target_type.
Abandon the replacement in this case. This does not affect
siblings or dependents of C. */
if (bump != wi::ext (bump, TYPE_PRECISION (target_type),
TYPE_SIGN (target_type)))
return;

bump_tree = wide_int_to_tree (target_type, bump);
bump_tree = wide_int_to_tree (target_type, bump);

if (dump_file && (dump_flags & TDF_DETAILS))
{
fputs ("Replacing: ", dump_file);
print_gimple_stmt (dump_file, c->cand_stmt, 0, 0);
}

if (bump == 0)
{
tree lhs = gimple_assign_lhs (c->cand_stmt);
gassign *copy_stmt = gimple_build_assign (lhs, basis_name);
gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
slsr_cand_t cc = c;
gimple_set_location (copy_stmt, gimple_location (c->cand_stmt));
gsi_replace (&gsi, copy_stmt, false);
c->cand_stmt = copy_stmt;
while (cc->next_interp)
{
cc = lookup_cand (cc->next_interp);
cc->cand_stmt = copy_stmt;
}
if (dump_file && (dump_flags & TDF_DETAILS))
stmt_to_print = copy_stmt;
}
else
{
tree rhs1, rhs2;
if (cand_code != NEGATE_EXPR) {
rhs1 = gimple_assign_rhs1 (c->cand_stmt);
rhs2 = gimple_assign_rhs2 (c->cand_stmt);
}
if (cand_code != NEGATE_EXPR
&& ((operand_equal_p (rhs1, basis_name, 0)
&& operand_equal_p (rhs2, bump_tree, 0))
|| (operand_equal_p (rhs1, bump_tree, 0)
&& operand_equal_p (rhs2, basis_name, 0))))
{
fputs ("Replacing: ", dump_file);
print_gimple_stmt (dump_file, c->cand_stmt, 0, 0);
if (dump_file && (dump_flags & TDF_DETAILS))
{
fputs ("(duplicate, not actually replacing)", dump_file);
stmt_to_print = c->cand_stmt;
}
}

if (bump == 0)
else
{
tree lhs = gimple_assign_lhs (c->cand_stmt);
gassign *copy_stmt = gimple_build_assign (lhs, basis_name);
gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
slsr_cand_t cc = c;
gimple_set_location (copy_stmt, gimple_location (c->cand_stmt));
gsi_replace (&gsi, copy_stmt, false);
c->cand_stmt = copy_stmt;
gimple_assign_set_rhs_with_ops (&gsi, code,
basis_name, bump_tree);
update_stmt (gsi_stmt (gsi));
c->cand_stmt = gsi_stmt (gsi);
while (cc->next_interp)
{
cc = lookup_cand (cc->next_interp);
cc->cand_stmt = copy_stmt;
cc->cand_stmt = gsi_stmt (gsi);
}
if (dump_file && (dump_flags & TDF_DETAILS))
stmt_to_print = copy_stmt;
}
else
{
tree rhs1, rhs2;
if (cand_code != NEGATE_EXPR) {
rhs1 = gimple_assign_rhs1 (c->cand_stmt);
rhs2 = gimple_assign_rhs2 (c->cand_stmt);
}
if (cand_code != NEGATE_EXPR
&& ((operand_equal_p (rhs1, basis_name, 0)
&& operand_equal_p (rhs2, bump_tree, 0))
|| (operand_equal_p (rhs1, bump_tree, 0)
&& operand_equal_p (rhs2, basis_name, 0))))
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
fputs ("(duplicate, not actually replacing)", dump_file);
stmt_to_print = c->cand_stmt;
}
}
else
{
gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
slsr_cand_t cc = c;
gimple_assign_set_rhs_with_ops (&gsi, code,
basis_name, bump_tree);
update_stmt (gsi_stmt (gsi));
c->cand_stmt = gsi_stmt (gsi);
while (cc->next_interp)
{
cc = lookup_cand (cc->next_interp);
cc->cand_stmt = gsi_stmt (gsi);
}
if (dump_file && (dump_flags & TDF_DETAILS))
stmt_to_print = gsi_stmt (gsi);
}
stmt_to_print = gsi_stmt (gsi);
}

if (dump_file && (dump_flags & TDF_DETAILS))
{
fputs ("With: ", dump_file);
print_gimple_stmt (dump_file, stmt_to_print, 0, 0);
fputs ("\n", dump_file);
}
}

if (dump_file && (dump_flags & TDF_DETAILS))
{
fputs ("With: ", dump_file);
print_gimple_stmt (dump_file, stmt_to_print, 0, 0);
fputs ("\n", dump_file);
}
}

Expand Down
10 changes: 10 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
2017-09-05 Bill Schmidt <wschmidt@linux.vnet.ibm.com>

Backport from mainline
2017-08-29 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
Jakub Jelinek <jakub@redhat.com>
Richard Biener <rguenther@suse.de>

PR tree-optimization/81503
* gcc.c-torture/execute/pr81503.c: New file.

2017-09-05 Pierre-Marie de Rodat <derodat@adacore.com>

Backport from trunk
Expand Down
15 changes: 15 additions & 0 deletions gcc/testsuite/gcc.c-torture/execute/pr81503.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
unsigned short a = 41461;
unsigned short b = 3419;
int c = 0;

void foo() {
if (a + b * ~(0 != 5))
c = -~(b * ~(0 != 5)) + 2147483647;
}

int main() {
foo();
if (c != 2147476810)
return -1;
return 0;
}

0 comments on commit 540b5cb

Please sign in to comment.