------- Comment #1 from pinskia at gcc dot gnu dot org 2007-04-10 08:39 ------- i_5 = ASSERT_EXPR <i_1, i_1 < x_10>; D.1607_6 = i_5 / 4;
i_5: [0, 2147483646] EQUIVALENCES: { i_1 } (1 elements) We don't do the shifting if i's range includes 0 which is wrong as 0>>n is always 0 so the reduced testcase is: int f(int x) { if (x<0) return 0; return x/4; } We should be able to convert the / into a >> without any issue. Mine I have a simple patch. -- pinskia at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |pinskia at gcc dot gnu dot | |org AssignedTo|unassigned at gcc dot gnu |pinskia at gcc dot gnu dot |dot org |org Severity|normal |enhancement Status|UNCONFIRMED |ASSIGNED Component|pending |tree-optimization Ever Confirmed|0 |1 GCC build triplet|x86_64-unknown-linux-gnu | GCC host triplet|x86_64-unknown-linux-gnu | GCC target triplet|x86_64-unknown-linux-gnu | Keywords| |missed-optimization Last reconfirmed|0000-00-00 00:00:00 |2007-04-10 08:39:22 date| | Summary|strength-reduce idiv given |/ conversion to >> is not |assertion numerator is |done when the divisor can be |positive |zero http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31521