> -----Original Message----- > From: Richard Biener [mailto:richard.guent...@gmail.com] > Sent: 08 January 2014 14:42 > To: Paulo Matos > Cc: Andrew Haley; gcc@gcc.gnu.org; Jan Hubicka > Subject: Re: Infinite number of iterations in loop [v850, mep] > > Well. We have > > Loop 2 is simple: > simple exit 5 -> 7 > infinite if: (expr_list:REG_DEP_TRUE (and:SI (reg:SI 76) > (const_int 1 [0x1])) > (nil)) > number of iterations: (lshiftrt:SI (plus:SI (minus:SI (reg:SI 68 [ D.1398 ]) > (reg:SI 64 [ ivtmp___6 ])) > (const_int -2 [0xfffffffffffffffe])) > (const_int 1 [0x1])) > upper bound: 2147483646 > realistic bound: -1 > Doloop: Possible infinite iteration case. > Doloop: The loop is not suitable. > > as we replaced the induction variable by a pointer induction with > step 2. So this might be a very common issue for RTL loop opts, > the upper bound of the IV is 2 * N in this case, so 2 * N & 1 > should be always false and thus "infinite" be optimized. > > (insn 34 33 36 3 (parallel [ > (set (reg:SI 76) > (plus:SI (reg/v:SI 71 [ N ]) > (reg/v:SI 71 [ N ]))) > (clobber (reg:CC 32 psw)) > ]) 21 {addsi3} > (expr_list:REG_UNUSED (reg:CC 32 psw) > (nil))) > > that doesn't look too difficult to do with the above definition. > nonzero_bits might be of use here, not sure (not my area of > expertise). >
I am trying to do something that shouldn't be too hard with the current df infrastructure but I don't think I am doing it the right way. Once I have the assumption (and:SI (reg:SI 76) (const_int 1 [0x1])) I need to reach the definition of reg 76 which is insn 34. Generally we can only do this if there if no other definition of reg 76 except one in a dominator basic block. The CFG looks like: BB2 / \ BB3 BB7 | \ BB6 exit \ BB4 --------- / \ BB5 BB9 | \ | BB8 BB7 (exit) BB4 (loop) | BB6 (loop) BB3 contains insn 34 and there's no other definition of reg 76 in loop BB6->BB4->BB5->BB8 or the inner BB4->BB9. Is there a way to do this search for definition of reg 76 automatically? I can see a df_find_def, however this requires me to have insn 34 already. I need to search for it. Is there anything in GCC to do this already? I am sure GCC must be doing this already somewhere. Cheers, Paulo Matos > Richard. >