From f2932e46614ab0f91f7dfd064cadf1e3db2a9667 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 2 Oct 2013 07:51:39 -0400 Subject: [PATCH] make small (<= size_of::()) enums immediate C-like enums are excluded from this for now, because the code paths specific to them need to be changed. fn foo() -> Option<~int> { Some(~5) } Before: ; Function Attrs: uwtable define void @_ZN3foo18hdec6e36682b87eeaf4v0.0E(%"enum.std::option::Option<~int>[#1]"* noalias nocapture sret, { i64, %tydesc*, i8*, i8*, i8 }* nocapture readnone) #0 { "function top level": %2 = tail call %"enum.std::libc::types::common::c95::c_void[#1]"* @"_ZN2rt11global_heap10malloc_raw17h56c543b77f9b78aY11v0.9$x2dpreE"({ i64, %tydesc*, i8*, i8*, i8 }* undef, i64 8) %3 = bitcast %"enum.std::libc::types::common::c95::c_void[#1]"* %2 to i64* store i64 5, i64* %3, align 8 %4 = getelementptr inbounds %"enum.std::option::Option<~int>[#1]"* %0, i64 0, i32 0 store i64* %3, i64** %4, align 8 ret void } After: ; Function Attrs: uwtable define %"enum.std::option::Option<~int>[#1]" @_ZN3foo18h2cbf6557a3143edah4v0.0E({ i64, %tydesc*, i8*, i8*, i8 }* nocapture readnone) #0 { "function top level": %1 = tail call %"enum.std::libc::types::common::c95::c_void[#1]"* @"_ZN2rt11global_heap10malloc_raw18hb1e9dd1beab35edau11v0.9$x2dpreE"({ i64, %tydesc*, i8*, i8*, i8 }* undef, i64 8) %2 = bitcast %"enum.std::libc::types::common::c95::c_void[#1]"* %1 to i64* store i64 5, i64* %2, align 8 %oldret = insertvalue %"enum.std::option::Option<~int>[#1]" undef, i64* %2, 0 ret %"enum.std::option::Option<~int>[#1]" %oldret } --- src/librustc/middle/trans/common.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/librustc/middle/trans/common.rs b/src/librustc/middle/trans/common.rs index 8fbf8b1813c8..bbed6324543f 100644 --- a/src/librustc/middle/trans/common.rs +++ b/src/librustc/middle/trans/common.rs @@ -69,9 +69,13 @@ pub fn type_is_immediate(ccx: &mut CrateContext, ty: ty::t) -> bool { if simple { return true; } + // FIXME: #9651: C-like enums should also be immediate + if ty::type_is_c_like_enum(ccx.tcx, ty) { + return false; + } match ty::get(ty).sty { - // FIXME: #9651: small `ty_struct` and `ty_enum` should also be immediate - ty::ty_tup(*) => { + // FIXME: #9651: small `ty_struct` should also be immediate + ty::ty_enum(*) | ty::ty_tup(*) => { let llty = sizing_type_of(ccx, ty); llsize_of_alloc(ccx, llty) <= llsize_of_alloc(ccx, ccx.int_type) }