* [PATCH] Encode alignment info in MASK_{LOAD,STORE} ifns (PR tree-optimization/68786)
@ 2015-12-08 19:28 Jakub Jelinek
2015-12-09 10:26 ` Richard Biener
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2015-12-08 19:28 UTC (permalink / raw)
To: Richard Biener; +Cc: gcc-patches
Hi!
As written in the PR, with MASK_{LOAD,STORE} ifns we lose info on the
alignment of the point, unless the referenced SSA_NAME has pointer info
with alignment mask, but that is just an optimization issue rather than
requirement.
As the second argument to these builtins is always 0 (used just to hold
the pointer type for aliasing purposes), this patch uses the value of
the second arg to hold alignment info.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2015-12-08 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/68786
* tree-if-conv.c: Include builtins.h.
(predicate_mem_writes): Put result of get_object_alignment (ref)
into second argument's value.
* tree-vect-stmts.c (vectorizable_mask_load_store): Put minimum
pointer alignment into second argument's value.
* tree-data-ref.c (get_references_in_stmt): Use value of second
argument for build_aligned_type, and only the type to build
a zero second argument for MEM_REF.
* internal-fn.c (expand_mask_load_optab_fn,
expand_mask_store_optab_fn): Likewise.
--- gcc/tree-if-conv.c.jj 2015-11-30 13:40:38.000000000 +0100
+++ gcc/tree-if-conv.c 2015-12-08 17:29:18.139186787 +0100
@@ -111,6 +111,7 @@ along with GCC; see the file COPYING3.
#include "dbgcnt.h"
#include "tree-hash-traits.h"
#include "varasm.h"
+#include "builtins.h"
/* List of basic blocks in if-conversion-suitable order. */
static basic_block *ifc_bbs;
@@ -2093,7 +2094,8 @@ predicate_mem_writes (loop_p loop)
vect_sizes.safe_push (bitsize);
vect_masks.safe_push (mask);
}
- ptr = build_int_cst (reference_alias_ptr_type (ref), 0);
+ ptr = build_int_cst (reference_alias_ptr_type (ref),
+ get_object_alignment (ref));
/* Copy points-to info if possible. */
if (TREE_CODE (addr) == SSA_NAME && !SSA_NAME_PTR_INFO (addr))
copy_ref_info (build2 (MEM_REF, TREE_TYPE (ref), addr, ptr),
--- gcc/tree-vect-stmts.c.jj 2015-12-02 20:26:59.000000000 +0100
+++ gcc/tree-vect-stmts.c 2015-12-08 17:10:47.226768560 +0100
@@ -2058,10 +2058,11 @@ vectorizable_mask_load_store (gimple *st
misalign = DR_MISALIGNMENT (dr);
set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
misalign);
+ tree ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)),
+ misalign ? misalign & -misalign : align);
new_stmt
= gimple_build_call_internal (IFN_MASK_STORE, 4, dataref_ptr,
- gimple_call_arg (stmt, 1),
- vec_mask, vec_rhs);
+ ptr, vec_mask, vec_rhs);
vect_finish_stmt_generation (stmt, new_stmt, gsi);
if (i == 0)
STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_stmt;
@@ -2107,10 +2108,11 @@ vectorizable_mask_load_store (gimple *st
misalign = DR_MISALIGNMENT (dr);
set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
misalign);
+ tree ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)),
+ misalign ? misalign & -misalign : align);
new_stmt
= gimple_build_call_internal (IFN_MASK_LOAD, 3, dataref_ptr,
- gimple_call_arg (stmt, 1),
- vec_mask);
+ ptr, vec_mask);
gimple_call_set_lhs (new_stmt, make_ssa_name (vec_dest));
vect_finish_stmt_generation (stmt, new_stmt, gsi);
if (i == 0)
--- gcc/tree-data-ref.c.jj 2015-11-09 13:39:32.000000000 +0100
+++ gcc/tree-data-ref.c 2015-12-08 17:38:55.199094723 +0100
@@ -3872,6 +3872,8 @@ get_references_in_stmt (gimple *stmt, ve
else if (stmt_code == GIMPLE_CALL)
{
unsigned i, n;
+ tree ptr, type;
+ unsigned int align;
ref.is_read = false;
if (gimple_call_internal_p (stmt))
@@ -3882,12 +3884,16 @@ get_references_in_stmt (gimple *stmt, ve
break;
ref.is_read = true;
case IFN_MASK_STORE:
- ref.ref = fold_build2 (MEM_REF,
- ref.is_read
- ? TREE_TYPE (gimple_call_lhs (stmt))
- : TREE_TYPE (gimple_call_arg (stmt, 3)),
- gimple_call_arg (stmt, 0),
- gimple_call_arg (stmt, 1));
+ ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)), 0);
+ align = tree_to_shwi (gimple_call_arg (stmt, 1));
+ if (ref.is_read)
+ type = TREE_TYPE (gimple_call_lhs (stmt));
+ else
+ type = TREE_TYPE (gimple_call_arg (stmt, 3));
+ if (TYPE_ALIGN (type) != align)
+ type = build_aligned_type (type, align);
+ ref.ref = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0),
+ ptr);
references->safe_push (ref);
return false;
default:
--- gcc/internal-fn.c.jj 2015-12-02 20:26:56.000000000 +0100
+++ gcc/internal-fn.c 2015-12-08 17:21:40.602605916 +0100
@@ -1911,16 +1911,20 @@ static void
expand_mask_load_optab_fn (internal_fn, gcall *stmt, convert_optab optab)
{
struct expand_operand ops[3];
- tree type, lhs, rhs, maskt;
+ tree type, lhs, rhs, maskt, ptr;
rtx mem, target, mask;
+ unsigned align;
maskt = gimple_call_arg (stmt, 2);
lhs = gimple_call_lhs (stmt);
if (lhs == NULL_TREE)
return;
type = TREE_TYPE (lhs);
- rhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0),
- gimple_call_arg (stmt, 1));
+ ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)), 0);
+ align = tree_to_shwi (gimple_call_arg (stmt, 1));
+ if (TYPE_ALIGN (type) != align)
+ type = build_aligned_type (type, align);
+ rhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0), ptr);
mem = expand_expr (rhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
gcc_assert (MEM_P (mem));
@@ -1940,14 +1944,18 @@ static void
expand_mask_store_optab_fn (internal_fn, gcall *stmt, convert_optab optab)
{
struct expand_operand ops[3];
- tree type, lhs, rhs, maskt;
+ tree type, lhs, rhs, maskt, ptr;
rtx mem, reg, mask;
+ unsigned align;
maskt = gimple_call_arg (stmt, 2);
rhs = gimple_call_arg (stmt, 3);
type = TREE_TYPE (rhs);
- lhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0),
- gimple_call_arg (stmt, 1));
+ ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)), 0);
+ align = tree_to_shwi (gimple_call_arg (stmt, 1));
+ if (TYPE_ALIGN (type) != align)
+ type = build_aligned_type (type, align);
+ lhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0), ptr);
mem = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
gcc_assert (MEM_P (mem));
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Encode alignment info in MASK_{LOAD,STORE} ifns (PR tree-optimization/68786)
2015-12-08 19:28 [PATCH] Encode alignment info in MASK_{LOAD,STORE} ifns (PR tree-optimization/68786) Jakub Jelinek
@ 2015-12-09 10:26 ` Richard Biener
0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2015-12-09 10:26 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: gcc-patches
On Tue, 8 Dec 2015, Jakub Jelinek wrote:
> Hi!
>
> As written in the PR, with MASK_{LOAD,STORE} ifns we lose info on the
> alignment of the point, unless the referenced SSA_NAME has pointer info
> with alignment mask, but that is just an optimization issue rather than
> requirement.
>
> As the second argument to these builtins is always 0 (used just to hold
> the pointer type for aliasing purposes), this patch uses the value of
> the second arg to hold alignment info.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok.
Thanks,
Richard.
> 2015-12-08 Jakub Jelinek <jakub@redhat.com>
>
> PR tree-optimization/68786
> * tree-if-conv.c: Include builtins.h.
> (predicate_mem_writes): Put result of get_object_alignment (ref)
> into second argument's value.
> * tree-vect-stmts.c (vectorizable_mask_load_store): Put minimum
> pointer alignment into second argument's value.
> * tree-data-ref.c (get_references_in_stmt): Use value of second
> argument for build_aligned_type, and only the type to build
> a zero second argument for MEM_REF.
> * internal-fn.c (expand_mask_load_optab_fn,
> expand_mask_store_optab_fn): Likewise.
>
> --- gcc/tree-if-conv.c.jj 2015-11-30 13:40:38.000000000 +0100
> +++ gcc/tree-if-conv.c 2015-12-08 17:29:18.139186787 +0100
> @@ -111,6 +111,7 @@ along with GCC; see the file COPYING3.
> #include "dbgcnt.h"
> #include "tree-hash-traits.h"
> #include "varasm.h"
> +#include "builtins.h"
>
> /* List of basic blocks in if-conversion-suitable order. */
> static basic_block *ifc_bbs;
> @@ -2093,7 +2094,8 @@ predicate_mem_writes (loop_p loop)
> vect_sizes.safe_push (bitsize);
> vect_masks.safe_push (mask);
> }
> - ptr = build_int_cst (reference_alias_ptr_type (ref), 0);
> + ptr = build_int_cst (reference_alias_ptr_type (ref),
> + get_object_alignment (ref));
> /* Copy points-to info if possible. */
> if (TREE_CODE (addr) == SSA_NAME && !SSA_NAME_PTR_INFO (addr))
> copy_ref_info (build2 (MEM_REF, TREE_TYPE (ref), addr, ptr),
> --- gcc/tree-vect-stmts.c.jj 2015-12-02 20:26:59.000000000 +0100
> +++ gcc/tree-vect-stmts.c 2015-12-08 17:10:47.226768560 +0100
> @@ -2058,10 +2058,11 @@ vectorizable_mask_load_store (gimple *st
> misalign = DR_MISALIGNMENT (dr);
> set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
> misalign);
> + tree ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)),
> + misalign ? misalign & -misalign : align);
> new_stmt
> = gimple_build_call_internal (IFN_MASK_STORE, 4, dataref_ptr,
> - gimple_call_arg (stmt, 1),
> - vec_mask, vec_rhs);
> + ptr, vec_mask, vec_rhs);
> vect_finish_stmt_generation (stmt, new_stmt, gsi);
> if (i == 0)
> STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_stmt;
> @@ -2107,10 +2108,11 @@ vectorizable_mask_load_store (gimple *st
> misalign = DR_MISALIGNMENT (dr);
> set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
> misalign);
> + tree ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)),
> + misalign ? misalign & -misalign : align);
> new_stmt
> = gimple_build_call_internal (IFN_MASK_LOAD, 3, dataref_ptr,
> - gimple_call_arg (stmt, 1),
> - vec_mask);
> + ptr, vec_mask);
> gimple_call_set_lhs (new_stmt, make_ssa_name (vec_dest));
> vect_finish_stmt_generation (stmt, new_stmt, gsi);
> if (i == 0)
> --- gcc/tree-data-ref.c.jj 2015-11-09 13:39:32.000000000 +0100
> +++ gcc/tree-data-ref.c 2015-12-08 17:38:55.199094723 +0100
> @@ -3872,6 +3872,8 @@ get_references_in_stmt (gimple *stmt, ve
> else if (stmt_code == GIMPLE_CALL)
> {
> unsigned i, n;
> + tree ptr, type;
> + unsigned int align;
>
> ref.is_read = false;
> if (gimple_call_internal_p (stmt))
> @@ -3882,12 +3884,16 @@ get_references_in_stmt (gimple *stmt, ve
> break;
> ref.is_read = true;
> case IFN_MASK_STORE:
> - ref.ref = fold_build2 (MEM_REF,
> - ref.is_read
> - ? TREE_TYPE (gimple_call_lhs (stmt))
> - : TREE_TYPE (gimple_call_arg (stmt, 3)),
> - gimple_call_arg (stmt, 0),
> - gimple_call_arg (stmt, 1));
> + ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)), 0);
> + align = tree_to_shwi (gimple_call_arg (stmt, 1));
> + if (ref.is_read)
> + type = TREE_TYPE (gimple_call_lhs (stmt));
> + else
> + type = TREE_TYPE (gimple_call_arg (stmt, 3));
> + if (TYPE_ALIGN (type) != align)
> + type = build_aligned_type (type, align);
> + ref.ref = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0),
> + ptr);
> references->safe_push (ref);
> return false;
> default:
> --- gcc/internal-fn.c.jj 2015-12-02 20:26:56.000000000 +0100
> +++ gcc/internal-fn.c 2015-12-08 17:21:40.602605916 +0100
> @@ -1911,16 +1911,20 @@ static void
> expand_mask_load_optab_fn (internal_fn, gcall *stmt, convert_optab optab)
> {
> struct expand_operand ops[3];
> - tree type, lhs, rhs, maskt;
> + tree type, lhs, rhs, maskt, ptr;
> rtx mem, target, mask;
> + unsigned align;
>
> maskt = gimple_call_arg (stmt, 2);
> lhs = gimple_call_lhs (stmt);
> if (lhs == NULL_TREE)
> return;
> type = TREE_TYPE (lhs);
> - rhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0),
> - gimple_call_arg (stmt, 1));
> + ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)), 0);
> + align = tree_to_shwi (gimple_call_arg (stmt, 1));
> + if (TYPE_ALIGN (type) != align)
> + type = build_aligned_type (type, align);
> + rhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0), ptr);
>
> mem = expand_expr (rhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
> gcc_assert (MEM_P (mem));
> @@ -1940,14 +1944,18 @@ static void
> expand_mask_store_optab_fn (internal_fn, gcall *stmt, convert_optab optab)
> {
> struct expand_operand ops[3];
> - tree type, lhs, rhs, maskt;
> + tree type, lhs, rhs, maskt, ptr;
> rtx mem, reg, mask;
> + unsigned align;
>
> maskt = gimple_call_arg (stmt, 2);
> rhs = gimple_call_arg (stmt, 3);
> type = TREE_TYPE (rhs);
> - lhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0),
> - gimple_call_arg (stmt, 1));
> + ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)), 0);
> + align = tree_to_shwi (gimple_call_arg (stmt, 1));
> + if (TYPE_ALIGN (type) != align)
> + type = build_aligned_type (type, align);
> + lhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0), ptr);
>
> mem = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
> gcc_assert (MEM_P (mem));
>
> Jakub
>
>
--
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-12-09 10:26 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-08 19:28 [PATCH] Encode alignment info in MASK_{LOAD,STORE} ifns (PR tree-optimization/68786) Jakub Jelinek
2015-12-09 10: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).