mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-23 07:00:27 +08:00
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
This commit is contained in:
parent
80dd631fce
commit
c7aee4a15c
@ -1,3 +1,11 @@
|
||||
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>
|
||||
|
||||
PR driver/79875
|
||||
|
@ -4107,7 +4107,7 @@ extract_range_basic (value_range *vr, gimple *stmt)
|
||||
}
|
||||
/* Handle extraction of the two results (result of arithmetics and
|
||||
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)
|
||||
&& (gimple_assign_rhs_code (stmt) == REALPART_EXPR
|
||||
|| gimple_assign_rhs_code (stmt) == IMAGPART_EXPR)
|
||||
@ -4132,6 +4132,16 @@ extract_range_basic (value_range *vr, gimple *stmt)
|
||||
case IFN_MUL_OVERFLOW:
|
||||
subcode = MULT_EXPR;
|
||||
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:
|
||||
break;
|
||||
}
|
||||
@ -7283,6 +7293,7 @@ stmt_interesting_for_vrp (gimple *stmt)
|
||||
case IFN_ADD_OVERFLOW:
|
||||
case IFN_SUB_OVERFLOW:
|
||||
case IFN_MUL_OVERFLOW:
|
||||
case IFN_ATOMIC_COMPARE_EXCHANGE:
|
||||
/* These internal calls return _Complex integer type,
|
||||
but are interesting to VRP nevertheless. */
|
||||
if (lhs && TREE_CODE (lhs) == SSA_NAME)
|
||||
@ -8308,6 +8319,7 @@ vrp_visit_stmt (gimple *stmt, edge *taken_edge_p, tree *output_p)
|
||||
case IFN_ADD_OVERFLOW:
|
||||
case IFN_SUB_OVERFLOW:
|
||||
case IFN_MUL_OVERFLOW:
|
||||
case IFN_ATOMIC_COMPARE_EXCHANGE:
|
||||
/* These internal calls return _Complex integer type,
|
||||
which VRP does not track, but the immediate uses
|
||||
thereof might be interesting. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user