336dbd4cbf
Switch to a fix-point based range analysis to improve its precision. Dominator based algorithm was very imprecise for loop phis. Use widening to ensure fast convergence and narrowing to improve precision. Fixed compared to r39293: Type propagation is more sophisticated now compared to the time when range analysis was originally implemented and is able to derive Smi-ness from more than just CheckSmi instruction (e.g. GuardFieldClass). This creates situations when use's reaching type is Smi but definition itself is not a Smi and thus will never have range assigned to it. It is incorrect to treat ranges of such uses as unknown (_|_), because unknown means "not yet computed". Instead we must use the widest possible approximation: full smi range. InferRange methods were rewritten to use a newly introduced GetRange helper instead of accessing value()->definition()->range() directly. As a side-effect we no longer need to insert artificial constraints after CheckSmi instructions. R=fschneider@google.com Review URL: https://codereview.chromium.org//477193002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@39327 260f80e4-7a28-3924-810f-c04153c831b5