diff options
author | Richard Kenner <kenner@vlsi1.ultra.nyu.edu> | 2000-10-20 19:37:14 +0000 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2000-10-20 15:37:14 -0400 |
commit | 1dcdb0df61a9811b076bb7d175666eaf0d421909 (patch) | |
tree | 057aeb78355b804a08856d95c04d124dee990c69 | |
parent | ebb13e7eb8636e9ac163e364d72015519ba931f6 (diff) | |
download | gcc-1dcdb0df61a9811b076bb7d175666eaf0d421909.zip gcc-1dcdb0df61a9811b076bb7d175666eaf0d421909.tar.gz gcc-1dcdb0df61a9811b076bb7d175666eaf0d421909.tar.bz2 |
loop.c (strength_reduce): Show when new register made for giv is known to be a pointer and its aligment if...
* 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.
From-SVN: r36975
-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 21c3fd8..5cacc9f 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. @@ -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; |