* [PATCH] Improve VRP for IMAGPART_EXPR of ATOMIC_COMPARE_EXCHANGE ifn (PR tree-optimization/79981)
@ 2017-03-10 17:56 Jakub Jelinek
2017-03-10 19:26 ` Richard Biener
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2017-03-10 17:56 UTC (permalink / raw)
To: Richard Biener; +Cc: gcc-patches
Hi!
The following patch teaches VRP that IMAGPART_EXPR of
ATOMIC_COMPARE_EXCHANGE ifn call is always 0 or 1. We cast it to bool
afterwards, but this hint allows VRP to:
--- pr79981.c.103t.vrp1_ 2017-03-10 15:39:29.000000000 +0100
+++ pr79981.c.103t.vrp1 2017-03-10 15:48:15.051608067 +0100
@@ -17,7 +17,7 @@ Value ranges after VRP:
_1: [0, +INF]
.MEM_2: VARYING
_8: VARYING
-_9: [0, +INF]
+_9: [0, 1]
csi (int * lock)
@@ -32,11 +32,11 @@ csi (int * lock)
# USE = nonlocal null
# CLB = nonlocal null
_8 = ATOMIC_COMPARE_EXCHANGE (lock_4(D), 0, 1, 260, 2, 0);
- # RANGE [0, 4294967295]
+ # RANGE [0, 1] NONZERO 1
_9 = IMAGPART_EXPR <_8>;
# RANGE [0, 1]
_1 = (_Bool) _9;
- if (_1 != 0)
+ if (_9 != 0)
goto <bb 3>; [99.96%]
else
goto <bb 4>; [0.04%]
which should be beneficial e.g. for s390x code generation.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
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.
--- gcc/tree-vrp.c.jj 2017-02-22 18:15:48.000000000 +0100
+++ gcc/tree-vrp.c 2017-03-10 15:45:30.574778201 +0100
@@ -4107,7 +4107,7 @@ extract_range_basic (value_range *vr, gi
}
/* 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, gi
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 *take
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. */
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Improve VRP for IMAGPART_EXPR of ATOMIC_COMPARE_EXCHANGE ifn (PR tree-optimization/79981)
2017-03-10 17:56 [PATCH] Improve VRP for IMAGPART_EXPR of ATOMIC_COMPARE_EXCHANGE ifn (PR tree-optimization/79981) Jakub Jelinek
@ 2017-03-10 19:26 ` Richard Biener
0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2017-03-10 19:26 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: gcc-patches
On March 10, 2017 6:56:40 PM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>The following patch teaches VRP that IMAGPART_EXPR of
>ATOMIC_COMPARE_EXCHANGE ifn call is always 0 or 1. We cast it to bool
>afterwards, but this hint allows VRP to:
>--- pr79981.c.103t.vrp1_ 2017-03-10 15:39:29.000000000 +0100
>+++ pr79981.c.103t.vrp1 2017-03-10 15:48:15.051608067 +0100
>@@ -17,7 +17,7 @@ Value ranges after VRP:
> _1: [0, +INF]
> .MEM_2: VARYING
> _8: VARYING
>-_9: [0, +INF]
>+_9: [0, 1]
>
>
> csi (int * lock)
>@@ -32,11 +32,11 @@ csi (int * lock)
> # USE = nonlocal null
> # CLB = nonlocal null
> _8 = ATOMIC_COMPARE_EXCHANGE (lock_4(D), 0, 1, 260, 2, 0);
>- # RANGE [0, 4294967295]
>+ # RANGE [0, 1] NONZERO 1
> _9 = IMAGPART_EXPR <_8>;
> # RANGE [0, 1]
> _1 = (_Bool) _9;
>- if (_1 != 0)
>+ if (_9 != 0)
> goto <bb 3>; [99.96%]
> else
> goto <bb 4>; [0.04%]
>which should be beneficial e.g. for s390x code generation.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
Richard.
>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.
>
>--- gcc/tree-vrp.c.jj 2017-02-22 18:15:48.000000000 +0100
>+++ gcc/tree-vrp.c 2017-03-10 15:45:30.574778201 +0100
>@@ -4107,7 +4107,7 @@ extract_range_basic (value_range *vr, gi
> }
> /* 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, gi
> 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 *take
> 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. */
>
> Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-03-10 19:26 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-10 17:56 [PATCH] Improve VRP for IMAGPART_EXPR of ATOMIC_COMPARE_EXCHANGE ifn (PR tree-optimization/79981) Jakub Jelinek
2017-03-10 19:26 ` Richard Biener
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).