]> git.lizzy.rs Git - rust.git/commitdiff
Generate slightly better unoptimized code for for-loops
authorBjörn Steinbrink <bsteinbr@gmail.com>
Fri, 15 Aug 2014 10:56:24 +0000 (12:56 +0200)
committerBjörn Steinbrink <bsteinbr@gmail.com>
Fri, 15 Aug 2014 11:12:48 +0000 (13:12 +0200)
The discriminant for Option values is either 0 or 1, so we can just
truncate the value to an i1, which ends up as a no-op for Options
containing pointers.

src/librustc/middle/trans/controlflow.rs

index a481f92db33916345a1635176feb38926b38d280..193303f4d1cd361e1f3b58ed04e7513fb19eb2ee 100644 (file)
@@ -330,13 +330,12 @@ pub fn trans_for<'a>(
     // Check the discriminant; if the `None` case, exit the loop.
     let option_representation = adt::represent_type(loopback_bcx_out.ccx(),
                                                     method_result_type);
-    let i8_type = Type::i8(loopback_bcx_out.ccx());
     let lldiscriminant = adt::trans_get_discr(loopback_bcx_out,
                                               &*option_representation,
                                               option_datum.val,
-                                              Some(i8_type));
-    let llzero = C_u8(loopback_bcx_out.ccx(), 0);
-    let llcondition = ICmp(loopback_bcx_out, IntNE, lldiscriminant, llzero);
+                                              None);
+    let i1_type = Type::i1(loopback_bcx_out.ccx());
+    let llcondition = Trunc(loopback_bcx_out, lldiscriminant, i1_type);
     CondBr(loopback_bcx_out, llcondition, body_bcx_in.llbb, cleanup_llbb);
 
     // Now we're in the body. Unpack the `Option` value into the programmer-