Squashed commit of the following:

commit 0a65c52040332f3066926239d32d2e24820cbd7b
Author: Cameron Zwarich <zwarich@mozilla.com>
Date:   Sun Jun 29 11:18:05 2014 -0700

    Improve the NullCheckElimination pass

    Teach the NullCheckElimination pass about recurrences involving inbounds
    GEPs. This allows the pass to optimize null checks from most uses of
    single slice and vector iterators.

    This still isn't sufficient to eliminate null checks from uses of
    multiple iterators with zip().

    Signed-off-by: Alex Chandel <alexchandel@gmail.com>

commit 6f699212d4642bebb86ee09a832b01ae636739e4
Author: Cameron Zwarich <zwarich@mozilla.com>
Date:   Thu Jun 26 23:41:06 2014 -0700

    Add the NullCheckElimination pass to the default pass list

    Since the NullCheckElimination pass has a similar intent to the
    CorrelatedValuePropagation pass, I decided to run it right after the
    both places that the latter runs.

    Signed-off-by: Alex Chandel <alexchandel@gmail.com>

commit 55aa7a3d43c8e4e7e7bbc25f05b2777d59f8f1f6
Author: Cameron Zwarich <zwarich@mozilla.com>
Date:   Wed Jun 25 20:33:49 2014 -0700

    Add a NullCheckElimination pass

    This pass is not Rust-specific, in that all of its transformations are
    intended to be correct for arbitrary LLVM IR, but it targets idioms
    found in IR generated by `rustc`, e.g. heavy use of `inbounds` GEPs.

    Signed-off-by: Alex Chandel <alexchandel@gmail.com>

commit d3ff8ea6270126f2bf532931b71678b8249b7ab8
Author: Carl-Anton Ingmarsson <mail@carlanton.se>
Date:   Tue Dec 24 21:49:55 2013 +0100

    Add getPassInfo() function to llvm::Pass

    PassRegistry::getPass() is quite heavy since it involves taking a lock and
    looking up the info in a hashtable.

    Signed-off-by: Alex Chandel <alexchandel@gmail.com>