--- gcc-3.2/gcc/loop.c.fix-sixtrack 2002-09-20 14:56:57.000000000 +0200 +++ gcc-3.2/gcc/loop.c 2002-09-20 15:30:57.000000000 +0200 @@ -4661,7 +4661,7 @@ loop_givs_reduce (loop, bl) rtx insert_before; if (! auto_inc_opt) - insert_before = tv->insn; + insert_before = NEXT_INSN (tv->insn); else if (auto_inc_opt == 1) insert_before = NEXT_INSN (v->insn); else --- gcc-3.2/gcc/emit-rtl.c.fix-sixtrack 2002-09-20 14:56:56.000000000 +0200 +++ gcc-3.2/gcc/emit-rtl.c 2002-09-20 15:30:57.000000000 +0200 @@ -1829,11 +1829,36 @@ set_mem_attributes (ref, t, objectp) do { + tree index = TREE_OPERAND (t, 1); + tree array = TREE_OPERAND (t, 0); + tree domain = TYPE_DOMAIN (TREE_TYPE (array)); + tree low_bound = (domain ? TYPE_MIN_VALUE (domain) : 0); + tree unit_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (array))); + + /* We assume all arrays have sizes that are a multiple of a byte. + First subtract the lower bound, if any, in the type of the + index, then convert to sizetype and multiply by the size of the + array element. */ + if (low_bound != 0 && ! integer_zerop (low_bound)) + index = fold (build (MINUS_EXPR, TREE_TYPE (index), + index, low_bound)); + + /* If the index has a self-referential type, pass it to a + WITH_RECORD_EXPR; if the component size is, pass our + component to one. */ + if (! TREE_CONSTANT (index) + && contains_placeholder_p (index)) + index = build (WITH_RECORD_EXPR, TREE_TYPE (index), index, t); + if (! TREE_CONSTANT (unit_size) + && contains_placeholder_p (unit_size)) + unit_size = build (WITH_RECORD_EXPR, sizetype, + unit_size, array); + off_tree = fold (build (PLUS_EXPR, sizetype, fold (build (MULT_EXPR, sizetype, - TREE_OPERAND (t, 1), - TYPE_SIZE_UNIT (TREE_TYPE (t)))), + index, + unit_size)), off_tree)); t = TREE_OPERAND (t, 0); }