[Bug rtl-optimization/32283] Missed induction variable optimization

amonakov at gmail dot com gcc-bugzilla@gcc.gnu.org
Thu Sep 20 16:25:00 GMT 2007



------- Comment #13 from amonakov at gmail dot com  2007-09-20 16:25 -------
This patch sometimes confuses loop2_doloop.  On ia64 this prevents use of
countable loop branch machine idiom (br.cloop).  On the example used in this
thread loop2_doloop complains:

Loop 1 is simple:
  simple exit 5 -> 6
  infinite if: (expr_list:REG_DEP_TRUE (subreg:SI (and:DI (plus:DI (minus:DI
(reg:DI 391)
                    (reg:DI 370 [ ivtmp.16 ]))
                (const:DI (plus:DI (symbol_ref:DI ("a") [flags 0x2] <var_decl
0x2aaaaabd7000 a>)
                        (const_int -2 [0xfffffffffffffffe]))))
            (const_int 1 [0x1])) 0)
    (nil))       
  number of iterations: (lshiftrt:DI (plus:DI (minus:DI (reg:DI 392)
            (reg:DI 370 [ ivtmp.16 ]))
        (const_int -2 [0xfffffffffffffffe]))
    (const_int 1 [0x1]))
  upper bound: -1
Doloop: Possible infinite iteration case.
Doloop: The loop is not suitable.

The "infinite if" condition is:
((r391 - r370) + ('a' - 2)) & 1 == 1
where r370 is &(a[i]) and r391 is len*sizeof(a[0]), so that r391+'a' is
&a[len].  Of course, such "infinite if" condition is always false, but
loop2_doloop does not see that.


-- 

amonakov at gmail dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |amonakov at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32283



More information about the Gcc-bugs mailing list