From d482f417e4445f5fa158909e5c6e485dddab42a1 Mon Sep 17 00:00:00 2001
From: Zdenek Dvorak <dvorakz@suse.cz>
Date: Wed, 6 Apr 2005 01:57:01 +0200
Subject: [PATCH] re PR target/20625 (ivopts produces code that generates
 "unaligned access exception")

	PR target/20625
	* tree-ssa-loop-ivopts.c (generic_type_for): New function.
	(add_candidate_1): Use generic_type_for instead of unsigned_type_for.

From-SVN: r97674
---
 gcc/ChangeLog              |  6 ++++++
 gcc/tree-ssa-loop-ivopts.c | 24 ++++++++++++++++++++----
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4c7b2aee115b..afb35ce2c9ab 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-04-06  Zdenek Dvorak  <dvorakz@suse.cz>
+
+	PR target/20625
+	* tree-ssa-loop-ivopts.c (generic_type_for): New function.
+	(add_candidate_1): Use generic_type_for instead of unsigned_type_for.
+
 2005-04-06  Zdenek Dvorak  <dvorakz@suse.cz>
 
 	* tree-flow.h (number_of_iterations_cond): Declaration removed.
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index d1bdb7add8ed..508f7814f45e 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -1841,6 +1841,22 @@ strip_offset (tree expr, bool inside_addr, unsigned HOST_WIDE_INT *offset)
   return fold_convert (orig_type, expr);
 }
 
+/* Returns variant of TYPE that can be used as base for different uses.
+   For integer types, we return unsigned variant of the type, which
+   avoids problems with overflows.  For pointer types, we return void *.  */
+
+static tree
+generic_type_for (tree type)
+{
+  if (POINTER_TYPE_P (type))
+    return ptr_type_node;
+
+  if (TYPE_UNSIGNED (type))
+    return type;
+
+  return unsigned_type_for (type);
+}
+
 /* Adds a candidate BASE + STEP * i.  Important field is set to IMPORTANT and
    position to POS.  If USE is not NULL, the candidate is set as related to
    it.  If both BASE and STEP are NULL, we add a pseudocandidate for the
@@ -1853,14 +1869,14 @@ add_candidate_1 (struct ivopts_data *data,
 {
   unsigned i;
   struct iv_cand *cand = NULL;
-  tree type;
+  tree type, orig_type;
   
   if (base)
     {
-      type = TREE_TYPE (base);
-      if (!TYPE_UNSIGNED (type))
+      orig_type = TREE_TYPE (base);
+      type = generic_type_for (orig_type);
+      if (type != orig_type)
 	{
-	  type = unsigned_type_for (type);
 	  base = fold_convert (type, base);
 	  if (step)
 	    step = fold_convert (type, step);
-- 
GitLab