We noticed that the simple loop here
extern int a[]; int foo(int w) { int n = w; while (n >= 512) { a[n] = 42; n -= 256; } }
was being treated as ineligible for the doloop modification. I think this is
a simple pasto; this code was evidently copied from the previous block:
Index: loop-iv.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/loop-iv.c,v retrieving revision 2.35 diff -u -b -c -p -r2.35 loop-iv.c cvs diff: conflicting specifications of output style *** loop-iv.c 21 Jul 2005 07:24:07 -0000 2.35 --- loop-iv.c 29 Aug 2005 23:34:12 -0000 *************** iv_number_of_iterations (struct loop *lo *** 2417,2423 **** tmp0 = lowpart_subreg (mode, iv0.base, comp_mode); tmp1 = lowpart_subreg (mode, iv1.base, comp_mode); ! bound = simplify_gen_binary (MINUS, mode, mode_mmin, lowpart_subreg (mode, step, comp_mode)); if (step_is_pow2) { --- 2417,2423 ---- tmp0 = lowpart_subreg (mode, iv0.base, comp_mode); tmp1 = lowpart_subreg (mode, iv1.base, comp_mode); ! bound = simplify_gen_binary (PLUS, mode, mode_mmin, lowpart_subreg (mode, step, comp_mode)); if (step_is_pow2) {
The code as it was computed -2147483648-256 which overflows. Still testing, but is there anything obvious wrong with this?