diff options
| author | Björn Steinbrink <bsteinbr@gmail.com> | 2014-08-15 12:56:24 +0200 |
|---|---|---|
| committer | Björn Steinbrink <bsteinbr@gmail.com> | 2014-08-15 13:12:48 +0200 |
| commit | 6c5d97a5da043c785b2fb38c0fd13c85ab265122 (patch) | |
| tree | 18bcac29036020ea42969de95729c58637889bb5 | |
| parent | 36db3866c0c630503fa91d3aab015ee880000afb (diff) | |
| download | rust-6c5d97a5da043c785b2fb38c0fd13c85ab265122.tar.gz rust-6c5d97a5da043c785b2fb38c0fd13c85ab265122.zip | |
Generate slightly better unoptimized code for for-loops
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.
| -rw-r--r-- | src/librustc/middle/trans/controlflow.rs | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/src/librustc/middle/trans/controlflow.rs b/src/librustc/middle/trans/controlflow.rs index a481f92db33..193303f4d1c 100644 --- a/src/librustc/middle/trans/controlflow.rs +++ b/src/librustc/middle/trans/controlflow.rs @@ -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- |
