diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-10-20 19:37:14 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-10-20 19:37:14 +0000 |
commit | b11dfe2acc865b70dbc2ef93a578f2f3d4b5a8d5 (patch) | |
tree | 057aeb78355b804a08856d95c04d124dee990c69 | |
parent | fb1f4ef4a3b6cfb5594b55a32000df32daf50c63 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/loop.c | 41 |
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; |