Closed
Description
#![crate_type = "lib"]
pub fn slice(s: &[uint]) -> uint {
for &j in s.iter() {
if j > 10 { return j }
}
0
}
pub fn vec(s: Vec<uint>) -> uint {
for &j in s.iter() {
if j > 10 { return j }
}
0
}
pub fn owned(s: ~[uint]) -> uint {
for &j in s.iter() {
if j > 10 { return j }
}
0
}
Compiled with -O --lib --emit-llvm -S
gives the following. The only major difference between &[]
/Vec
and ~[]
are two lines marked THIS CHECK
, which, we think, is because when constructing an iterator from ~[]
we do a pointer offset and dereference, so LLVM knows the pointers are non-null (in the slice/Vec
case, the match it.next() { None => ... }
part of the for loop isn't removed).
; ModuleID = '11751.rs'
target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
%"struct.std::vec::Vec<uint>[#1]" = type { i64, i64, i64* }
; Function Attrs: nounwind readonly uwtable
define i64 @_ZN5slice20h084d58a6edab0287daa4v0.0E({ i64*, i64 }* noalias nocapture nonnull readonly) unnamed_addr #0 {
entry-block:
%1 = getelementptr inbounds { i64*, i64 }* %0, i64 0, i32 0
%2 = load i64** %1, align 8
%3 = getelementptr inbounds { i64*, i64 }* %0, i64 0, i32 1
%4 = load i64* %3, align 8
%5 = getelementptr inbounds i64* %2, i64 %4
br label %loop_body
loop_body: ; preds = %match_else, %entry-block
%6 = phi i64* [ %9, %match_else ], [ %2, %entry-block ]
%7 = icmp eq i64* %6, %5
%8 = icmp eq i64* %6, null ; THIS CHECK!
%or.cond = or i1 %7, %8
br i1 %or.cond, label %return, label %match_else
match_else: ; preds = %loop_body
%9 = getelementptr inbounds i64* %6, i64 1
%10 = load i64* %6, align 8
%11 = icmp ugt i64 %10, 10
br i1 %11, label %return, label %loop_body
return: ; preds = %loop_body, %match_else
%__make_return_pointer.0 = phi i64 [ %10, %match_else ], [ 0, %loop_body ]
ret i64 %__make_return_pointer.0
}
; Function Attrs: uwtable
define i64 @_ZN3vec20h4963a1d1a9f58c9eUaa4v0.0E(%"struct.std::vec::Vec<uint>[#1]"* noalias nocapture nonnull readonly) unnamed_addr #1 {
entry-block:
%1 = getelementptr inbounds %"struct.std::vec::Vec<uint>[#1]"* %0, i64 0, i32 2
%2 = load i64** %1, align 8
%3 = getelementptr inbounds %"struct.std::vec::Vec<uint>[#1]"* %0, i64 0, i32 0
%4 = load i64* %3, align 8
%5 = getelementptr inbounds i64* %2, i64 %4
br label %loop_body
loop_body: ; preds = %entry-block, %match_else
%6 = phi i64* [ %2, %entry-block ], [ %9, %match_else ]
%7 = icmp eq i64* %6, %5
%8 = icmp eq i64* %6, null ; THIS CHECK!
%or.cond = or i1 %7, %8
br i1 %or.cond, label %clean_custom_6, label %match_else
match_else: ; preds = %loop_body
%9 = getelementptr inbounds i64* %6, i64 1
%10 = load i64* %6, align 8
%11 = icmp ugt i64 %10, 10
br i1 %11, label %clean_custom_6, label %loop_body
clean_custom_6: ; preds = %loop_body, %match_else
%__make_return_pointer.0 = phi i64 [ %10, %match_else ], [ 0, %loop_body ]
%12 = getelementptr inbounds %"struct.std::vec::Vec<uint>[#1]"* %0, i64 0, i32 1
%13 = load i64* %12, align 8
%14 = icmp eq i64 %13, 0
br i1 %14, label %"_ZN25std..vec..Vec$LT$uint$GT$14glue_drop.115917h10684057aba082a7E.exit", label %then-block-549-.i.i
then-block-549-.i.i: ; preds = %clean_custom_6
%15 = bitcast i64* %2 to i8*
tail call void @je_dallocx(i8* %15, i32 3)
br label %"_ZN25std..vec..Vec$LT$uint$GT$14glue_drop.115917h10684057aba082a7E.exit"
"_ZN25std..vec..Vec$LT$uint$GT$14glue_drop.115917h10684057aba082a7E.exit": ; preds = %clean_custom_6, %then-block-549-.i.i
ret i64 %__make_return_pointer.0
}
declare void @je_dallocx(i8*, i32) unnamed_addr #2
; Function Attrs: uwtable
define i64 @_ZN5owned20h3f7b4426165c9e96Bba4v0.0E({ i64, i64, [0 x i64] }* noalias nonnull) unnamed_addr #1 {
entry-block:
%1 = getelementptr inbounds { i64, i64, [0 x i64] }* %0, i64 0, i32 2, i64 0
%2 = getelementptr inbounds { i64, i64, [0 x i64] }* %0, i64 0, i32 0
%3 = load i64* %2, align 8
%4 = lshr i64 %3, 3
%5 = getelementptr inbounds { i64, i64, [0 x i64] }* %0, i64 0, i32 2, i64 %4
br label %loop_body
loop_body: ; preds = %entry-block, %match_else
%6 = phi i64* [ %1, %entry-block ], [ %8, %match_else ]
%7 = icmp eq i64* %6, %5
br i1 %7, label %"_ZN17_$UP$$x5buint$x5d14glue_drop.120017hf14aae96f6d219c9E.exit", label %match_else
match_else: ; preds = %loop_body
%8 = getelementptr inbounds i64* %6, i64 1
%9 = load i64* %6, align 8
%10 = icmp ugt i64 %9, 10
br i1 %10, label %"_ZN17_$UP$$x5buint$x5d14glue_drop.120017hf14aae96f6d219c9E.exit", label %loop_body
"_ZN17_$UP$$x5buint$x5d14glue_drop.120017hf14aae96f6d219c9E.exit": ; preds = %loop_body, %match_else
%__make_return_pointer.0 = phi i64 [ %9, %match_else ], [ 0, %loop_body ]
%11 = bitcast { i64, i64, [0 x i64] }* %0 to i8*
tail call void @je_dallocx(i8* %11, i32 3)
ret i64 %__make_return_pointer.0
}
attributes #0 = { nounwind readonly uwtable "split-stack" }
attributes #1 = { uwtable "split-stack" }
attributes #2 = { "split-stack" }