Open
Description
This was isolated by @stjepang in #37939
This program: (playground)
pub fn id_result(a: Result<u64, i64>) -> Result<u64, i64> {
match a {
Ok(x) => Ok(x),
Err(y) => Err(y),
}
}
Should optimize to something that just copies the input to the output, with no conditionals.
Output on rustc 1.15.0-nightly (daf8c1dfc 2016-12-05)
using -Copt-level=3 --emit=llvm-ir
is this:
; ModuleID = 'id_result.cgu-0.rs'
source_filename = "id_result.cgu-0.rs"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
%"core::result::Result<u64, i64>" = type { i64, [0 x i64], [1 x i64] }
; Function Attrs: norecurse nounwind uwtable
define void @id_result(%"core::result::Result<u64, i64>"* noalias nocapture sret dereferenceable(16), %"core::result::Result<u64, i64>"* noalias nocapture readonly dereferenceable(16)) unnamed_addr #0 {
entry-block:
%a.sroa.0.0..sroa_idx = getelementptr inbounds %"core::result::Result<u64, i64>", %"core::result::Result<u64, i64>"* %1, i64 0, i32 0
%a.sroa.0.0.copyload = load i64, i64* %a.sroa.0.0..sroa_idx, align 8
%a.sroa.4.0..sroa_idx2 = getelementptr inbounds %"core::result::Result<u64, i64>", %"core::result::Result<u64, i64>"* %1, i64 0, i32 2, i64 0
%a.sroa.4.0.copyload = load i64, i64* %a.sroa.4.0..sroa_idx2, align 8
%2 = getelementptr inbounds %"core::result::Result<u64, i64>", %"core::result::Result<u64, i64>"* %0, i64 0, i32 0
%not.switch = icmp ne i64 %a.sroa.0.0.copyload, 0
%. = zext i1 %not.switch to i64
store i64 %., i64* %2, align 8
%3 = getelementptr inbounds %"core::result::Result<u64, i64>", %"core::result::Result<u64, i64>"* %0, i64 0, i32 2, i64 0
store i64 %a.sroa.4.0.copyload, i64* %3, align 8
ret void
}
attributes #0 = { norecurse nounwind uwtable }