]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/17949 (Tree loop optimization generates unaligned access...
authorZdenek Dvorak <dvorakz@suse.cz>
Wed, 12 Jan 2005 00:05:55 +0000 (01:05 +0100)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Wed, 12 Jan 2005 00:05:55 +0000 (00:05 +0000)
PR tree-optimization/17949
* tree-ssa-loop-ivopts.c (may_be_unaligned_p): New function.
(find_interesting_uses_address): Use it.

From-SVN: r93209

gcc/ChangeLog
gcc/tree-ssa-loop-ivopts.c

index 1ce03958e30c9ec9a61f0631a1f0057b1fad21d3..20f5d2f9aeece432c672e4826c69d8f4fc3a4053 100644 (file)
@@ -1,3 +1,9 @@
+2005-01-11  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       PR tree-optimization/17949
+       * tree-ssa-loop-ivopts.c (may_be_unaligned_p): New function.
+       (find_interesting_uses_address): Use it.
+
 2005-01-11  Aldy Hernandez  <aldyh@redhat.com>
 
        * regrename.c (kill_value): Handle subreg's that won't simplify.
index 73034127a7c9d60d86c54418f43c987ccbf0b3d7..475f45eb8f42441527f50d3fb40d90fe5a505bd2 100644 (file)
@@ -1400,6 +1400,37 @@ idx_record_use (tree base, tree *idx,
   return true;
 }
 
+/* Returns true if memory reference REF may be unaligned.  */
+
+static bool
+may_be_unaligned_p (tree ref)
+{
+  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;
+
+  /* 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 = TYPE_ALIGN (base_type);
+
+  if (mode != BLKmode
+      && (base_align < GET_MODE_ALIGNMENT (mode)
+         || bitpos % GET_MODE_ALIGNMENT (mode) != 0
+         || bitpos % BITS_PER_UNIT != 0))
+    return true;
+
+  return false;
+}
+
 /* Finds addresses in *OP_P inside STMT.  */
 
 static void
@@ -1415,6 +1446,10 @@ find_interesting_uses_address (struct ivopts_data *data, tree stmt, tree *op_p)
       && DECL_NONADDRESSABLE_P (TREE_OPERAND (base, 1)))
     goto fail;
 
+  if (STRICT_ALIGNMENT
+      && may_be_unaligned_p (base))
+    goto fail;
+
   ifs_ivopts_data.ivopts_data = data;
   ifs_ivopts_data.stmt = stmt;
   ifs_ivopts_data.step_p = &step;