summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-20 19:37:14 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-20 19:37:14 +0000
commitb11dfe2acc865b70dbc2ef93a578f2f3d4b5a8d5 (patch)
tree057aeb78355b804a08856d95c04d124dee990c69
parentfb1f4ef4a3b6cfb5594b55a32000df32daf50c63 (diff)
downloadgcc-b11dfe2acc865b70dbc2ef93a578f2f3d4b5a8d5.tar.gz
* loop.c (strength_reduce): Show when new register made for
giv is known to be a pointer and its aligment if so and known. (loop_dump_aux): Show VERBOSE parameter unused. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36975 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/loop.c41
2 files changed, 44 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 21c3fd845a4..5cacc9ffaae 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
Fri Oct 20 13:33:16 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+ * loop.c (strength_reduce): Show when new register made for
+ giv is known to be a pointer and its aligment if so and known.
+ (loop_dump_aux): Show VERBOSE parameter unused.
+
* gcse.c (set_hash_table_size): Now unsigned.
* sdbout.c (template_name_p): Add "const" to avoid warnings.
(sdbout_record_type_name, plain_type_1, sdbout_symbol): Likewise.
diff --git a/gcc/loop.c b/gcc/loop.c
index 23ee292f091..604b791691b 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -4173,6 +4173,45 @@ strength_reduce (loop, insn_count, flags)
v->new_reg = replace_rtx (v->new_reg,
v->same->dest_reg, v->same->new_reg);
+ /* See if this register is known to be a pointer to something. If
+ so, see if we can find the alignment. First see if there is a
+ destination register that is a pointer. If so, this shares the
+ alignment too. Next see if we can deduce anything from the
+ computational information. If not, and this is a DEST_ADDR
+ giv, at least we know that it's a pointer, though we don't know
+ the alignment. */
+ if (GET_CODE (v->new_reg) == REG
+ && v->giv_type == DEST_REG
+ && REGNO_POINTER_FLAG (REGNO (v->dest_reg)))
+ mark_reg_pointer (v->new_reg,
+ REGNO_POINTER_ALIGN (REGNO (v->dest_reg)));
+ else if (GET_CODE (v->new_reg) == REG
+ && REGNO_POINTER_FLAG (REGNO (v->src_reg)))
+ {
+ unsigned int align = REGNO_POINTER_ALIGN (REGNO (v->src_reg));
+
+ if (align == 0
+ || GET_CODE (v->add_val) != CONST_INT
+ || INTVAL (v->add_val) % (align / BITS_PER_UNIT) != 0)
+ align = 0;
+
+ mark_reg_pointer (v->new_reg, align);
+ }
+ else if (GET_CODE (v->new_reg) == REG
+ && GET_CODE (v->add_val) == REG
+ && REGNO_POINTER_FLAG (REGNO (v->add_val)))
+ {
+ unsigned int align = REGNO_POINTER_ALIGN (REGNO (v->add_val));
+
+ if (align == 0
+ || INTVAL (v->mult_val) % (align / BITS_PER_UNIT) != 0)
+ align = 0;
+
+ mark_reg_pointer (v->new_reg, align);
+ }
+ else if (GET_CODE (v->new_reg) == REG && v->giv_type == DEST_ADDR)
+ mark_reg_pointer (v->new_reg, 0);
+
if (v->giv_type == DEST_ADDR)
/* Store reduced reg as the address in the memref where we found
this giv. */
@@ -9302,7 +9341,7 @@ static void
loop_dump_aux (loop, file, verbose)
const struct loop *loop;
FILE *file;
- int verbose;
+ int verbose ATTRIBUTE_UNUSED;
{
rtx label;