diff options
author | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2014-01-13 10:36:27 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2014-01-13 10:36:27 +0000 |
commit | e75fde1a84c8930f2908a53945306537385f3f3b (patch) | |
tree | a301a83873dcf8ecd2e5711b02a0c6b0e195c46e /gcc/tree-ssa-loop-ivopts.c | |
parent | eae298d69947eeb41770b908ab7511c1e51a9ae1 (diff) | |
download | gcc-e75fde1a84c8930f2908a53945306537385f3f3b.zip gcc-e75fde1a84c8930f2908a53945306537385f3f3b.tar.gz gcc-e75fde1a84c8930f2908a53945306537385f3f3b.tar.bz2 |
builtins.c (get_object_alignment_2): Minor tweak.
* builtins.c (get_object_alignment_2): Minor tweak.
* tree-ssa-loop-ivopts.c (may_be_unaligned_p): Rewrite.
From-SVN: r206576
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 46 |
1 files changed, 13 insertions, 33 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 2d96fce..14ba20f 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -1668,50 +1668,30 @@ constant_multiple_of (tree top, tree bot, double_int *mul) } } -/* Returns true if memory reference REF with step STEP may be unaligned. */ +/* Return true if memory reference REF with step STEP may be unaligned. */ static bool may_be_unaligned_p (tree ref, tree step) { - tree base; - tree base_type; - HOST_WIDE_INT bitsize; - HOST_WIDE_INT bitpos; - tree toffset; - enum machine_mode mode; - int unsignedp, volatilep; - unsigned base_align; - /* TARGET_MEM_REFs are translated directly to valid MEMs on the target, thus they are not misaligned. */ if (TREE_CODE (ref) == TARGET_MEM_REF) return false; - /* The test below is basically copy of what expr.c:normal_inner_ref - does to check whether the object must be loaded by parts when - STRICT_ALIGNMENT is true. */ - base = get_inner_reference (ref, &bitsize, &bitpos, &toffset, &mode, - &unsignedp, &volatilep, true); - base_type = TREE_TYPE (base); - base_align = get_object_alignment (base); - base_align = MAX (base_align, TYPE_ALIGN (base_type)); - - if (mode != BLKmode) - { - unsigned mode_align = GET_MODE_ALIGNMENT (mode); - - if (base_align < mode_align - || (bitpos % mode_align) != 0 - || (bitpos % BITS_PER_UNIT) != 0) - return true; + unsigned int align = TYPE_ALIGN (TREE_TYPE (ref)); - if (toffset - && (highest_pow2_factor (toffset) * BITS_PER_UNIT) < mode_align) - return true; + unsigned HOST_WIDE_INT bitpos; + unsigned int ref_align; + get_object_alignment_1 (ref, &ref_align, &bitpos); + if (ref_align < align + || (bitpos % align) != 0 + || (bitpos % BITS_PER_UNIT) != 0) + return true; - if ((highest_pow2_factor (step) * BITS_PER_UNIT) < mode_align) - return true; - } + unsigned int trailing_zeros = tree_ctz (step); + if (trailing_zeros < HOST_BITS_PER_INT + && (1U << trailing_zeros) * BITS_PER_UNIT < align) + return true; return false; } |