about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-10-28 16:07:14 -0700
committerbors <bors@rust-lang.org>2013-10-28 16:07:14 -0700
commit8852cb7713c7867fc97832494588d3bb243136d8 (patch)
tree6cde3ed97c2e5ef1f4e7a42c6a328677e5655297 /src
parentcd6e9f4f834f849a3dafd7cf0786f3c97bc3bb37 (diff)
parentdde8be6ad06a3e6efd243b3e76dc23162d2103f4 (diff)
downloadrust-8852cb7713c7867fc97832494588d3bb243136d8.tar.gz
rust-8852cb7713c7867fc97832494588d3bb243136d8.zip
auto merge of #10113 : thestinger/rust/expect, r=cmr
LLVM is unable to determine this for most cases.

http://llvm-reviews.chandlerc.com/D2034 needs to land upstream before
this is going to have an effect. It's harmless to start generating the
expect hint now.
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/trans/base.rs2
-rw-r--r--src/librustc/middle/trans/expr.rs4
2 files changed, 5 insertions, 1 deletions
diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs
index 74f9e2114e1..5f7a4f6be30 100644
--- a/src/librustc/middle/trans/base.rs
+++ b/src/librustc/middle/trans/base.rs
@@ -2844,6 +2844,8 @@ pub fn declare_intrinsics(llmod: ModuleRef) -> HashMap<&'static str, ValueRef> {
     ifn!(intrinsics, "llvm.umul.with.overflow.i64",
         [Type::i64(), Type::i64()], Type::struct_([Type::i64(), Type::i1()], false));
 
+    ifn!(intrinsics, "llvm.expect.i1", [Type::i1(), Type::i1()], Type::i1());
+
     return intrinsics;
 }
 
diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs
index 56f1e047841..d4c57d7ce18 100644
--- a/src/librustc/middle/trans/expr.rs
+++ b/src/librustc/middle/trans/expr.rs
@@ -981,7 +981,9 @@ fn trans_lvalue_unadjusted(bcx: @mut Block, expr: &ast::Expr) -> DatumBlock {
         debug!("trans_index: len {}", bcx.val_to_str(len));
 
         let bounds_check = ICmp(bcx, lib::llvm::IntUGE, ix_val, len);
-        let bcx = do with_cond(bcx, bounds_check) |bcx| {
+        let expect = ccx.intrinsics.get_copy(&("llvm.expect.i1"));
+        let expected = Call(bcx, expect, [bounds_check, C_i1(false)], []);
+        let bcx = do with_cond(bcx, expected) |bcx| {
             controlflow::trans_fail_bounds_check(bcx, index_expr.span, ix_val, len)
         };
         let elt = InBoundsGEP(bcx, base, [ix_val]);