Commit c7aee4a1 by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/79981 (Forwprop not working for __atomic_compare_exchange_n)

	PR tree-optimization/79981
	* tree-vrp.c (extract_range_basic): Handle IMAGPART_EXPR of
	ATOMIC_COMPARE_EXCHANGE ifn result.
	(stmt_interesting_for_vrp, vrp_visit_stmt): Handle
	IFN_ATOMIC_COMPARE_EXCHANGE.

From-SVN: r246054
parent 80dd631f
2017-03-10 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/79981
* tree-vrp.c (extract_range_basic): Handle IMAGPART_EXPR of
ATOMIC_COMPARE_EXCHANGE ifn result.
(stmt_interesting_for_vrp, vrp_visit_stmt): Handle
IFN_ATOMIC_COMPARE_EXCHANGE.
2017-03-10 David Malcolm <dmalcolm@redhat.com> 2017-03-10 David Malcolm <dmalcolm@redhat.com>
PR driver/79875 PR driver/79875
......
...@@ -4107,7 +4107,7 @@ extract_range_basic (value_range *vr, gimple *stmt) ...@@ -4107,7 +4107,7 @@ extract_range_basic (value_range *vr, gimple *stmt)
} }
/* Handle extraction of the two results (result of arithmetics and /* Handle extraction of the two results (result of arithmetics and
a flag whether arithmetics overflowed) from {ADD,SUB,MUL}_OVERFLOW a flag whether arithmetics overflowed) from {ADD,SUB,MUL}_OVERFLOW
internal function. */ internal function. Similarly from ATOMIC_COMPARE_EXCHANGE. */
else if (is_gimple_assign (stmt) else if (is_gimple_assign (stmt)
&& (gimple_assign_rhs_code (stmt) == REALPART_EXPR && (gimple_assign_rhs_code (stmt) == REALPART_EXPR
|| gimple_assign_rhs_code (stmt) == IMAGPART_EXPR) || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR)
...@@ -4132,6 +4132,16 @@ extract_range_basic (value_range *vr, gimple *stmt) ...@@ -4132,6 +4132,16 @@ extract_range_basic (value_range *vr, gimple *stmt)
case IFN_MUL_OVERFLOW: case IFN_MUL_OVERFLOW:
subcode = MULT_EXPR; subcode = MULT_EXPR;
break; break;
case IFN_ATOMIC_COMPARE_EXCHANGE:
if (code == IMAGPART_EXPR)
{
/* This is the boolean return value whether compare and
exchange changed anything or not. */
set_value_range (vr, VR_RANGE, build_int_cst (type, 0),
build_int_cst (type, 1), NULL);
return;
}
break;
default: default:
break; break;
} }
...@@ -7283,6 +7293,7 @@ stmt_interesting_for_vrp (gimple *stmt) ...@@ -7283,6 +7293,7 @@ stmt_interesting_for_vrp (gimple *stmt)
case IFN_ADD_OVERFLOW: case IFN_ADD_OVERFLOW:
case IFN_SUB_OVERFLOW: case IFN_SUB_OVERFLOW:
case IFN_MUL_OVERFLOW: case IFN_MUL_OVERFLOW:
case IFN_ATOMIC_COMPARE_EXCHANGE:
/* These internal calls return _Complex integer type, /* These internal calls return _Complex integer type,
but are interesting to VRP nevertheless. */ but are interesting to VRP nevertheless. */
if (lhs && TREE_CODE (lhs) == SSA_NAME) if (lhs && TREE_CODE (lhs) == SSA_NAME)
...@@ -8308,6 +8319,7 @@ vrp_visit_stmt (gimple *stmt, edge *taken_edge_p, tree *output_p) ...@@ -8308,6 +8319,7 @@ vrp_visit_stmt (gimple *stmt, edge *taken_edge_p, tree *output_p)
case IFN_ADD_OVERFLOW: case IFN_ADD_OVERFLOW:
case IFN_SUB_OVERFLOW: case IFN_SUB_OVERFLOW:
case IFN_MUL_OVERFLOW: case IFN_MUL_OVERFLOW:
case IFN_ATOMIC_COMPARE_EXCHANGE:
/* These internal calls return _Complex integer type, /* These internal calls return _Complex integer type,
which VRP does not track, but the immediate uses which VRP does not track, but the immediate uses
thereof might be interesting. */ thereof might be interesting. */
......
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