Message ID | 87wp7qx9eu.fsf@linaro.org |
---|---|
State | New |
Headers | show |
Series | None | expand |
On Mon, Jul 3, 2017 at 9:32 AM, Richard Sandiford <richard.sandiford@linaro.org> wrote: > This patch renames DR_ALIGNED_TO to DR_OFFSET_ALIGNMENT, to avoid > confusion with the upcoming DR_BASE_ALIGNMENT. Nothing needed the > value as a tree, and the value is clipped to BIGGEST_ALIGNMENT > (maybe it should be MAX_OFILE_ALIGNMENT?) so we might as well use > an unsigned int instead. > > Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install? Ok. Richard. > Richard > > > 2017-07-03 Richard Sandiford <richard.sandiford@linaro.org> > > gcc/ > * tree-data-ref.h (innermost_loop_behavior): Replace aligned_to > with offset_alignment. > (DR_ALIGNED_TO): Delete. > (DR_OFFSET_ALIGNMENT): New macro. > * tree-vectorizer.h (STMT_VINFO_DR_ALIGNED_TO): Delete. > (STMT_VINFO_DR_OFFSET_ALIGNMENT): New macro. > * tree-data-ref.c (dr_analyze_innermost): Update after above changes. > (create_data_ref): Likewise. > * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Likewise. > (vect_analyze_data_refs): Likewise. > * tree-if-conv.c (if_convertible_loop_p_1): Use memset before > creating dummy innermost behavior. > > Index: gcc/tree-data-ref.h > =================================================================== > --- gcc/tree-data-ref.h 2017-07-03 08:03:19.181500132 +0100 > +++ gcc/tree-data-ref.h 2017-07-03 08:06:19.720107957 +0100 > @@ -52,9 +52,10 @@ struct innermost_loop_behavior > tree init; > tree step; > > - /* Alignment information. ALIGNED_TO is set to the largest power of two > - that divides OFFSET. */ > - tree aligned_to; > + /* The largest power of two that divides OFFSET, capped to a suitably > + high value if the offset is zero. This is a byte rather than a bit > + quantity. */ > + unsigned int offset_alignment; > }; > > /* Describes the evolutions of indices of the memory reference. The indices > @@ -143,7 +144,7 @@ #define DR_OFFSET(DR) (DR)- > #define DR_INIT(DR) (DR)->innermost.init > #define DR_STEP(DR) (DR)->innermost.step > #define DR_PTR_INFO(DR) (DR)->alias.ptr_info > -#define DR_ALIGNED_TO(DR) (DR)->innermost.aligned_to > +#define DR_OFFSET_ALIGNMENT(DR) (DR)->innermost.offset_alignment > #define DR_INNERMOST(DR) (DR)->innermost > > typedef struct data_reference *data_reference_p; > Index: gcc/tree-vectorizer.h > =================================================================== > --- gcc/tree-vectorizer.h 2017-07-03 07:57:56.883079731 +0100 > +++ gcc/tree-vectorizer.h 2017-07-03 08:06:19.721107925 +0100 > @@ -707,7 +707,8 @@ #define STMT_VINFO_DR_BASE_ADDRESS(S) > #define STMT_VINFO_DR_INIT(S) (S)->dr_wrt_vec_loop.init > #define STMT_VINFO_DR_OFFSET(S) (S)->dr_wrt_vec_loop.offset > #define STMT_VINFO_DR_STEP(S) (S)->dr_wrt_vec_loop.step > -#define STMT_VINFO_DR_ALIGNED_TO(S) (S)->dr_wrt_vec_loop.aligned_to > +#define STMT_VINFO_DR_OFFSET_ALIGNMENT(S) \ > + (S)->dr_wrt_vec_loop.offset_alignment > > #define STMT_VINFO_IN_PATTERN_P(S) (S)->in_pattern_p > #define STMT_VINFO_RELATED_STMT(S) (S)->related_stmt > Index: gcc/tree-data-ref.c > =================================================================== > --- gcc/tree-data-ref.c 2017-07-03 08:03:19.181500132 +0100 > +++ gcc/tree-data-ref.c 2017-07-03 08:06:19.720107957 +0100 > @@ -869,7 +869,7 @@ dr_analyze_innermost (struct data_refere > drb->offset = fold_convert (ssizetype, offset_iv.base); > drb->init = init; > drb->step = step; > - drb->aligned_to = size_int (highest_pow2_factor (offset_iv.base)); > + drb->offset_alignment = highest_pow2_factor (offset_iv.base); > > if (dump_file && (dump_flags & TDF_DETAILS)) > fprintf (dump_file, "success.\n"); > @@ -1083,8 +1083,8 @@ create_data_ref (loop_p nest, loop_p loo > print_generic_expr (dump_file, DR_INIT (dr), TDF_SLIM); > fprintf (dump_file, "\n\tstep: "); > print_generic_expr (dump_file, DR_STEP (dr), TDF_SLIM); > - fprintf (dump_file, "\n\taligned to: "); > - print_generic_expr (dump_file, DR_ALIGNED_TO (dr), TDF_SLIM); > + fprintf (dump_file, "\n\toffset alignment: %d", > + DR_OFFSET_ALIGNMENT (dr)); > fprintf (dump_file, "\n\tbase_object: "); > print_generic_expr (dump_file, DR_BASE_OBJECT (dr), TDF_SLIM); > fprintf (dump_file, "\n"); > Index: gcc/tree-vect-data-refs.c > =================================================================== > --- gcc/tree-vect-data-refs.c 2017-07-03 07:57:47.758408141 +0100 > +++ gcc/tree-vect-data-refs.c 2017-07-03 08:06:19.721107925 +0100 > @@ -772,7 +772,7 @@ vect_compute_data_ref_alignment (struct > > alignment = TYPE_ALIGN_UNIT (vectype); > > - if ((compare_tree_int (drb->aligned_to, alignment) < 0) > + if (drb->offset_alignment < alignment > || !step_preserves_misalignment_p) > { > if (dump_enabled_p ()) > @@ -3412,8 +3412,8 @@ vect_analyze_data_refs (vec_info *vinfo, > { > DR_OFFSET (newdr) = ssize_int (0); > DR_STEP (newdr) = step; > - DR_ALIGNED_TO (newdr) > - = size_int (BIGGEST_ALIGNMENT); > + DR_OFFSET_ALIGNMENT (newdr) > + = BIGGEST_ALIGNMENT; > dr = newdr; > simd_lane_access = true; > } > @@ -3644,8 +3644,8 @@ vect_analyze_data_refs (vec_info *vinfo, > STMT_VINFO_DR_INIT (stmt_info) = outer_init; > STMT_VINFO_DR_OFFSET (stmt_info) = > fold_convert (ssizetype, offset_iv.base); > - STMT_VINFO_DR_ALIGNED_TO (stmt_info) = > - size_int (highest_pow2_factor (offset_iv.base)); > + STMT_VINFO_DR_OFFSET_ALIGNMENT (stmt_info) > + = highest_pow2_factor (offset_iv.base); > > if (dump_enabled_p ()) > { > @@ -3663,10 +3663,8 @@ vect_analyze_data_refs (vec_info *vinfo, > dump_printf (MSG_NOTE, "\n\touter step: "); > dump_generic_expr (MSG_NOTE, TDF_SLIM, > STMT_VINFO_DR_STEP (stmt_info)); > - dump_printf (MSG_NOTE, "\n\touter aligned to: "); > - dump_generic_expr (MSG_NOTE, TDF_SLIM, > - STMT_VINFO_DR_ALIGNED_TO (stmt_info)); > - dump_printf (MSG_NOTE, "\n"); > + dump_printf (MSG_NOTE, "\n\touter offset alignment: %d\n", > + STMT_VINFO_DR_OFFSET_ALIGNMENT (stmt_info)); > } > } > > Index: gcc/tree-if-conv.c > =================================================================== > --- gcc/tree-if-conv.c 2017-07-03 07:53:58.064561604 +0100 > +++ gcc/tree-if-conv.c 2017-07-03 08:07:23.239704138 +0100 > @@ -1441,11 +1441,8 @@ if_convertible_loop_p_1 (struct loop *lo > || TREE_CODE (ref) == REALPART_EXPR) > ref = TREE_OPERAND (ref, 0); > > - DR_BASE_ADDRESS (dr) = ref; > - DR_OFFSET (dr) = NULL; > - DR_INIT (dr) = NULL; > - DR_STEP (dr) = NULL; > - DR_ALIGNED_TO (dr) = NULL; > + memset (&DR_INNERMOST (dr), 0, sizeof (DR_INNERMOST (dr))); > + DR_BASE_ADDRESS (dr) = ref; > } > hash_memrefs_baserefs_and_store_DRs_read_written_info (dr); > }
Index: gcc/tree-data-ref.h =================================================================== --- gcc/tree-data-ref.h 2017-07-03 08:03:19.181500132 +0100 +++ gcc/tree-data-ref.h 2017-07-03 08:06:19.720107957 +0100 @@ -52,9 +52,10 @@ struct innermost_loop_behavior tree init; tree step; - /* Alignment information. ALIGNED_TO is set to the largest power of two - that divides OFFSET. */ - tree aligned_to; + /* The largest power of two that divides OFFSET, capped to a suitably + high value if the offset is zero. This is a byte rather than a bit + quantity. */ + unsigned int offset_alignment; }; /* Describes the evolutions of indices of the memory reference. The indices @@ -143,7 +144,7 @@ #define DR_OFFSET(DR) (DR)- #define DR_INIT(DR) (DR)->innermost.init #define DR_STEP(DR) (DR)->innermost.step #define DR_PTR_INFO(DR) (DR)->alias.ptr_info -#define DR_ALIGNED_TO(DR) (DR)->innermost.aligned_to +#define DR_OFFSET_ALIGNMENT(DR) (DR)->innermost.offset_alignment #define DR_INNERMOST(DR) (DR)->innermost typedef struct data_reference *data_reference_p; Index: gcc/tree-vectorizer.h =================================================================== --- gcc/tree-vectorizer.h 2017-07-03 07:57:56.883079731 +0100 +++ gcc/tree-vectorizer.h 2017-07-03 08:06:19.721107925 +0100 @@ -707,7 +707,8 @@ #define STMT_VINFO_DR_BASE_ADDRESS(S) #define STMT_VINFO_DR_INIT(S) (S)->dr_wrt_vec_loop.init #define STMT_VINFO_DR_OFFSET(S) (S)->dr_wrt_vec_loop.offset #define STMT_VINFO_DR_STEP(S) (S)->dr_wrt_vec_loop.step -#define STMT_VINFO_DR_ALIGNED_TO(S) (S)->dr_wrt_vec_loop.aligned_to +#define STMT_VINFO_DR_OFFSET_ALIGNMENT(S) \ + (S)->dr_wrt_vec_loop.offset_alignment #define STMT_VINFO_IN_PATTERN_P(S) (S)->in_pattern_p #define STMT_VINFO_RELATED_STMT(S) (S)->related_stmt Index: gcc/tree-data-ref.c =================================================================== --- gcc/tree-data-ref.c 2017-07-03 08:03:19.181500132 +0100 +++ gcc/tree-data-ref.c 2017-07-03 08:06:19.720107957 +0100 @@ -869,7 +869,7 @@ dr_analyze_innermost (struct data_refere drb->offset = fold_convert (ssizetype, offset_iv.base); drb->init = init; drb->step = step; - drb->aligned_to = size_int (highest_pow2_factor (offset_iv.base)); + drb->offset_alignment = highest_pow2_factor (offset_iv.base); if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "success.\n"); @@ -1083,8 +1083,8 @@ create_data_ref (loop_p nest, loop_p loo print_generic_expr (dump_file, DR_INIT (dr), TDF_SLIM); fprintf (dump_file, "\n\tstep: "); print_generic_expr (dump_file, DR_STEP (dr), TDF_SLIM); - fprintf (dump_file, "\n\taligned to: "); - print_generic_expr (dump_file, DR_ALIGNED_TO (dr), TDF_SLIM); + fprintf (dump_file, "\n\toffset alignment: %d", + DR_OFFSET_ALIGNMENT (dr)); fprintf (dump_file, "\n\tbase_object: "); print_generic_expr (dump_file, DR_BASE_OBJECT (dr), TDF_SLIM); fprintf (dump_file, "\n"); Index: gcc/tree-vect-data-refs.c =================================================================== --- gcc/tree-vect-data-refs.c 2017-07-03 07:57:47.758408141 +0100 +++ gcc/tree-vect-data-refs.c 2017-07-03 08:06:19.721107925 +0100 @@ -772,7 +772,7 @@ vect_compute_data_ref_alignment (struct alignment = TYPE_ALIGN_UNIT (vectype); - if ((compare_tree_int (drb->aligned_to, alignment) < 0) + if (drb->offset_alignment < alignment || !step_preserves_misalignment_p) { if (dump_enabled_p ()) @@ -3412,8 +3412,8 @@ vect_analyze_data_refs (vec_info *vinfo, { DR_OFFSET (newdr) = ssize_int (0); DR_STEP (newdr) = step; - DR_ALIGNED_TO (newdr) - = size_int (BIGGEST_ALIGNMENT); + DR_OFFSET_ALIGNMENT (newdr) + = BIGGEST_ALIGNMENT; dr = newdr; simd_lane_access = true; } @@ -3644,8 +3644,8 @@ vect_analyze_data_refs (vec_info *vinfo, STMT_VINFO_DR_INIT (stmt_info) = outer_init; STMT_VINFO_DR_OFFSET (stmt_info) = fold_convert (ssizetype, offset_iv.base); - STMT_VINFO_DR_ALIGNED_TO (stmt_info) = - size_int (highest_pow2_factor (offset_iv.base)); + STMT_VINFO_DR_OFFSET_ALIGNMENT (stmt_info) + = highest_pow2_factor (offset_iv.base); if (dump_enabled_p ()) { @@ -3663,10 +3663,8 @@ vect_analyze_data_refs (vec_info *vinfo, dump_printf (MSG_NOTE, "\n\touter step: "); dump_generic_expr (MSG_NOTE, TDF_SLIM, STMT_VINFO_DR_STEP (stmt_info)); - dump_printf (MSG_NOTE, "\n\touter aligned to: "); - dump_generic_expr (MSG_NOTE, TDF_SLIM, - STMT_VINFO_DR_ALIGNED_TO (stmt_info)); - dump_printf (MSG_NOTE, "\n"); + dump_printf (MSG_NOTE, "\n\touter offset alignment: %d\n", + STMT_VINFO_DR_OFFSET_ALIGNMENT (stmt_info)); } } Index: gcc/tree-if-conv.c =================================================================== --- gcc/tree-if-conv.c 2017-07-03 07:53:58.064561604 +0100 +++ gcc/tree-if-conv.c 2017-07-03 08:07:23.239704138 +0100 @@ -1441,11 +1441,8 @@ if_convertible_loop_p_1 (struct loop *lo || TREE_CODE (ref) == REALPART_EXPR) ref = TREE_OPERAND (ref, 0); - DR_BASE_ADDRESS (dr) = ref; - DR_OFFSET (dr) = NULL; - DR_INIT (dr) = NULL; - DR_STEP (dr) = NULL; - DR_ALIGNED_TO (dr) = NULL; + memset (&DR_INNERMOST (dr), 0, sizeof (DR_INNERMOST (dr))); + DR_BASE_ADDRESS (dr) = ref; } hash_memrefs_baserefs_and_store_DRs_read_written_info (dr); }