* [OpenACC] internal fn folding
@ 2015-10-28 18:41 Nathan Sidwell
2015-11-02 13:56 ` Nathan Sidwell
0 siblings, 1 reply; 6+ messages in thread
From: Nathan Sidwell @ 2015-10-28 18:41 UTC (permalink / raw)
To: GCC Patches, Richard Guenther
[-- Attachment #1: Type: text/plain, Size: 324 bytes --]
Richard,
this patch adds folding for the new GOACC_DIM_POS and GOACC_DIM_SIZE internal
functions. IIUC gimple_fold_call is the right place to add this.
The size of a compute dimension is very often a compile-time constant. On the
host, in particular it's 1, which means we can deduce the POS must be zero.
ok?
nathan
[-- Attachment #2: trunk-dim-fold.patch --]
[-- Type: text/x-patch, Size: 2040 bytes --]
2015-10-28 Nathan Sidwell <nathan@codesourcery.com>
* gimple-fold.c: Include omp-low.h.
(fold_internal_goacc_dim): New.
(gimple_fold_call): Call it.
Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c (revision 229488)
+++ gcc/gimple-fold.c (working copy)
@@ -64,6 +64,7 @@ along with GCC; see the file COPYING3.
#include "gimple-match.h"
#include "gomp-constants.h"
#include "optabs-query.h"
+#include "omp-low.h"
/* Return true when DECL can be referenced from current unit.
@@ -2925,6 +2926,40 @@ gimple_fold_builtin (gimple_stmt_iterato
return false;
}
+/* Transform IFN_GOACC_DIM_SIZE and IFN_GOACC_DIM_POS internal
+ function calls to constants, where possible. */
+
+static tree
+fold_internal_goacc_dim (gimple *call)
+{
+ tree size = integer_one_node;
+
+ if (tree attrs = get_oacc_fn_attrib (current_function_decl))
+ {
+ tree arg = gimple_call_arg (call, 0);
+ tree pos = TREE_VALUE (attrs);
+
+ for (unsigned axis = (unsigned) TREE_INT_CST_LOW (arg); axis--;)
+ pos = TREE_CHAIN (pos);
+ size = TREE_VALUE (pos);
+ }
+
+ tree result;
+ if (integer_zerop (size))
+ /* Dimension size is dynamic. */
+ result = NULL_TREE;
+ else if (gimple_call_internal_fn (call) == IFN_GOACC_DIM_SIZE)
+ result = size;
+ else if (integer_onep (size))
+ /* Size is one, so pos must be zero. */
+ result = integer_zero_node;
+ else
+ /* Size is more than 1, so POS might be non-zero. */
+ result = NULL_TREE;
+
+ return result;
+}
+
/* Return true if ARG0 CODE ARG1 in infinite signed precision operation
doesn't fit into TYPE. The test for overflow should be regardless of
-fwrapv, and even for unsigned types. */
@@ -3125,6 +3160,10 @@ gimple_fold_call (gimple_stmt_iterator *
return true;
}
break;
+ case IFN_GOACC_DIM_SIZE:
+ case IFN_GOACC_DIM_POS:
+ result = fold_internal_goacc_dim (stmt);
+ break;
case IFN_UBSAN_CHECK_ADD:
subcode = PLUS_EXPR;
break;
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [OpenACC] internal fn folding
2015-10-28 18:41 [OpenACC] internal fn folding Nathan Sidwell
@ 2015-11-02 13:56 ` Nathan Sidwell
2015-11-04 10:02 ` Bernd Schmidt
0 siblings, 1 reply; 6+ messages in thread
From: Nathan Sidwell @ 2015-11-02 13:56 UTC (permalink / raw)
To: GCC Patches, Richard Guenther
On 10/28/15 14:40, Nathan Sidwell wrote:
> Richard,
> this patch adds folding for the new GOACC_DIM_POS and GOACC_DIM_SIZE internal
> functions. IIUC gimple_fold_call is the right place to add this.
>
> The size of a compute dimension is very often a compile-time constant. On the
> host, in particular it's 1, which means we can deduce the POS must be zero.
>
> ok?
https://gcc.gnu.org/ml/gcc-patches/2015-10/threads.html#03095
Ping?
nathan
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [OpenACC] internal fn folding
2015-11-02 13:56 ` Nathan Sidwell
@ 2015-11-04 10:02 ` Bernd Schmidt
2015-11-05 15:48 ` Nathan Sidwell
0 siblings, 1 reply; 6+ messages in thread
From: Bernd Schmidt @ 2015-11-04 10:02 UTC (permalink / raw)
To: Nathan Sidwell, GCC Patches, Richard Guenther
On 11/02/2015 02:56 PM, Nathan Sidwell wrote:
> On 10/28/15 14:40, Nathan Sidwell wrote:
>> Richard,
>> this patch adds folding for the new GOACC_DIM_POS and GOACC_DIM_SIZE
>> internal
>> functions. IIUC gimple_fold_call is the right place to add this.
>>
>> The size of a compute dimension is very often a compile-time
>> constant. On the
>> host, in particular it's 1, which means we can deduce the POS must be
>> zero.
>>
>> ok?
>
> https://gcc.gnu.org/ml/gcc-patches/2015-10/threads.html#03095
>
> Ping?
Ok.
Bernd
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [OpenACC] internal fn folding
2015-11-04 10:02 ` Bernd Schmidt
@ 2015-11-05 15:48 ` Nathan Sidwell
2015-11-08 14:04 ` Thomas Schwinge
0 siblings, 1 reply; 6+ messages in thread
From: Nathan Sidwell @ 2015-11-05 15:48 UTC (permalink / raw)
To: Bernd Schmidt, GCC Patches, Richard Guenther
[-- Attachment #1: Type: text/plain, Size: 644 bytes --]
On 11/04/15 05:02, Bernd Schmidt wrote:
> On 11/02/2015 02:56 PM, Nathan Sidwell wrote:
>> On 10/28/15 14:40, Nathan Sidwell wrote:
>>> Richard,
>>> this patch adds folding for the new GOACC_DIM_POS and GOACC_DIM_SIZE
>>> internal
>>> functions. IIUC gimple_fold_call is the right place to add this.
>>>
>>> The size of a compute dimension is very often a compile-time
>>> constant. On the
>>> host, in particular it's 1, which means we can deduce the POS must be
>>> zero.
>>>
>>> ok?
This is what I committed, using the helpers I recently added. (I realized we can
only get here for functions with the oacc attribute already set)
nathan
[-- Attachment #2: trunk-dim-fold-1105.patch --]
[-- Type: text/x-patch, Size: 1777 bytes --]
2015-11-05 Nathan Sidwell <nathan@codesourcery.com>
* gimple-fold.c: Include omp-low.h.
(fold_internal_goacc_dim): New.
(gimple_fold_call): Call it.
Index: gimple-fold.c
===================================================================
--- gimple-fold.c (revision 229809)
+++ gimple-fold.c (working copy)
@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3.
#include "gimple-match.h"
#include "gomp-constants.h"
#include "optabs-query.h"
+#include "omp-low.h"
/* Return true when DECL can be referenced from current unit.
@@ -2906,6 +2907,28 @@ gimple_fold_builtin (gimple_stmt_iterato
return false;
}
+/* Transform IFN_GOACC_DIM_SIZE and IFN_GOACC_DIM_POS internal
+ function calls to constants, where possible. */
+
+static tree
+fold_internal_goacc_dim (const gimple *call)
+{
+ int axis = get_oacc_ifn_dim_arg (call);
+ int size = get_oacc_fn_dim_size (current_function_decl, axis);
+ bool is_pos = gimple_call_internal_fn (call) == IFN_GOACC_DIM_POS;
+ tree result = NULL_TREE;
+
+ /* If the size is 1, or we only want the size and it is not dynamic,
+ we know the answer. */
+ if (size == 1 || (!is_pos && size))
+ {
+ tree type = TREE_TYPE (gimple_call_lhs (call));
+ result = build_int_cst (type, size - is_pos);
+ }
+
+ return result;
+}
+
/* Return true if ARG0 CODE ARG1 in infinite signed precision operation
doesn't fit into TYPE. The test for overflow should be regardless of
-fwrapv, and even for unsigned types. */
@@ -3106,6 +3129,10 @@ gimple_fold_call (gimple_stmt_iterator *
return true;
}
break;
+ case IFN_GOACC_DIM_SIZE:
+ case IFN_GOACC_DIM_POS:
+ result = fold_internal_goacc_dim (stmt);
+ break;
case IFN_UBSAN_CHECK_ADD:
subcode = PLUS_EXPR;
break;
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [OpenACC] internal fn folding
2015-11-05 15:48 ` Nathan Sidwell
@ 2015-11-08 14:04 ` Thomas Schwinge
2015-11-08 15:44 ` Tom de Vries
0 siblings, 1 reply; 6+ messages in thread
From: Thomas Schwinge @ 2015-11-08 14:04 UTC (permalink / raw)
To: Nathan Sidwell, GCC Patches, Tom de Vries; +Cc: Bernd Schmidt, Richard Guenther
[-- Attachment #1: Type: text/plain, Size: 5328 bytes --]
Hi!
On Thu, 5 Nov 2015 10:48:02 -0500, Nathan Sidwell <nathan@acm.org> wrote:
> On 11/04/15 05:02, Bernd Schmidt wrote:
> > On 11/02/2015 02:56 PM, Nathan Sidwell wrote:
> >> On 10/28/15 14:40, Nathan Sidwell wrote:
> >>> Richard,
> >>> this patch adds folding for the new GOACC_DIM_POS and GOACC_DIM_SIZE
> >>> internal
> >>> functions. IIUC gimple_fold_call is the right place to add this.
> >>>
> >>> The size of a compute dimension is very often a compile-time
> >>> constant. On the
> >>> host, in particular it's 1, which means we can deduce the POS must be
> >>> zero.
> This is what I committed, using the helpers I recently added. (I realized we can
> only get here for functions with the oacc attribute already set)
> --- gimple-fold.c (revision 229809)
> +++ gimple-fold.c (working copy)
> +/* Transform IFN_GOACC_DIM_SIZE and IFN_GOACC_DIM_POS internal
> + function calls to constants, where possible. */
> +
> +static tree
> +fold_internal_goacc_dim (const gimple *call)
> +{
> + int axis = get_oacc_ifn_dim_arg (call);
> + int size = get_oacc_fn_dim_size (current_function_decl, axis);
> + bool is_pos = gimple_call_internal_fn (call) == IFN_GOACC_DIM_POS;
> + tree result = NULL_TREE;
> +
> + /* If the size is 1, or we only want the size and it is not dynamic,
> + we know the answer. */
> + if (size == 1 || (!is_pos && size))
> + {
> + tree type = TREE_TYPE (gimple_call_lhs (call));
> + result = build_int_cst (type, size - is_pos);
> + }
> +
> + return result;
> +}
> @@ -3106,6 +3129,10 @@ gimple_fold_call (gimple_stmt_iterator *
> return true;
> }
> break;
> + case IFN_GOACC_DIM_SIZE:
> + case IFN_GOACC_DIM_POS:
> + result = fold_internal_goacc_dim (stmt);
> + break;
Merging this into gomp-4_0-branch, we'd run into a lot of regressions
(for OpenACC kernels construct), for example:
[...]/source-gcc/gcc/testsuite/c-c++-common/goacc/kernels-loop-g.c: In function 'main._omp_fn.0':
[...]/source-gcc/gcc/testsuite/c-c++-common/goacc/kernels-loop-g.c:8:0: internal compiler error: Segmentation fault
0xac387f crash_signal
[...]/source-gcc/gcc/toplev.c:336
0x9b8399 tree_int_cst_elt_check
[...]/source-gcc/gcc/tree.h:3129
0x9b8399 get_oacc_fn_dim_size(tree_node*, int)
[...]/source-gcc/gcc/omp-low.c:12630
0x86c530 fold_internal_goacc_dim
[...]/source-gcc/gcc/gimple-fold.c:2917
0x86c530 gimple_fold_call
[...]/source-gcc/gcc/gimple-fold.c:3134
0x86dfe4 fold_stmt_1
[...]/source-gcc/gcc/gimple-fold.c:3702
0xbf9953 execute
[...]/source-gcc/gcc/tree-ssa-forwprop.c:2310
The dims in gcc/omp-low.c:get_oacc_fn_dim_size don't have values set, so
the "TREE_INT_CST_LOW (TREE_VALUE (dims))" fails. I have not analyzed
what exactly is going wrong; I just figured out that it's related to the
IFN_GOACC_DIM_POS without LHS usage that Tom introduced in
gomp-4_0-branch r228735 for OpenACC kernels to "neuter gang-single code
in gang-redundant mode",
<http://news.gmane.org/find-root.php?message_id=%3C561C1336.2050401%40mentor.com%3E>.
So, in r229948 I merged Nathan's trunk r229816 into gomp-4_0-branch with
an additional hack as indicated ("++" prefix) by the following three-way
diff:
commit b421a6415fc223866bc97f8248a1fbd0a524505e
Merge: 7a6eb6b b0ccb4e
Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Sun Nov 8 13:49:46 2015 +0000
svn merge -r 229814:229816 svn+ssh://gcc.gnu.org/svn/gcc/trunk
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@229948 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/ChangeLog | 6 ++++++
gcc/gimple-fold.c | 33 +++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+)
diff --cc gcc/gimple-fold.c
index c9b9593,45840af..869c6c2
--- gcc/gimple-fold.c
+++ gcc/gimple-fold.c
@@@ -2906,6 -2907,28 +2907,34 @@@ gimple_fold_builtin (gimple_stmt_iterat
return false;
}
+ /* Transform IFN_GOACC_DIM_SIZE and IFN_GOACC_DIM_POS internal
+ function calls to constants, where possible. */
+
+ static tree
+ fold_internal_goacc_dim (const gimple *call)
+ {
++ /* TODO. There is something going wrong here, for the gang_single
++ IFN_GOACC_DIM_POS without LHS, generated in gcc/omp-low.c:lower_omp_target
++ for is_oacc_kernels (see gomp-4_0-branch r228735). */
++ if (gimple_call_lhs (call) == NULL_TREE)
++ return NULL_TREE;
++
+ int axis = get_oacc_ifn_dim_arg (call);
+ int size = get_oacc_fn_dim_size (current_function_decl, axis);
+ bool is_pos = gimple_call_internal_fn (call) == IFN_GOACC_DIM_POS;
+ tree result = NULL_TREE;
+
+ /* If the size is 1, or we only want the size and it is not dynamic,
+ we know the answer. */
+ if (size == 1 || (!is_pos && size))
+ {
+ tree type = TREE_TYPE (gimple_call_lhs (call));
+ result = build_int_cst (type, size - is_pos);
+ }
+
+ return result;
+ }
+
/* Return true if ARG0 CODE ARG1 in infinite signed precision operation
doesn't fit into TYPE. The test for overflow should be regardless of
-fwrapv, and even for unsigned types. */
Grüße
Thomas
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 472 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [OpenACC] internal fn folding
2015-11-08 14:04 ` Thomas Schwinge
@ 2015-11-08 15:44 ` Tom de Vries
0 siblings, 0 replies; 6+ messages in thread
From: Tom de Vries @ 2015-11-08 15:44 UTC (permalink / raw)
To: Thomas Schwinge, Nathan Sidwell, GCC Patches, Tom de Vries
Cc: Bernd Schmidt, Richard Guenther
On 08/11/15 15:04, Thomas Schwinge wrote:
> Hi!
>
> On Thu, 5 Nov 2015 10:48:02 -0500, Nathan Sidwell<nathan@acm.org> wrote:
>> >On 11/04/15 05:02, Bernd Schmidt wrote:
>>> > >On 11/02/2015 02:56 PM, Nathan Sidwell wrote:
>>>> > >>On 10/28/15 14:40, Nathan Sidwell wrote:
>>>>> > >>>Richard,
>>>>> > >>>this patch adds folding for the new GOACC_DIM_POS and GOACC_DIM_SIZE
>>>>> > >>>internal
>>>>> > >>>functions. IIUC gimple_fold_call is the right place to add this.
>>>>> > >>>
>>>>> > >>>The size of a compute dimension is very often a compile-time
>>>>> > >>>constant. On the
>>>>> > >>>host, in particular it's 1, which means we can deduce the POS must be
>>>>> > >>>zero.
>> >This is what I committed, using the helpers I recently added. (I realized we can
>> >only get here for functions with the oacc attribute already set)
>> >--- gimple-fold.c (revision 229809)
>> >+++ gimple-fold.c (working copy)
>> >+/* Transform IFN_GOACC_DIM_SIZE and IFN_GOACC_DIM_POS internal
>> >+ function calls to constants, where possible. */
>> >+
>> >+static tree
>> >+fold_internal_goacc_dim (const gimple *call)
>> >+{
>> >+ int axis = get_oacc_ifn_dim_arg (call);
>> >+ int size = get_oacc_fn_dim_size (current_function_decl, axis);
>> >+ bool is_pos = gimple_call_internal_fn (call) == IFN_GOACC_DIM_POS;
>> >+ tree result = NULL_TREE;
>> >+
>> >+ /* If the size is 1, or we only want the size and it is not dynamic,
>> >+ we know the answer. */
>> >+ if (size == 1 || (!is_pos && size))
>> >+ {
>> >+ tree type = TREE_TYPE (gimple_call_lhs (call));
>> >+ result = build_int_cst (type, size - is_pos);
>> >+ }
>> >+
>> >+ return result;
>> >+}
>> >@@ -3106,6 +3129,10 @@ gimple_fold_call (gimple_stmt_iterator *
>> > return true;
>> > }
>> > break;
>> >+ case IFN_GOACC_DIM_SIZE:
>> >+ case IFN_GOACC_DIM_POS:
>> >+ result = fold_internal_goacc_dim (stmt);
>> >+ break;
> Merging this into gomp-4_0-branch, we'd run into a lot of regressions
> (for OpenACC kernels construct), for example:
>
> [...]/source-gcc/gcc/testsuite/c-c++-common/goacc/kernels-loop-g.c: In function 'main._omp_fn.0':
> [...]/source-gcc/gcc/testsuite/c-c++-common/goacc/kernels-loop-g.c:8:0: internal compiler error: Segmentation fault
> 0xac387f crash_signal
> [...]/source-gcc/gcc/toplev.c:336
> 0x9b8399 tree_int_cst_elt_check
> [...]/source-gcc/gcc/tree.h:3129
> 0x9b8399 get_oacc_fn_dim_size(tree_node*, int)
> [...]/source-gcc/gcc/omp-low.c:12630
> 0x86c530 fold_internal_goacc_dim
> [...]/source-gcc/gcc/gimple-fold.c:2917
> 0x86c530 gimple_fold_call
> [...]/source-gcc/gcc/gimple-fold.c:3134
> 0x86dfe4 fold_stmt_1
> [...]/source-gcc/gcc/gimple-fold.c:3702
> 0xbf9953 execute
> [...]/source-gcc/gcc/tree-ssa-forwprop.c:2310
>
> The dims in gcc/omp-low.c:get_oacc_fn_dim_size don't have values set, so
> the "TREE_INT_CST_LOW (TREE_VALUE (dims))" fails. I have not analyzed
> what exactly is going wrong; I just figured out that it's related to the
> IFN_GOACC_DIM_POS without LHS usage that Tom introduced in
> gomp-4_0-branch r228735 for OpenACC kernels to "neuter gang-single code
> in gang-redundant mode",
> <http://news.gmane.org/find-root.php?message_id=%3C561C1336.2050401%40mentor.com%3E>.
I've just removed that (
https://gcc.gnu.org/ml/gcc-patches/2015-11/msg00847.html ).
Thanks,
- Tom
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-11-08 15:44 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-28 18:41 [OpenACC] internal fn folding Nathan Sidwell
2015-11-02 13:56 ` Nathan Sidwell
2015-11-04 10:02 ` Bernd Schmidt
2015-11-05 15:48 ` Nathan Sidwell
2015-11-08 14:04 ` Thomas Schwinge
2015-11-08 15:44 ` Tom de Vries
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).