This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/51254] Missed Optimization: IVOPTS don't handle unaligned memory access.
- From: "rguenther at suse dot de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 13 Dec 2011 10:27:48 +0000
- Subject: [Bug tree-optimization/51254] Missed Optimization: IVOPTS don't handle unaligned memory access.
- Auto-submitted: auto-generated
- References: <bug-51254-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51254
--- Comment #4 from rguenther at suse dot de <rguenther at suse dot de> 2011-12-13 10:27:48 UTC ---
On Tue, 13 Dec 2011, duyuehai at gmail dot com wrote:
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51254
>
> Yuehai Du <duyuehai at gmail dot com> changed:
>
> What |Removed |Added
> ----------------------------------------------------------------------------
> CC| |duyuehai at gmail dot com,
> | |rguenth at gcc dot gnu.org
>
> --- Comment #2 from Yuehai Du <duyuehai at gmail dot com> 2011-12-13 04:15:12 UTC ---
> Hi Richard
> would it be ok if i submit a patch like this to fix this bug:
>
> Index: gcc/tree-ssa-loop-ivopts.c
> ===================================================================
> --- gcc/tree-ssa-loop-ivopts.c (çæ 182270)
> +++ gcc/tree-ssa-loop-ivopts.c (åäåæ)
> @@ -102,6 +102,7 @@ along with GCC; see the file COPYING3. If not see
> cost of different addressing modes. This should be moved to a TBD
> interface between the GIMPLE and RTL worlds. */
> #include "expr.h"
> +#include "optabs.h"
>
> /* The infinite cost. */
> #define INFTY 10000000
> @@ -1771,6 +1772,7 @@ find_interesting_uses_address (struct ivopts_data
> }
> else
> {
> + enum machine_mode mem_mode;
> ifs_ivopts_data.ivopts_data = data;
> ifs_ivopts_data.stmt = stmt;
> ifs_ivopts_data.step = size_zero_node;
> @@ -1786,7 +1788,9 @@ find_interesting_uses_address (struct ivopts_data
>
> /* Moreover, on strict alignment platforms, check that it is
> sufficiently aligned. */
> - if (STRICT_ALIGNMENT && may_be_unaligned_p (base, step))
> + mem_mode = TYPE_MODE (TREE_TYPE (*op_p));
> + if (STRICT_ALIGNMENT && may_be_unaligned_p (base, step)
> + && optab_handler (movmisalign_optab, mem_mode) == CODE_FOR_nothing)
> goto fail;
>
> base = build_fold_addr_expr (base);
This won't fix it - the movmisalign optab will not be used at expansion
time as IVOPTs does not properly transfer the misalignment to the
access type.
Richard.