about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-06-27 18:35:01 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-06-27 18:35:01 -0700
commit663aa7663533b6b1cbeb2229c95b4bbde1a5d18e (patch)
tree389c8eb8d749c8e337dc9811a369751cc0138489 /src/comp
parentdfccd5a138bfd7b20edcfd9ec1c7fae1eff3480c (diff)
downloadrust-663aa7663533b6b1cbeb2229c95b4bbde1a5d18e.tar.gz
rust-663aa7663533b6b1cbeb2229c95b4bbde1a5d18e.zip
rustc: Call cmp glue directly if we statically know it
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index aa42210cadd..c20b54f1930 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -2984,9 +2984,17 @@ fn call_cmp_glue(&@block_ctxt cx, ValueRef lhs, ValueRef rhs, &ty::t t,
         r.bcx.build.GEP(r.val,
                         [C_int(0), C_int(abi::tydesc_field_first_param)]);
     lltydescs = r.bcx.build.Load(lltydescs);
-    auto llfnptr =
-        r.bcx.build.GEP(r.val, [C_int(0), C_int(abi::tydesc_field_cmp_glue)]);
-    auto llfn = r.bcx.build.Load(llfnptr);
+
+    auto llfn;
+    alt (ti) {
+      case (none) {
+        auto llfnptr = r.bcx.build.GEP(r.val, [C_int(0),
+            C_int(abi::tydesc_field_cmp_glue)]);
+        llfn = r.bcx.build.Load(llfnptr);
+      }
+      case (some(?sti)) { llfn = option::get(sti.cmp_glue); }
+    }
+
     auto llcmpresultptr = alloca(r.bcx, T_i1());
     let vec[ValueRef] llargs =
         [llcmpresultptr, r.bcx.fcx.lltaskptr, C_null(T_ptr(T_nil())),