Skip to content

Instantly share code, notes, and snippets.

@maurer
Created June 30, 2023 17:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maurer/9fdcc6d84db76863174aaf84317bdf7c to your computer and use it in GitHub Desktop.
Save maurer/9fdcc6d84db76863174aaf84317bdf7c to your computer and use it in GitHub Desktop.
; ModuleID = 'issue_73396_bounds_check_after_position.243dbce97eb6665-cgu.0'
source_filename = "issue_73396_bounds_check_after_position.243dbce97eb6665-cgu.0"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@alloc_e4b1b3666b3c25567a07430a79501aaf = private unnamed_addr constant <{ [116 x i8] }> <{ [116 x i8] c"/usr/local/google/home/mmaurer/github/rust-lang/rust/tests/codegen/issues/issue-73396-bounds-check-after-position.rs" }>, align 1
@alloc_317973b77b3cc8361da3eba518797a85 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_e4b1b3666b3c25567a07430a79501aaf, [16 x i8] c"t\00\00\00\00\00\00\00\11\00\00\00\0A\00\00\00" }>, align 8
@alloc_7bfe8eaf482419fd2021a64e7d1acdd9 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_e4b1b3666b3c25567a07430a79501aaf, [16 x i8] c"t\00\00\00\00\00\00\00 \00\00\00\0A\00\00\00" }>, align 8
@alloc_c8fb52adf811dcb255160898c9f3f03d = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_e4b1b3666b3c25567a07430a79501aaf, [16 x i8] c"t\00\00\00\00\00\00\00/\00\00\00\09\00\00\00" }>, align 8
@alloc_e89c398a0256471fc014ced090cdaceb = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_e4b1b3666b3c25567a07430a79501aaf, [16 x i8] c"t\00\00\00\00\00\00\00=\00\00\00\0A\00\00\00" }>, align 8
@alloc_c175dc71da6f7e1dc826123052d9cd03 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_e4b1b3666b3c25567a07430a79501aaf, [16 x i8] c"t\00\00\00\00\00\00\00L\00\00\00\0A\00\00\00" }>, align 8
@alloc_eb910bea89086399bbc20567964c9030 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_e4b1b3666b3c25567a07430a79501aaf, [16 x i8] c"t\00\00\00\00\00\00\00[\00\00\00\09\00\00\00" }>, align 8
; Function Attrs: nonlazybind uwtable
define { ptr, i64 } @position_slice_to_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
%0 = icmp eq i64 %s.1, 0
br i1 %0, label %bb4, label %bb7.i
bb7.i: ; preds = %start, %bb10.i
%i.011.i = phi i64 [ %_21.0.i, %bb10.i ], [ 0, %start ]
%_32.i910.i = phi ptr [ %_32.i.i, %bb10.i ], [ %s.0, %start ]
%_3.i.i = load i8, ptr %_32.i910.i, align 1, !alias.scope !2, !noalias !5, !noundef !8
%1 = icmp eq i8 %_3.i.i, 92
br i1 %1, label %bb2, label %bb10.i
bb10.i: ; preds = %bb7.i
%_32.i.i = getelementptr inbounds i8, ptr %_32.i910.i, i64 1
%_21.0.i = add nuw i64 %i.011.i, 1
%2 = icmp eq ptr %_32.i.i, %end
br i1 %2, label %bb4, label %bb7.i
bb2: ; preds = %bb7.i
%_9.i = icmp ugt i64 %i.011.i, %s.1
br i1 %_9.i, label %bb3.i, label %bb4
bb3.i: ; preds = %bb2
; call core::slice::index::slice_end_index_len_fail
tail call void @_ZN4core5slice5index24slice_end_index_len_fail17h80a8d89025e3e486E(i64 noundef %i.011.i, i64 noundef %s.1, ptr noalias noundef nonnull readonly align 8 dereferenceable(24) @alloc_317973b77b3cc8361da3eba518797a85) #2, !noalias !9
unreachable
bb4: ; preds = %bb10.i, %bb2, %start
%.sroa.3.0 = phi i64 [ 0, %start ], [ %i.011.i, %bb2 ], [ %s.1, %bb10.i ]
%3 = insertvalue { ptr, i64 } poison, ptr %s.0, 0
%4 = insertvalue { ptr, i64 } %3, i64 %.sroa.3.0, 1
ret { ptr, i64 } %4
}
; Function Attrs: nonlazybind uwtable
define { ptr, i64 } @position_slice_from_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
%0 = icmp eq i64 %s.1, 0
br i1 %0, label %bb4, label %bb7.i
bb7.i: ; preds = %start, %bb10.i
%i.011.i = phi i64 [ %_21.0.i, %bb10.i ], [ 0, %start ]
%_32.i910.i = phi ptr [ %_32.i.i, %bb10.i ], [ %s.0, %start ]
%_3.i.i = load i8, ptr %_32.i910.i, align 1, !alias.scope !12, !noalias !15, !noundef !8
%1 = icmp eq i8 %_3.i.i, 92
br i1 %1, label %bb2, label %bb10.i
bb10.i: ; preds = %bb7.i
%_32.i.i = getelementptr inbounds i8, ptr %_32.i910.i, i64 1
%_21.0.i = add nuw i64 %i.011.i, 1
%2 = icmp eq ptr %_32.i.i, %end
br i1 %2, label %bb4, label %bb7.i
bb2: ; preds = %bb7.i
%_18 = icmp ugt i64 %i.011.i, %s.1
br i1 %_18, label %bb5, label %bb6
bb6: ; preds = %bb2
%new_len = sub nuw i64 %s.1, %i.011.i
%data = getelementptr inbounds i8, ptr %s.0, i64 %i.011.i
br label %bb4
bb5: ; preds = %bb2
; call core::slice::index::slice_start_index_len_fail
tail call void @_ZN4core5slice5index26slice_start_index_len_fail17hebf4c07799653c4cE(i64 noundef %i.011.i, i64 noundef %s.1, ptr noalias noundef nonnull readonly align 8 dereferenceable(24) @alloc_7bfe8eaf482419fd2021a64e7d1acdd9) #2
unreachable
bb4: ; preds = %bb10.i, %start, %bb6
%.sroa.3.0 = phi i64 [ %new_len, %bb6 ], [ 0, %start ], [ %s.1, %bb10.i ]
%.sroa.0.0 = phi ptr [ %data, %bb6 ], [ %s.0, %start ], [ %s.0, %bb10.i ]
%3 = insertvalue { ptr, i64 } poison, ptr %.sroa.0.0, 0
%4 = insertvalue { ptr, i64 } %3, i64 %.sroa.3.0, 1
ret { ptr, i64 } %4
}
; Function Attrs: nonlazybind uwtable
define noundef i8 @position_index_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
%0 = icmp eq i64 %s.1, 0
br i1 %0, label %bb5, label %bb7.i
bb7.i: ; preds = %start, %bb10.i
%i.011.i = phi i64 [ %_21.0.i, %bb10.i ], [ 0, %start ]
%_32.i910.i = phi ptr [ %_32.i.i, %bb10.i ], [ %s.0, %start ]
%_3.i.i = load i8, ptr %_32.i910.i, align 1, !alias.scope !18, !noalias !21, !noundef !8
%1 = icmp eq i8 %_3.i.i, 92
br i1 %1, label %bb2, label %bb10.i
bb10.i: ; preds = %bb7.i
%_32.i.i = getelementptr inbounds i8, ptr %_32.i910.i, i64 1
%_21.0.i = add nuw i64 %i.011.i, 1
%2 = icmp eq ptr %_32.i.i, %end
br i1 %2, label %bb5, label %bb7.i
bb2: ; preds = %bb7.i
%_8 = icmp ult i64 %i.011.i, %s.1
br i1 %_8, label %bb3, label %panic, !prof !24
bb3: ; preds = %bb2
%3 = getelementptr inbounds [0 x i8], ptr %s.0, i64 0, i64 %i.011.i
%4 = load i8, ptr %3, align 1, !noundef !8
br label %bb5
panic: ; preds = %bb2
; call core::panicking::panic_bounds_check
tail call void @_ZN4core9panicking18panic_bounds_check17h2c24583383b0129bE(i64 noundef %i.011.i, i64 noundef %s.1, ptr noalias noundef nonnull readonly align 8 dereferenceable(24) @alloc_c8fb52adf811dcb255160898c9f3f03d) #2
unreachable
bb5: ; preds = %bb10.i, %start, %bb3
%.0 = phi i8 [ %4, %bb3 ], [ 42, %start ], [ 42, %bb10.i ]
ret i8 %.0
}
; Function Attrs: nonlazybind uwtable
define { ptr, i64 } @rposition_slice_to_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
br label %bb5.i
bb5.i: ; preds = %bb7.i, %start
%self1.i10.i = phi ptr [ %end, %start ], [ %_10.i.i.i, %bb7.i ]
%i.0.i = phi i64 [ %s.1, %start ], [ %1, %bb7.i ]
%0 = icmp eq ptr %self1.i10.i, %s.0
br i1 %0, label %bb4, label %bb7.i
bb7.i: ; preds = %bb5.i
%_10.i.i.i = getelementptr inbounds i8, ptr %self1.i10.i, i64 -1
%1 = add i64 %i.0.i, -1
%_3.i.i = load i8, ptr %_10.i.i.i, align 1, !alias.scope !25, !noalias !28, !noundef !8
%2 = icmp eq i8 %_3.i.i, 92
br i1 %2, label %bb2, label %bb5.i
bb2: ; preds = %bb7.i
%_9.i = icmp ugt i64 %1, %s.1
br i1 %_9.i, label %bb3.i, label %bb4
bb3.i: ; preds = %bb2
; call core::slice::index::slice_end_index_len_fail
tail call void @_ZN4core5slice5index24slice_end_index_len_fail17h80a8d89025e3e486E(i64 noundef %1, i64 noundef %s.1, ptr noalias noundef nonnull readonly align 8 dereferenceable(24) @alloc_e89c398a0256471fc014ced090cdaceb) #2, !noalias !31
unreachable
bb4: ; preds = %bb5.i, %bb2
%.sroa.3.0 = phi i64 [ %1, %bb2 ], [ %s.1, %bb5.i ]
%3 = insertvalue { ptr, i64 } poison, ptr %s.0, 0
%4 = insertvalue { ptr, i64 } %3, i64 %.sroa.3.0, 1
ret { ptr, i64 } %4
}
; Function Attrs: nonlazybind uwtable
define { ptr, i64 } @rposition_slice_from_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
br label %bb5.i
bb5.i: ; preds = %bb7.i, %start
%self1.i10.i = phi ptr [ %end, %start ], [ %_10.i.i.i, %bb7.i ]
%i.0.i = phi i64 [ %s.1, %start ], [ %1, %bb7.i ]
%0 = icmp eq ptr %self1.i10.i, %s.0
br i1 %0, label %bb4, label %bb7.i
bb7.i: ; preds = %bb5.i
%_10.i.i.i = getelementptr inbounds i8, ptr %self1.i10.i, i64 -1
%1 = add i64 %i.0.i, -1
%_3.i.i = load i8, ptr %_10.i.i.i, align 1, !alias.scope !34, !noalias !37, !noundef !8
%2 = icmp eq i8 %_3.i.i, 92
br i1 %2, label %bb2, label %bb5.i
bb2: ; preds = %bb7.i
%_18 = icmp ugt i64 %1, %s.1
br i1 %_18, label %bb5, label %bb6
bb6: ; preds = %bb2
%new_len = sub nuw i64 %s.1, %1
%data = getelementptr inbounds i8, ptr %s.0, i64 %1
br label %bb4
bb5: ; preds = %bb2
; call core::slice::index::slice_start_index_len_fail
tail call void @_ZN4core5slice5index26slice_start_index_len_fail17hebf4c07799653c4cE(i64 noundef %1, i64 noundef %s.1, ptr noalias noundef nonnull readonly align 8 dereferenceable(24) @alloc_c175dc71da6f7e1dc826123052d9cd03) #2
unreachable
bb4: ; preds = %bb5.i, %bb6
%.sroa.3.0 = phi i64 [ %new_len, %bb6 ], [ %s.1, %bb5.i ]
%.sroa.0.0 = phi ptr [ %data, %bb6 ], [ %s.0, %bb5.i ]
%3 = insertvalue { ptr, i64 } poison, ptr %.sroa.0.0, 0
%4 = insertvalue { ptr, i64 } %3, i64 %.sroa.3.0, 1
ret { ptr, i64 } %4
}
; Function Attrs: nonlazybind uwtable
define noundef i8 @rposition_index_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
br label %bb5.i
bb5.i: ; preds = %bb7.i, %start
%self1.i10.i = phi ptr [ %end, %start ], [ %_10.i.i.i, %bb7.i ]
%i.0.i = phi i64 [ %s.1, %start ], [ %1, %bb7.i ]
%0 = icmp eq ptr %self1.i10.i, %s.0
br i1 %0, label %bb5, label %bb7.i
bb7.i: ; preds = %bb5.i
%_10.i.i.i = getelementptr inbounds i8, ptr %self1.i10.i, i64 -1
%1 = add i64 %i.0.i, -1
%_3.i.i = load i8, ptr %_10.i.i.i, align 1, !alias.scope !40, !noalias !43, !noundef !8
%2 = icmp eq i8 %_3.i.i, 92
br i1 %2, label %bb2, label %bb5.i
bb2: ; preds = %bb7.i
%_8 = icmp ult i64 %1, %s.1
br i1 %_8, label %bb3, label %panic, !prof !24
bb3: ; preds = %bb2
%3 = getelementptr inbounds [0 x i8], ptr %s.0, i64 0, i64 %1
%4 = load i8, ptr %3, align 1, !noundef !8
br label %bb5
panic: ; preds = %bb2
; call core::panicking::panic_bounds_check
tail call void @_ZN4core9panicking18panic_bounds_check17h2c24583383b0129bE(i64 noundef %1, i64 noundef %s.1, ptr noalias noundef nonnull readonly align 8 dereferenceable(24) @alloc_eb910bea89086399bbc20567964c9030) #2
unreachable
bb5: ; preds = %bb5.i, %bb3
%.0 = phi i8 [ %4, %bb3 ], [ 42, %bb5.i ]
ret i8 %.0
}
; core::slice::index::slice_end_index_len_fail
; Function Attrs: cold noinline noreturn nonlazybind uwtable
declare void @_ZN4core5slice5index24slice_end_index_len_fail17h80a8d89025e3e486E(i64 noundef, i64 noundef, ptr noalias noundef readonly align 8 dereferenceable(24)) unnamed_addr #1
; Function Attrs: nonlazybind uwtable
declare noundef i32 @rust_eh_personality(i32 noundef, i32 noundef, i64 noundef, ptr noundef, ptr noundef) unnamed_addr #0
; core::slice::index::slice_start_index_len_fail
; Function Attrs: cold noinline noreturn nonlazybind uwtable
declare void @_ZN4core5slice5index26slice_start_index_len_fail17hebf4c07799653c4cE(i64 noundef, i64 noundef, ptr noalias noundef readonly align 8 dereferenceable(24)) unnamed_addr #1
; core::panicking::panic_bounds_check
; Function Attrs: cold noinline noreturn nonlazybind uwtable
declare void @_ZN4core9panicking18panic_bounds_check17h2c24583383b0129bE(i64 noundef, i64 noundef, ptr noalias noundef readonly align 8 dereferenceable(24)) unnamed_addr #1
attributes #0 = { nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #1 = { cold noinline noreturn nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #2 = { noreturn }
!llvm.module.flags = !{!0, !1}
!0 = !{i32 8, !"PIC Level", i32 2}
!1 = !{i32 2, !"RtLibUseGOT", i32 1}
!2 = !{!3}
!3 = distinct !{!3, !4, !"_ZN39issue_73396_bounds_check_after_position33position_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h99f5d541eb931a50E: %b"}
!4 = distinct !{!4, !"_ZN39issue_73396_bounds_check_after_position33position_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h99f5d541eb931a50E"}
!5 = !{!6}
!6 = distinct !{!6, !7, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h014a29f14846ed19E: %self"}
!7 = distinct !{!7, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h014a29f14846ed19E"}
!8 = !{}
!9 = !{!10}
!10 = distinct !{!10, !11, !"_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h59e8fe4d54d43364E: %slice.0"}
!11 = distinct !{!11, !"_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h59e8fe4d54d43364E"}
!12 = !{!13}
!13 = distinct !{!13, !14, !"_ZN39issue_73396_bounds_check_after_position35position_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h67ad3d0719537553E: %b"}
!14 = distinct !{!14, !"_ZN39issue_73396_bounds_check_after_position35position_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h67ad3d0719537553E"}
!15 = !{!16}
!16 = distinct !{!16, !17, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17hff5e01dff8f73f91E: %self"}
!17 = distinct !{!17, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17hff5e01dff8f73f91E"}
!18 = !{!19}
!19 = distinct !{!19, !20, !"_ZN39issue_73396_bounds_check_after_position30position_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17hd945e81644499524E: %b"}
!20 = distinct !{!20, !"_ZN39issue_73396_bounds_check_after_position30position_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17hd945e81644499524E"}
!21 = !{!22}
!22 = distinct !{!22, !23, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h29ed6b771178a12bE: %self"}
!23 = distinct !{!23, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h29ed6b771178a12bE"}
!24 = !{!"branch_weights", i32 2000, i32 1}
!25 = !{!26}
!26 = distinct !{!26, !27, !"_ZN39issue_73396_bounds_check_after_position34rposition_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h448d1758c85b4ea9E: %b"}
!27 = distinct !{!27, !"_ZN39issue_73396_bounds_check_after_position34rposition_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h448d1758c85b4ea9E"}
!28 = !{!29}
!29 = distinct !{!29, !30, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h5b47a5f6bb653399E: %self"}
!30 = distinct !{!30, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h5b47a5f6bb653399E"}
!31 = !{!32}
!32 = distinct !{!32, !33, !"_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h59e8fe4d54d43364E: %slice.0"}
!33 = distinct !{!33, !"_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h59e8fe4d54d43364E"}
!34 = !{!35}
!35 = distinct !{!35, !36, !"_ZN39issue_73396_bounds_check_after_position36rposition_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h0e540b8963bdb02dE: %b"}
!36 = distinct !{!36, !"_ZN39issue_73396_bounds_check_after_position36rposition_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h0e540b8963bdb02dE"}
!37 = !{!38}
!38 = distinct !{!38, !39, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17ha10bc9d42e3742a8E: %self"}
!39 = distinct !{!39, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17ha10bc9d42e3742a8E"}
!40 = !{!41}
!41 = distinct !{!41, !42, !"_ZN39issue_73396_bounds_check_after_position31rposition_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h543c9a77d10c335dE: %b"}
!42 = distinct !{!42, !"_ZN39issue_73396_bounds_check_after_position31rposition_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h543c9a77d10c335dE"}
!43 = !{!44}
!44 = distinct !{!44, !45, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h37283fbd7bde1439E: %self"}
!45 = distinct !{!45, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h37283fbd7bde1439E"}
; ModuleID = 'issue_73396_bounds_check_after_position.243dbce97eb6665-cgu.0'
source_filename = "issue_73396_bounds_check_after_position.243dbce97eb6665-cgu.0"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: nofree nosync nounwind nonlazybind memory(read, inaccessiblemem: readwrite) uwtable
define { ptr, i64 } @position_slice_to_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
%0 = icmp eq i64 %s.1, 0
br i1 %0, label %bb4, label %bb7.i
bb7.i: ; preds = %start, %bb10.i
%i.013.i = phi i64 [ %_21.0.i, %bb10.i ], [ 0, %start ]
%_32.i1112.i = phi ptr [ %_32.i.i, %bb10.i ], [ %s.0, %start ]
%_3.i.i = load i8, ptr %_32.i1112.i, align 1, !alias.scope !2, !noalias !5, !noundef !8
%1 = icmp eq i8 %_3.i.i, 92
br i1 %1, label %bb2, label %bb10.i
bb10.i: ; preds = %bb7.i
%_32.i.i = getelementptr inbounds i8, ptr %_32.i1112.i, i64 1
%_21.0.i = add nuw i64 %i.013.i, 1
%2 = icmp eq ptr %_32.i.i, %end
br i1 %2, label %bb4, label %bb7.i
bb2: ; preds = %bb7.i
%_17.i = icmp ult i64 %i.013.i, %s.1
tail call void @llvm.assume(i1 %_17.i)
br label %bb4
bb4: ; preds = %bb10.i, %start, %bb2
%.sroa.3.0 = phi i64 [ %i.013.i, %bb2 ], [ 0, %start ], [ %s.1, %bb10.i ]
%3 = insertvalue { ptr, i64 } poison, ptr %s.0, 0
%4 = insertvalue { ptr, i64 } %3, i64 %.sroa.3.0, 1
ret { ptr, i64 } %4
}
; Function Attrs: nofree nosync nounwind nonlazybind memory(read, inaccessiblemem: readwrite) uwtable
define { ptr, i64 } @position_slice_from_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
%0 = icmp eq i64 %s.1, 0
br i1 %0, label %bb4, label %bb7.i
bb7.i: ; preds = %start, %bb10.i
%i.013.i = phi i64 [ %_21.0.i, %bb10.i ], [ 0, %start ]
%_32.i1112.i = phi ptr [ %_32.i.i, %bb10.i ], [ %s.0, %start ]
%_3.i.i = load i8, ptr %_32.i1112.i, align 1, !alias.scope !9, !noalias !12, !noundef !8
%1 = icmp eq i8 %_3.i.i, 92
br i1 %1, label %bb2, label %bb10.i
bb10.i: ; preds = %bb7.i
%_32.i.i = getelementptr inbounds i8, ptr %_32.i1112.i, i64 1
%_21.0.i = add nuw i64 %i.013.i, 1
%2 = icmp eq ptr %_32.i.i, %end
br i1 %2, label %bb4, label %bb7.i
bb2: ; preds = %bb7.i
%_17.i = icmp ult i64 %i.013.i, %s.1
tail call void @llvm.assume(i1 %_17.i)
%new_len = sub nuw i64 %s.1, %i.013.i
%data = getelementptr inbounds i8, ptr %s.0, i64 %i.013.i
br label %bb4
bb4: ; preds = %bb10.i, %start, %bb2
%.sroa.3.0 = phi i64 [ %new_len, %bb2 ], [ 0, %start ], [ %s.1, %bb10.i ]
%.sroa.0.0 = phi ptr [ %data, %bb2 ], [ %s.0, %start ], [ %s.0, %bb10.i ]
%3 = insertvalue { ptr, i64 } poison, ptr %.sroa.0.0, 0
%4 = insertvalue { ptr, i64 } %3, i64 %.sroa.3.0, 1
ret { ptr, i64 } %4
}
; Function Attrs: nofree nosync nounwind nonlazybind memory(read, inaccessiblemem: readwrite) uwtable
define noundef i8 @position_index_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
%0 = icmp eq i64 %s.1, 0
br i1 %0, label %bb5, label %bb7.i
bb7.i: ; preds = %start, %bb10.i
%i.013.i = phi i64 [ %_21.0.i, %bb10.i ], [ 0, %start ]
%_32.i1112.i = phi ptr [ %_32.i.i, %bb10.i ], [ %s.0, %start ]
%_3.i.i = load i8, ptr %_32.i1112.i, align 1, !alias.scope !15, !noalias !18, !noundef !8
%1 = icmp eq i8 %_3.i.i, 92
br i1 %1, label %bb2, label %bb10.i
bb10.i: ; preds = %bb7.i
%_32.i.i = getelementptr inbounds i8, ptr %_32.i1112.i, i64 1
%_21.0.i = add nuw i64 %i.013.i, 1
%2 = icmp eq ptr %_32.i.i, %end
br i1 %2, label %bb5, label %bb7.i
bb2: ; preds = %bb7.i
%_17.i = icmp ult i64 %i.013.i, %s.1
tail call void @llvm.assume(i1 %_17.i)
%3 = getelementptr inbounds [0 x i8], ptr %s.0, i64 0, i64 %i.013.i
%4 = load i8, ptr %3, align 1, !noundef !8
br label %bb5
bb5: ; preds = %bb10.i, %start, %bb2
%.0 = phi i8 [ %4, %bb2 ], [ 42, %start ], [ 42, %bb10.i ]
ret i8 %.0
}
; Function Attrs: nofree nosync nounwind nonlazybind memory(read, inaccessiblemem: readwrite) uwtable
define { ptr, i64 } @rposition_slice_to_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
br label %bb5.i
bb5.i: ; preds = %bb7.i, %start
%self1.i10.i = phi ptr [ %end, %start ], [ %_10.i.i.i, %bb7.i ]
%i.0.i = phi i64 [ %s.1, %start ], [ %1, %bb7.i ]
%0 = icmp eq ptr %self1.i10.i, %s.0
br i1 %0, label %bb4, label %bb7.i
bb7.i: ; preds = %bb5.i
%_10.i.i.i = getelementptr inbounds i8, ptr %self1.i10.i, i64 -1
%1 = add i64 %i.0.i, -1
%_3.i.i = load i8, ptr %_10.i.i.i, align 1, !alias.scope !21, !noalias !24, !noundef !8
%2 = icmp eq i8 %_3.i.i, 92
br i1 %2, label %bb2, label %bb5.i
bb2: ; preds = %bb7.i
%_17.i = icmp ult i64 %1, %s.1
tail call void @llvm.assume(i1 %_17.i)
br label %bb4
bb4: ; preds = %bb5.i, %bb2
%.sroa.3.0 = phi i64 [ %1, %bb2 ], [ %s.1, %bb5.i ]
%3 = insertvalue { ptr, i64 } poison, ptr %s.0, 0
%4 = insertvalue { ptr, i64 } %3, i64 %.sroa.3.0, 1
ret { ptr, i64 } %4
}
; Function Attrs: nofree nosync nounwind nonlazybind memory(read, inaccessiblemem: readwrite) uwtable
define { ptr, i64 } @rposition_slice_from_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
br label %bb5.i
bb5.i: ; preds = %bb7.i, %start
%self1.i10.i = phi ptr [ %end, %start ], [ %_10.i.i.i, %bb7.i ]
%i.0.i = phi i64 [ %s.1, %start ], [ %1, %bb7.i ]
%0 = icmp eq ptr %self1.i10.i, %s.0
br i1 %0, label %bb4, label %bb7.i
bb7.i: ; preds = %bb5.i
%_10.i.i.i = getelementptr inbounds i8, ptr %self1.i10.i, i64 -1
%1 = add i64 %i.0.i, -1
%_3.i.i = load i8, ptr %_10.i.i.i, align 1, !alias.scope !27, !noalias !30, !noundef !8
%2 = icmp eq i8 %_3.i.i, 92
br i1 %2, label %bb2, label %bb5.i
bb2: ; preds = %bb7.i
%_17.i = icmp ult i64 %1, %s.1
tail call void @llvm.assume(i1 %_17.i)
%new_len = sub nuw i64 %s.1, %1
%data = getelementptr inbounds i8, ptr %s.0, i64 %1
br label %bb4
bb4: ; preds = %bb5.i, %bb2
%.sroa.3.0 = phi i64 [ %new_len, %bb2 ], [ %s.1, %bb5.i ]
%.sroa.0.0 = phi ptr [ %data, %bb2 ], [ %s.0, %bb5.i ]
%3 = insertvalue { ptr, i64 } poison, ptr %.sroa.0.0, 0
%4 = insertvalue { ptr, i64 } %3, i64 %.sroa.3.0, 1
ret { ptr, i64 } %4
}
; Function Attrs: nofree nosync nounwind nonlazybind memory(read, inaccessiblemem: readwrite) uwtable
define noundef i8 @rposition_index_no_bounds_check(ptr noalias noundef nonnull readonly align 1 %s.0, i64 noundef %s.1) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%end = getelementptr inbounds i8, ptr %s.0, i64 %s.1
br label %bb5.i
bb5.i: ; preds = %bb7.i, %start
%self1.i10.i = phi ptr [ %end, %start ], [ %_10.i.i.i, %bb7.i ]
%i.0.i = phi i64 [ %s.1, %start ], [ %1, %bb7.i ]
%0 = icmp eq ptr %self1.i10.i, %s.0
br i1 %0, label %bb5, label %bb7.i
bb7.i: ; preds = %bb5.i
%_10.i.i.i = getelementptr inbounds i8, ptr %self1.i10.i, i64 -1
%1 = add i64 %i.0.i, -1
%_3.i.i = load i8, ptr %_10.i.i.i, align 1, !alias.scope !33, !noalias !36, !noundef !8
%2 = icmp eq i8 %_3.i.i, 92
br i1 %2, label %bb2, label %bb5.i
bb2: ; preds = %bb7.i
%_17.i = icmp ult i64 %1, %s.1
tail call void @llvm.assume(i1 %_17.i)
%3 = getelementptr inbounds [0 x i8], ptr %s.0, i64 0, i64 %1
%4 = load i8, ptr %3, align 1, !noundef !8
br label %bb5
bb5: ; preds = %bb5.i, %bb2
%.0 = phi i8 [ %4, %bb2 ], [ 42, %bb5.i ]
ret i8 %.0
}
; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite)
declare void @llvm.assume(i1 noundef) #1
; Function Attrs: nonlazybind uwtable
declare noundef i32 @rust_eh_personality(i32 noundef, i32 noundef, i64 noundef, ptr noundef, ptr noundef) unnamed_addr #2
attributes #0 = { nofree nosync nounwind nonlazybind memory(read, inaccessiblemem: readwrite) uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
attributes #2 = { nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
!llvm.module.flags = !{!0, !1}
!0 = !{i32 8, !"PIC Level", i32 2}
!1 = !{i32 2, !"RtLibUseGOT", i32 1}
!2 = !{!3}
!3 = distinct !{!3, !4, !"_ZN39issue_73396_bounds_check_after_position33position_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h99f5d541eb931a50E: %b"}
!4 = distinct !{!4, !"_ZN39issue_73396_bounds_check_after_position33position_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h99f5d541eb931a50E"}
!5 = !{!6}
!6 = distinct !{!6, !7, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h014a29f14846ed19E: %self"}
!7 = distinct !{!7, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h014a29f14846ed19E"}
!8 = !{}
!9 = !{!10}
!10 = distinct !{!10, !11, !"_ZN39issue_73396_bounds_check_after_position35position_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h67ad3d0719537553E: %b"}
!11 = distinct !{!11, !"_ZN39issue_73396_bounds_check_after_position35position_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h67ad3d0719537553E"}
!12 = !{!13}
!13 = distinct !{!13, !14, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17hff5e01dff8f73f91E: %self"}
!14 = distinct !{!14, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17hff5e01dff8f73f91E"}
!15 = !{!16}
!16 = distinct !{!16, !17, !"_ZN39issue_73396_bounds_check_after_position30position_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17hd945e81644499524E: %b"}
!17 = distinct !{!17, !"_ZN39issue_73396_bounds_check_after_position30position_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17hd945e81644499524E"}
!18 = !{!19}
!19 = distinct !{!19, !20, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h29ed6b771178a12bE: %self"}
!20 = distinct !{!20, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h29ed6b771178a12bE"}
!21 = !{!22}
!22 = distinct !{!22, !23, !"_ZN39issue_73396_bounds_check_after_position34rposition_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h448d1758c85b4ea9E: %b"}
!23 = distinct !{!23, !"_ZN39issue_73396_bounds_check_after_position34rposition_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h448d1758c85b4ea9E"}
!24 = !{!25}
!25 = distinct !{!25, !26, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h5b47a5f6bb653399E: %self"}
!26 = distinct !{!26, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h5b47a5f6bb653399E"}
!27 = !{!28}
!28 = distinct !{!28, !29, !"_ZN39issue_73396_bounds_check_after_position36rposition_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h0e540b8963bdb02dE: %b"}
!29 = distinct !{!29, !"_ZN39issue_73396_bounds_check_after_position36rposition_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h0e540b8963bdb02dE"}
!30 = !{!31}
!31 = distinct !{!31, !32, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17ha10bc9d42e3742a8E: %self"}
!32 = distinct !{!32, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17ha10bc9d42e3742a8E"}
!33 = !{!34}
!34 = distinct !{!34, !35, !"_ZN39issue_73396_bounds_check_after_position31rposition_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h543c9a77d10c335dE: %b"}
!35 = distinct !{!35, !"_ZN39issue_73396_bounds_check_after_position31rposition_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h543c9a77d10c335dE"}
!36 = !{!37}
!37 = distinct !{!37, !38, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h37283fbd7bde1439E: %self"}
!38 = distinct !{!38, !"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h37283fbd7bde1439E"}
; ModuleID = 'issue_73396_bounds_check_after_position.12dbb5087cd0c66c-cgu.0'
source_filename = "issue_73396_bounds_check_after_position.12dbb5087cd0c66c-cgu.0"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
%"core::ptr::metadata::PtrRepr<[u8]>" = type { [2 x i64] }
%"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:46:42: 46:45]" = type {}
%"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:16:42: 16:45]" = type {}
%"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:31:42: 31:45]" = type {}
%"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:60:43: 60:46]" = type {}
%"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:75:43: 75:46]" = type {}
%"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:90:43: 90:46]" = type {}
@alloc_ec595fc0e82ef92fc59bd74f68296eae = private unnamed_addr constant <{ [73 x i8] }> <{ [73 x i8] c"assertion failed: 0 < pointee_size && pointee_size <= isize::MAX as usize" }>, align 1
@alloc_a9b9d27d369490c800a95967305acdd4 = private unnamed_addr constant <{ [86 x i8] }> <{ [86 x i8] c"/usr/local/google/home/mmaurer/github/rust-lang/rust/library/core/src/ptr/const_ptr.rs" }>, align 1
@alloc_de0e111772569183ce64d8c631a4a53c = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_a9b9d27d369490c800a95967305acdd4, [16 x i8] c"V\00\00\00\00\00\00\00\1D\03\00\00\09\00\00\00" }>, align 8
@alloc_0749546057a47d312f067b3c1ec35c24 = private unnamed_addr constant <{ [83 x i8] }> <{ [83 x i8] c"/usr/local/google/home/mmaurer/github/rust-lang/rust/library/core/src/slice/iter.rs" }>, align 1
@alloc_0ef4327575a2b985ccec2b4b1b800927 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_0749546057a47d312f067b3c1ec35c24, [16 x i8] c"S\00\00\00\00\00\00\00\83\00\00\00\01\00\00\00" }>, align 8
@str.0 = internal constant [28 x i8] c"attempt to add with overflow"
@alloc_6118ae478a48f0775b0377b40d9df188 = private unnamed_addr constant <{ [63 x i8] }> <{ [63 x i8] c"tests/codegen/issues/issue-73396-bounds-check-after-position.rs" }>, align 1
@alloc_3be2c4c24977a1246f0f21c86e12e13d = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_6118ae478a48f0775b0377b40d9df188, [16 x i8] c"?\00\00\00\00\00\00\00\11\00\00\00\0A\00\00\00" }>, align 8
@alloc_1aa28502097eab29d2364e0f05756451 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_6118ae478a48f0775b0377b40d9df188, [16 x i8] c"?\00\00\00\00\00\00\00 \00\00\00\0A\00\00\00" }>, align 8
@alloc_6d0dcba2cfb971c18983344891bc74d3 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_6118ae478a48f0775b0377b40d9df188, [16 x i8] c"?\00\00\00\00\00\00\00/\00\00\00\09\00\00\00" }>, align 8
@alloc_bc51fbc4dba7ecff3cbe7998b8cdf04b = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_6118ae478a48f0775b0377b40d9df188, [16 x i8] c"?\00\00\00\00\00\00\00=\00\00\00\0A\00\00\00" }>, align 8
@alloc_4ffa1e0c5f69e41cbb461912a83bf72c = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_6118ae478a48f0775b0377b40d9df188, [16 x i8] c"?\00\00\00\00\00\00\00L\00\00\00\0A\00\00\00" }>, align 8
@alloc_710ed194fbc5b9f5c247e30afb3033da = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_6118ae478a48f0775b0377b40d9df188, [16 x i8] c"?\00\00\00\00\00\00\00[\00\00\00\09\00\00\00" }>, align 8
; <core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::index
; Function Attrs: inlinehint nonlazybind uwtable
define { ptr, i64 } @"_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hcbc738f1f1169dc1E"(i64 %self.0, i64 %self.1, ptr align 1 %slice.0, i64 %slice.1, ptr align 8 %0) unnamed_addr #0 {
start:
%_22 = alloca { ptr, i64 }, align 8
%_21 = alloca %"core::ptr::metadata::PtrRepr<[u8]>", align 8
%_3 = icmp ugt i64 %self.0, %self.1
br i1 %_3, label %bb1, label %bb2
bb2: ; preds = %start
%_9 = icmp ugt i64 %self.1, %slice.1
br i1 %_9, label %bb3, label %bb4
bb1: ; preds = %start
; call core::slice::index::slice_index_order_fail
call void @_ZN4core5slice5index22slice_index_order_fail17hbb92ac81d067154bE(i64 %self.0, i64 %self.1, ptr align 8 %0) #6
unreachable
bb4: ; preds = %bb2
%new_len = sub nuw i64 %self.1, %self.0
%data = getelementptr inbounds i8, ptr %slice.0, i64 %self.0
store ptr %data, ptr %_22, align 8
%1 = getelementptr inbounds { ptr, i64 }, ptr %_22, i32 0, i32 1
store i64 %new_len, ptr %1, align 8
%2 = getelementptr inbounds { ptr, i64 }, ptr %_22, i32 0, i32 0
%3 = load ptr, ptr %2, align 8, !noundef !2
%4 = getelementptr inbounds { ptr, i64 }, ptr %_22, i32 0, i32 1
%5 = load i64, ptr %4, align 8, !noundef !2
%6 = getelementptr inbounds { ptr, i64 }, ptr %_21, i32 0, i32 0
store ptr %3, ptr %6, align 8
%7 = getelementptr inbounds { ptr, i64 }, ptr %_21, i32 0, i32 1
store i64 %5, ptr %7, align 8
%8 = getelementptr inbounds { ptr, i64 }, ptr %_21, i32 0, i32 0
%_15.0 = load ptr, ptr %8, align 8, !noundef !2
%9 = getelementptr inbounds { ptr, i64 }, ptr %_21, i32 0, i32 1
%_15.1 = load i64, ptr %9, align 8, !noundef !2
%10 = insertvalue { ptr, i64 } poison, ptr %_15.0, 0
%11 = insertvalue { ptr, i64 } %10, i64 %_15.1, 1
ret { ptr, i64 } %11
bb3: ; preds = %bb2
; call core::slice::index::slice_end_index_len_fail
call void @_ZN4core5slice5index24slice_end_index_len_fail17h80a8d89025e3e486E(i64 %self.1, i64 %slice.1, ptr align 8 %0) #6
unreachable
}
; <core::slice::iter::Iter<T> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
; Function Attrs: inlinehint nonlazybind uwtable
define align 1 ptr @"_ZN106_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h41c1c6141187c094E"(ptr align 8 %self) unnamed_addr #0 {
start:
%0 = alloca ptr, align 8
%_6 = alloca i8, align 1
%1 = alloca ptr, align 8
br i1 true, label %bb1, label %bb2
bb2: ; preds = %bb1, %start
br i1 false, label %bb3, label %bb4
bb1: ; preds = %start
%2 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self1 = load ptr, ptr %2, align 8, !noundef !2
%_17 = ptrtoint ptr %self1 to i64
%_4 = icmp eq i64 %_17, 0
%_3 = xor i1 %_4, true
call void @llvm.assume(i1 %_3)
br label %bb2
bb4: ; preds = %bb2
%self2 = load ptr, ptr %self, align 8, !nonnull !2, !noundef !2
%3 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%_13 = load ptr, ptr %3, align 8, !noundef !2
%4 = icmp eq ptr %self2, %_13
%5 = zext i1 %4 to i8
store i8 %5, ptr %_6, align 1
br label %bb5
bb3: ; preds = %bb2
%6 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self3 = load ptr, ptr %6, align 8, !noundef !2
%_8 = ptrtoint ptr %self3 to i64
%7 = icmp eq i64 %_8, 0
%8 = zext i1 %7 to i8
store i8 %8, ptr %_6, align 1
br label %bb5
bb5: ; preds = %bb3, %bb4
%9 = load i8, ptr %_6, align 1, !range !3, !noundef !2
%10 = trunc i8 %9 to i1
br i1 %10, label %bb6, label %bb7
bb7: ; preds = %bb5
%11 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self1.i = load ptr, ptr %11, align 8, !noundef !2
%_10.i = getelementptr inbounds i8, ptr %self1.i, i64 -1
%12 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
store ptr %_10.i, ptr %12, align 8
%13 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%14 = load ptr, ptr %13, align 8, !noundef !2
store ptr %14, ptr %0, align 8
%15 = load ptr, ptr %0, align 8, !noundef !2
store ptr %15, ptr %1, align 8
br label %bb9
bb6: ; preds = %bb5
store ptr null, ptr %1, align 8
br label %bb9
bb9: ; preds = %bb6, %bb7
%16 = load ptr, ptr %1, align 8, !align !4, !noundef !2
ret ptr %16
}
; <core::ops::range::RangeTo<usize> as core::slice::index::SliceIndex<[T]>>::index
; Function Attrs: inlinehint nonlazybind uwtable
define { ptr, i64 } @"_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hb8e049a278b56912E"(i64 %self, ptr align 1 %slice.0, i64 %slice.1, ptr align 8 %0) unnamed_addr #0 {
start:
%_4 = alloca { i64, i64 }, align 8
store i64 0, ptr %_4, align 8
%1 = getelementptr inbounds { i64, i64 }, ptr %_4, i32 0, i32 1
store i64 %self, ptr %1, align 8
%2 = getelementptr inbounds { i64, i64 }, ptr %_4, i32 0, i32 0
%3 = load i64, ptr %2, align 8, !noundef !2
%4 = getelementptr inbounds { i64, i64 }, ptr %_4, i32 0, i32 1
%5 = load i64, ptr %4, align 8, !noundef !2
; call <core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::index
%6 = call { ptr, i64 } @"_ZN106_$LT$core..ops..range..Range$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hcbc738f1f1169dc1E"(i64 %3, i64 %5, ptr align 1 %slice.0, i64 %slice.1, ptr align 8 %0)
%_3.0 = extractvalue { ptr, i64 } %6, 0
%_3.1 = extractvalue { ptr, i64 } %6, 1
%7 = insertvalue { ptr, i64 } poison, ptr %_3.0, 0
%8 = insertvalue { ptr, i64 } %7, i64 %_3.1, 1
ret { ptr, i64 } %8
}
; <core::ops::range::RangeFrom<usize> as core::slice::index::SliceIndex<[T]>>::index
; Function Attrs: inlinehint nonlazybind uwtable
define { ptr, i64 } @"_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h5a0dbace8eab3d1cE"(i64 %self, ptr align 1 %slice.0, i64 %slice.1, ptr align 8 %0) unnamed_addr #0 {
start:
%_18 = alloca { ptr, i64 }, align 8
%_17 = alloca %"core::ptr::metadata::PtrRepr<[u8]>", align 8
%_12 = alloca %"core::ptr::metadata::PtrRepr<[u8]>", align 8
%_3 = icmp ugt i64 %self, %slice.1
br i1 %_3, label %bb1, label %bb2
bb2: ; preds = %start
%1 = getelementptr inbounds { ptr, i64 }, ptr %_12, i32 0, i32 0
store ptr %slice.0, ptr %1, align 8
%2 = getelementptr inbounds { ptr, i64 }, ptr %_12, i32 0, i32 1
store i64 %slice.1, ptr %2, align 8
%3 = getelementptr inbounds { ptr, i64 }, ptr %_12, i32 0, i32 1
%self1 = load i64, ptr %3, align 8, !noundef !2
%new_len = sub nuw i64 %self1, %self
%data = getelementptr inbounds i8, ptr %slice.0, i64 %self
store ptr %data, ptr %_18, align 8
%4 = getelementptr inbounds { ptr, i64 }, ptr %_18, i32 0, i32 1
store i64 %new_len, ptr %4, align 8
%5 = getelementptr inbounds { ptr, i64 }, ptr %_18, i32 0, i32 0
%6 = load ptr, ptr %5, align 8, !noundef !2
%7 = getelementptr inbounds { ptr, i64 }, ptr %_18, i32 0, i32 1
%8 = load i64, ptr %7, align 8, !noundef !2
%9 = getelementptr inbounds { ptr, i64 }, ptr %_17, i32 0, i32 0
store ptr %6, ptr %9, align 8
%10 = getelementptr inbounds { ptr, i64 }, ptr %_17, i32 0, i32 1
store i64 %8, ptr %10, align 8
%11 = getelementptr inbounds { ptr, i64 }, ptr %_17, i32 0, i32 0
%_9.0 = load ptr, ptr %11, align 8, !noundef !2
%12 = getelementptr inbounds { ptr, i64 }, ptr %_17, i32 0, i32 1
%_9.1 = load i64, ptr %12, align 8, !noundef !2
%13 = insertvalue { ptr, i64 } poison, ptr %_9.0, 0
%14 = insertvalue { ptr, i64 } %13, i64 %_9.1, 1
ret { ptr, i64 } %14
bb1: ; preds = %start
; call core::slice::index::slice_start_index_len_fail
call void @_ZN4core5slice5index26slice_start_index_len_fail17hebf4c07799653c4cE(i64 %self, i64 %slice.1, ptr align 8 %0) #6
unreachable
}
; core::slice::<impl [T]>::iter
; Function Attrs: inlinehint nonlazybind uwtable
define { ptr, ptr } @"_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hc2bc82a9da745a53E"(ptr align 1 %self.0, i64 %self.1) unnamed_addr #0 {
start:
%_7 = alloca ptr, align 8
%end = alloca ptr, align 8
%0 = alloca { ptr, ptr }, align 8
br i1 false, label %bb1, label %bb2
bb2: ; preds = %start
%1 = getelementptr inbounds i8, ptr %self.0, i64 %self.1
store ptr %1, ptr %end, align 8
br label %bb3
bb1: ; preds = %start
%2 = inttoptr i64 %self.1 to ptr
store ptr %2, ptr %end, align 8
br label %bb3
bb3: ; preds = %bb1, %bb2
store ptr %self.0, ptr %_7, align 8
%_9 = load ptr, ptr %end, align 8, !noundef !2
%3 = load ptr, ptr %_7, align 8, !nonnull !2, !noundef !2
store ptr %3, ptr %0, align 8
%4 = getelementptr inbounds { ptr, ptr }, ptr %0, i32 0, i32 1
store ptr %_9, ptr %4, align 8
%5 = getelementptr inbounds { ptr, ptr }, ptr %0, i32 0, i32 0
%6 = load ptr, ptr %5, align 8, !nonnull !2, !noundef !2
%7 = getelementptr inbounds { ptr, ptr }, ptr %0, i32 0, i32 1
%8 = load ptr, ptr %7, align 8, !noundef !2
%9 = insertvalue { ptr, ptr } poison, ptr %6, 0
%10 = insertvalue { ptr, ptr } %9, ptr %8, 1
ret { ptr, ptr } %10
}
; core::slice::index::<impl core::ops::index::Index<I> for [T]>::index
; Function Attrs: inlinehint nonlazybind uwtable
define { ptr, i64 } @"_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h66a3bc8ab0c1335cE"(ptr align 1 %self.0, i64 %self.1, i64 %index, ptr align 8 %0) unnamed_addr #0 {
start:
; call <core::ops::range::RangeTo<usize> as core::slice::index::SliceIndex<[T]>>::index
%1 = call { ptr, i64 } @"_ZN108_$LT$core..ops..range..RangeTo$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17hb8e049a278b56912E"(i64 %index, ptr align 1 %self.0, i64 %self.1, ptr align 8 %0)
%_3.0 = extractvalue { ptr, i64 } %1, 0
%_3.1 = extractvalue { ptr, i64 } %1, 1
%2 = insertvalue { ptr, i64 } poison, ptr %_3.0, 0
%3 = insertvalue { ptr, i64 } %2, i64 %_3.1, 1
ret { ptr, i64 } %3
}
; core::slice::index::<impl core::ops::index::Index<I> for [T]>::index
; Function Attrs: inlinehint nonlazybind uwtable
define { ptr, i64 } @"_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17hf11adc2032126944E"(ptr align 1 %self.0, i64 %self.1, i64 %index, ptr align 8 %0) unnamed_addr #0 {
start:
; call <core::ops::range::RangeFrom<usize> as core::slice::index::SliceIndex<[T]>>::index
%1 = call { ptr, i64 } @"_ZN110_$LT$core..ops..range..RangeFrom$LT$usize$GT$$u20$as$u20$core..slice..index..SliceIndex$LT$$u5b$T$u5d$$GT$$GT$5index17h5a0dbace8eab3d1cE"(i64 %index, ptr align 1 %self.0, i64 %self.1, ptr align 8 %0)
%_3.0 = extractvalue { ptr, i64 } %1, 0
%_3.1 = extractvalue { ptr, i64 } %1, 1
%2 = insertvalue { ptr, i64 } poison, ptr %_3.0, 0
%3 = insertvalue { ptr, i64 } %2, i64 %_3.1, 1
ret { ptr, i64 } %3
}
; <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next
; Function Attrs: inlinehint nonlazybind uwtable
define align 1 ptr @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17ha3ea26ba16b609e4E"(ptr align 8 %self) unnamed_addr #0 {
start:
%_28 = alloca ptr, align 8
%_6 = alloca i8, align 1
%0 = alloca ptr, align 8
br i1 true, label %bb1, label %bb2
bb2: ; preds = %bb1, %start
br i1 false, label %bb3, label %bb4
bb1: ; preds = %start
%1 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self1 = load ptr, ptr %1, align 8, !noundef !2
%_17 = ptrtoint ptr %self1 to i64
%_4 = icmp eq i64 %_17, 0
%_3 = xor i1 %_4, true
call void @llvm.assume(i1 %_3)
br label %bb2
bb4: ; preds = %bb2
%self2 = load ptr, ptr %self, align 8, !nonnull !2, !noundef !2
%2 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%_13 = load ptr, ptr %2, align 8, !noundef !2
%3 = icmp eq ptr %self2, %_13
%4 = zext i1 %3 to i8
store i8 %4, ptr %_6, align 1
br label %bb5
bb3: ; preds = %bb2
%5 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self3 = load ptr, ptr %5, align 8, !noundef !2
%_8 = ptrtoint ptr %self3 to i64
%6 = icmp eq i64 %_8, 0
%7 = zext i1 %6 to i8
store i8 %7, ptr %_6, align 1
br label %bb5
bb5: ; preds = %bb3, %bb4
%8 = load i8, ptr %_6, align 1, !range !3, !noundef !2
%9 = trunc i8 %8 to i1
br i1 %9, label %bb6, label %bb7
bb7: ; preds = %bb5
%old = load ptr, ptr %self, align 8, !nonnull !2, !noundef !2
br i1 false, label %bb9, label %bb10
bb6: ; preds = %bb5
store ptr null, ptr %0, align 8
br label %bb8
bb10: ; preds = %bb7
%self4 = load ptr, ptr %self, align 8, !nonnull !2, !noundef !2
%_32 = getelementptr inbounds i8, ptr %self4, i64 1
store ptr %_32, ptr %_28, align 8
%10 = load ptr, ptr %_28, align 8, !nonnull !2, !noundef !2
store ptr %10, ptr %self, align 8
br label %bb11
bb9: ; preds = %bb7
%11 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self5 = load ptr, ptr %11, align 8, !noundef !2
%_25 = ptrtoint ptr %self5 to i64
%new_len = sub i64 %_25, 1
%_27 = inttoptr i64 %new_len to ptr
%12 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
store ptr %_27, ptr %12, align 8
br label %bb11
bb11: ; preds = %bb9, %bb10
store ptr %old, ptr %0, align 8
br label %bb8
bb8: ; preds = %bb6, %bb11
%13 = load ptr, ptr %0, align 8, !align !4, !noundef !2
ret ptr %13
}
; <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::position
; Function Attrs: inlinehint nonlazybind uwtable
define { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h8533e6dc674a7121E"(ptr align 8 %self) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%0 = alloca { ptr, i32 }, align 8
%_26 = alloca i8, align 1
%_16 = alloca ptr, align 8
%_11 = alloca ptr, align 8
%i = alloca i64, align 8
%n = alloca i64, align 8
%1 = alloca { i64, i64 }, align 8
%predicate = alloca %"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:46:42: 46:45]", align 1
br i1 false, label %bb1, label %bb2
bb2: ; preds = %start
%2 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self1 = load ptr, ptr %2, align 8, !noundef !2
%self2 = load ptr, ptr %self, align 8, !nonnull !2, !noundef !2
br i1 true, label %bb17, label %bb16
bb1: ; preds = %start
%3 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self3 = load ptr, ptr %3, align 8, !noundef !2
%4 = ptrtoint ptr %self3 to i64
store i64 %4, ptr %n, align 8
br label %bb4
bb16: ; preds = %bb2
store i8 0, ptr %_26, align 1
br label %bb18
bb17: ; preds = %bb2
store i8 1, ptr %_26, align 1
br label %bb18
bb18: ; preds = %bb17, %bb16
%5 = load i8, ptr %_26, align 1, !range !3, !noundef !2
%6 = trunc i8 %5 to i1
%_25 = xor i1 %6, true
br i1 %_25, label %bb19, label %bb20
bb20: ; preds = %bb18
%7 = ptrtoint ptr %self1 to i64
%8 = ptrtoint ptr %self2 to i64
%9 = sub nuw i64 %7, %8
%10 = udiv exact i64 %9, 1
store i64 %10, ptr %n, align 8
br label %bb4
bb19: ; preds = %bb18
; invoke core::panicking::panic
invoke void @_ZN4core9panicking5panic17h0c30414c03dbaa75E(ptr align 1 @alloc_ec595fc0e82ef92fc59bd74f68296eae, i64 73, ptr align 8 @alloc_de0e111772569183ce64d8c631a4a53c) #6
to label %unreachable unwind label %cleanup
bb4: ; preds = %bb1, %bb20
store i64 0, ptr %i, align 8
br label %bb5
bb14: ; preds = %cleanup
%11 = load ptr, ptr %0, align 8, !noundef !2
%12 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
%13 = load i32, ptr %12, align 8, !noundef !2
%14 = insertvalue { ptr, i32 } poison, ptr %11, 0
%15 = insertvalue { ptr, i32 } %14, i32 %13, 1
resume { ptr, i32 } %15
cleanup: ; preds = %panic, %bb7, %bb5, %bb19
%16 = landingpad { ptr, i32 }
cleanup
%17 = extractvalue { ptr, i32 } %16, 0
%18 = extractvalue { ptr, i32 } %16, 1
%19 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 0
store ptr %17, ptr %19, align 8
%20 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
store i32 %18, ptr %20, align 8
br label %bb14
unreachable: ; preds = %panic, %bb19
unreachable
bb5: ; preds = %bb11, %bb4
; invoke <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next
%21 = invoke align 1 ptr @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17ha3ea26ba16b609e4E"(ptr align 8 %self)
to label %bb6 unwind label %cleanup
bb6: ; preds = %bb5
store ptr %21, ptr %_11, align 8
%22 = load ptr, ptr %_11, align 8, !noundef !2
%23 = ptrtoint ptr %22 to i64
%24 = icmp eq i64 %23, 0
%_12 = select i1 %24, i64 0, i64 1
%25 = icmp eq i64 %_12, 1
br i1 %25, label %bb7, label %bb12
bb7: ; preds = %bb6
%x = load ptr, ptr %_11, align 8, !nonnull !2, !align !4, !noundef !2
store ptr %x, ptr %_16, align 8
%26 = load ptr, ptr %_16, align 8, !nonnull !2, !align !4, !noundef !2
; invoke issue_73396_bounds_check_after_position::position_index_no_bounds_check::{{closure}}
%_14 = invoke zeroext i1 @"_ZN39issue_73396_bounds_check_after_position30position_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h4c285c223db8e52aE"(ptr align 1 %predicate, ptr align 1 %26)
to label %bb8 unwind label %cleanup
bb12: ; preds = %bb6
store i64 0, ptr %1, align 8
br label %bb13
bb8: ; preds = %bb7
br i1 %_14, label %bb9, label %bb10
bb10: ; preds = %bb8
%27 = load i64, ptr %i, align 8, !noundef !2
%28 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %27, i64 1)
%_21.0 = extractvalue { i64, i1 } %28, 0
%_21.1 = extractvalue { i64, i1 } %28, 1
%29 = call i1 @llvm.expect.i1(i1 %_21.1, i1 false)
br i1 %29, label %panic, label %bb11
bb9: ; preds = %bb8
%_18 = load i64, ptr %i, align 8, !noundef !2
%_19 = load i64, ptr %n, align 8, !noundef !2
%_17 = icmp ult i64 %_18, %_19
call void @llvm.assume(i1 %_17)
%_20 = load i64, ptr %i, align 8, !noundef !2
%30 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
store i64 %_20, ptr %30, align 8
store i64 1, ptr %1, align 8
br label %bb13
bb11: ; preds = %bb10
store i64 %_21.0, ptr %i, align 8
br label %bb5
panic: ; preds = %bb10
; invoke core::panicking::panic
invoke void @_ZN4core9panicking5panic17h0c30414c03dbaa75E(ptr align 1 @str.0, i64 28, ptr align 8 @alloc_0ef4327575a2b985ccec2b4b1b800927) #6
to label %unreachable unwind label %cleanup
bb13: ; preds = %bb12, %bb9
%31 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 0
%32 = load i64, ptr %31, align 8, !range !5, !noundef !2
%33 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
%34 = load i64, ptr %33, align 8
%35 = insertvalue { i64, i64 } poison, i64 %32, 0
%36 = insertvalue { i64, i64 } %35, i64 %34, 1
ret { i64, i64 } %36
}
; <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::position
; Function Attrs: inlinehint nonlazybind uwtable
define { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17had4e29db686da3c3E"(ptr align 8 %self) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%0 = alloca { ptr, i32 }, align 8
%_26 = alloca i8, align 1
%_16 = alloca ptr, align 8
%_11 = alloca ptr, align 8
%i = alloca i64, align 8
%n = alloca i64, align 8
%1 = alloca { i64, i64 }, align 8
%predicate = alloca %"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:16:42: 16:45]", align 1
br i1 false, label %bb1, label %bb2
bb2: ; preds = %start
%2 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self1 = load ptr, ptr %2, align 8, !noundef !2
%self2 = load ptr, ptr %self, align 8, !nonnull !2, !noundef !2
br i1 true, label %bb17, label %bb16
bb1: ; preds = %start
%3 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self3 = load ptr, ptr %3, align 8, !noundef !2
%4 = ptrtoint ptr %self3 to i64
store i64 %4, ptr %n, align 8
br label %bb4
bb16: ; preds = %bb2
store i8 0, ptr %_26, align 1
br label %bb18
bb17: ; preds = %bb2
store i8 1, ptr %_26, align 1
br label %bb18
bb18: ; preds = %bb17, %bb16
%5 = load i8, ptr %_26, align 1, !range !3, !noundef !2
%6 = trunc i8 %5 to i1
%_25 = xor i1 %6, true
br i1 %_25, label %bb19, label %bb20
bb20: ; preds = %bb18
%7 = ptrtoint ptr %self1 to i64
%8 = ptrtoint ptr %self2 to i64
%9 = sub nuw i64 %7, %8
%10 = udiv exact i64 %9, 1
store i64 %10, ptr %n, align 8
br label %bb4
bb19: ; preds = %bb18
; invoke core::panicking::panic
invoke void @_ZN4core9panicking5panic17h0c30414c03dbaa75E(ptr align 1 @alloc_ec595fc0e82ef92fc59bd74f68296eae, i64 73, ptr align 8 @alloc_de0e111772569183ce64d8c631a4a53c) #6
to label %unreachable unwind label %cleanup
bb4: ; preds = %bb1, %bb20
store i64 0, ptr %i, align 8
br label %bb5
bb14: ; preds = %cleanup
%11 = load ptr, ptr %0, align 8, !noundef !2
%12 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
%13 = load i32, ptr %12, align 8, !noundef !2
%14 = insertvalue { ptr, i32 } poison, ptr %11, 0
%15 = insertvalue { ptr, i32 } %14, i32 %13, 1
resume { ptr, i32 } %15
cleanup: ; preds = %panic, %bb7, %bb5, %bb19
%16 = landingpad { ptr, i32 }
cleanup
%17 = extractvalue { ptr, i32 } %16, 0
%18 = extractvalue { ptr, i32 } %16, 1
%19 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 0
store ptr %17, ptr %19, align 8
%20 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
store i32 %18, ptr %20, align 8
br label %bb14
unreachable: ; preds = %panic, %bb19
unreachable
bb5: ; preds = %bb11, %bb4
; invoke <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next
%21 = invoke align 1 ptr @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17ha3ea26ba16b609e4E"(ptr align 8 %self)
to label %bb6 unwind label %cleanup
bb6: ; preds = %bb5
store ptr %21, ptr %_11, align 8
%22 = load ptr, ptr %_11, align 8, !noundef !2
%23 = ptrtoint ptr %22 to i64
%24 = icmp eq i64 %23, 0
%_12 = select i1 %24, i64 0, i64 1
%25 = icmp eq i64 %_12, 1
br i1 %25, label %bb7, label %bb12
bb7: ; preds = %bb6
%x = load ptr, ptr %_11, align 8, !nonnull !2, !align !4, !noundef !2
store ptr %x, ptr %_16, align 8
%26 = load ptr, ptr %_16, align 8, !nonnull !2, !align !4, !noundef !2
; invoke issue_73396_bounds_check_after_position::position_slice_to_no_bounds_check::{{closure}}
%_14 = invoke zeroext i1 @"_ZN39issue_73396_bounds_check_after_position33position_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h4684d6c4f2db2c2eE"(ptr align 1 %predicate, ptr align 1 %26)
to label %bb8 unwind label %cleanup
bb12: ; preds = %bb6
store i64 0, ptr %1, align 8
br label %bb13
bb8: ; preds = %bb7
br i1 %_14, label %bb9, label %bb10
bb10: ; preds = %bb8
%27 = load i64, ptr %i, align 8, !noundef !2
%28 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %27, i64 1)
%_21.0 = extractvalue { i64, i1 } %28, 0
%_21.1 = extractvalue { i64, i1 } %28, 1
%29 = call i1 @llvm.expect.i1(i1 %_21.1, i1 false)
br i1 %29, label %panic, label %bb11
bb9: ; preds = %bb8
%_18 = load i64, ptr %i, align 8, !noundef !2
%_19 = load i64, ptr %n, align 8, !noundef !2
%_17 = icmp ult i64 %_18, %_19
call void @llvm.assume(i1 %_17)
%_20 = load i64, ptr %i, align 8, !noundef !2
%30 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
store i64 %_20, ptr %30, align 8
store i64 1, ptr %1, align 8
br label %bb13
bb11: ; preds = %bb10
store i64 %_21.0, ptr %i, align 8
br label %bb5
panic: ; preds = %bb10
; invoke core::panicking::panic
invoke void @_ZN4core9panicking5panic17h0c30414c03dbaa75E(ptr align 1 @str.0, i64 28, ptr align 8 @alloc_0ef4327575a2b985ccec2b4b1b800927) #6
to label %unreachable unwind label %cleanup
bb13: ; preds = %bb12, %bb9
%31 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 0
%32 = load i64, ptr %31, align 8, !range !5, !noundef !2
%33 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
%34 = load i64, ptr %33, align 8
%35 = insertvalue { i64, i64 } poison, i64 %32, 0
%36 = insertvalue { i64, i64 } %35, i64 %34, 1
ret { i64, i64 } %36
}
; <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::position
; Function Attrs: inlinehint nonlazybind uwtable
define { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17he231b42fb8f32e16E"(ptr align 8 %self) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%0 = alloca { ptr, i32 }, align 8
%_26 = alloca i8, align 1
%_16 = alloca ptr, align 8
%_11 = alloca ptr, align 8
%i = alloca i64, align 8
%n = alloca i64, align 8
%1 = alloca { i64, i64 }, align 8
%predicate = alloca %"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:31:42: 31:45]", align 1
br i1 false, label %bb1, label %bb2
bb2: ; preds = %start
%2 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self1 = load ptr, ptr %2, align 8, !noundef !2
%self2 = load ptr, ptr %self, align 8, !nonnull !2, !noundef !2
br i1 true, label %bb17, label %bb16
bb1: ; preds = %start
%3 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self3 = load ptr, ptr %3, align 8, !noundef !2
%4 = ptrtoint ptr %self3 to i64
store i64 %4, ptr %n, align 8
br label %bb4
bb16: ; preds = %bb2
store i8 0, ptr %_26, align 1
br label %bb18
bb17: ; preds = %bb2
store i8 1, ptr %_26, align 1
br label %bb18
bb18: ; preds = %bb17, %bb16
%5 = load i8, ptr %_26, align 1, !range !3, !noundef !2
%6 = trunc i8 %5 to i1
%_25 = xor i1 %6, true
br i1 %_25, label %bb19, label %bb20
bb20: ; preds = %bb18
%7 = ptrtoint ptr %self1 to i64
%8 = ptrtoint ptr %self2 to i64
%9 = sub nuw i64 %7, %8
%10 = udiv exact i64 %9, 1
store i64 %10, ptr %n, align 8
br label %bb4
bb19: ; preds = %bb18
; invoke core::panicking::panic
invoke void @_ZN4core9panicking5panic17h0c30414c03dbaa75E(ptr align 1 @alloc_ec595fc0e82ef92fc59bd74f68296eae, i64 73, ptr align 8 @alloc_de0e111772569183ce64d8c631a4a53c) #6
to label %unreachable unwind label %cleanup
bb4: ; preds = %bb1, %bb20
store i64 0, ptr %i, align 8
br label %bb5
bb14: ; preds = %cleanup
%11 = load ptr, ptr %0, align 8, !noundef !2
%12 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
%13 = load i32, ptr %12, align 8, !noundef !2
%14 = insertvalue { ptr, i32 } poison, ptr %11, 0
%15 = insertvalue { ptr, i32 } %14, i32 %13, 1
resume { ptr, i32 } %15
cleanup: ; preds = %panic, %bb7, %bb5, %bb19
%16 = landingpad { ptr, i32 }
cleanup
%17 = extractvalue { ptr, i32 } %16, 0
%18 = extractvalue { ptr, i32 } %16, 1
%19 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 0
store ptr %17, ptr %19, align 8
%20 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
store i32 %18, ptr %20, align 8
br label %bb14
unreachable: ; preds = %panic, %bb19
unreachable
bb5: ; preds = %bb11, %bb4
; invoke <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next
%21 = invoke align 1 ptr @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17ha3ea26ba16b609e4E"(ptr align 8 %self)
to label %bb6 unwind label %cleanup
bb6: ; preds = %bb5
store ptr %21, ptr %_11, align 8
%22 = load ptr, ptr %_11, align 8, !noundef !2
%23 = ptrtoint ptr %22 to i64
%24 = icmp eq i64 %23, 0
%_12 = select i1 %24, i64 0, i64 1
%25 = icmp eq i64 %_12, 1
br i1 %25, label %bb7, label %bb12
bb7: ; preds = %bb6
%x = load ptr, ptr %_11, align 8, !nonnull !2, !align !4, !noundef !2
store ptr %x, ptr %_16, align 8
%26 = load ptr, ptr %_16, align 8, !nonnull !2, !align !4, !noundef !2
; invoke issue_73396_bounds_check_after_position::position_slice_from_no_bounds_check::{{closure}}
%_14 = invoke zeroext i1 @"_ZN39issue_73396_bounds_check_after_position35position_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h33ac7926901bfdabE"(ptr align 1 %predicate, ptr align 1 %26)
to label %bb8 unwind label %cleanup
bb12: ; preds = %bb6
store i64 0, ptr %1, align 8
br label %bb13
bb8: ; preds = %bb7
br i1 %_14, label %bb9, label %bb10
bb10: ; preds = %bb8
%27 = load i64, ptr %i, align 8, !noundef !2
%28 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %27, i64 1)
%_21.0 = extractvalue { i64, i1 } %28, 0
%_21.1 = extractvalue { i64, i1 } %28, 1
%29 = call i1 @llvm.expect.i1(i1 %_21.1, i1 false)
br i1 %29, label %panic, label %bb11
bb9: ; preds = %bb8
%_18 = load i64, ptr %i, align 8, !noundef !2
%_19 = load i64, ptr %n, align 8, !noundef !2
%_17 = icmp ult i64 %_18, %_19
call void @llvm.assume(i1 %_17)
%_20 = load i64, ptr %i, align 8, !noundef !2
%30 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
store i64 %_20, ptr %30, align 8
store i64 1, ptr %1, align 8
br label %bb13
bb11: ; preds = %bb10
store i64 %_21.0, ptr %i, align 8
br label %bb5
panic: ; preds = %bb10
; invoke core::panicking::panic
invoke void @_ZN4core9panicking5panic17h0c30414c03dbaa75E(ptr align 1 @str.0, i64 28, ptr align 8 @alloc_0ef4327575a2b985ccec2b4b1b800927) #6
to label %unreachable unwind label %cleanup
bb13: ; preds = %bb12, %bb9
%31 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 0
%32 = load i64, ptr %31, align 8, !range !5, !noundef !2
%33 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
%34 = load i64, ptr %33, align 8
%35 = insertvalue { i64, i64 } poison, i64 %32, 0
%36 = insertvalue { i64, i64 } %35, i64 %34, 1
ret { i64, i64 } %36
}
; <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::rposition
; Function Attrs: inlinehint nonlazybind uwtable
define { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h07494362af3538e8E"(ptr align 8 %self) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%0 = alloca { ptr, i32 }, align 8
%_25 = alloca i8, align 1
%_16 = alloca ptr, align 8
%_11 = alloca ptr, align 8
%i = alloca i64, align 8
%n = alloca i64, align 8
%1 = alloca { i64, i64 }, align 8
%predicate = alloca %"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:60:43: 60:46]", align 1
br i1 false, label %bb1, label %bb2
bb2: ; preds = %start
%2 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self1 = load ptr, ptr %2, align 8, !noundef !2
%self2 = load ptr, ptr %self, align 8, !nonnull !2, !noundef !2
br i1 true, label %bb17, label %bb16
bb1: ; preds = %start
%3 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self3 = load ptr, ptr %3, align 8, !noundef !2
%4 = ptrtoint ptr %self3 to i64
store i64 %4, ptr %n, align 8
br label %bb4
bb16: ; preds = %bb2
store i8 0, ptr %_25, align 1
br label %bb18
bb17: ; preds = %bb2
store i8 1, ptr %_25, align 1
br label %bb18
bb18: ; preds = %bb17, %bb16
%5 = load i8, ptr %_25, align 1, !range !3, !noundef !2
%6 = trunc i8 %5 to i1
%_24 = xor i1 %6, true
br i1 %_24, label %bb19, label %bb20
bb20: ; preds = %bb18
%7 = ptrtoint ptr %self1 to i64
%8 = ptrtoint ptr %self2 to i64
%9 = sub nuw i64 %7, %8
%10 = udiv exact i64 %9, 1
store i64 %10, ptr %n, align 8
br label %bb4
bb19: ; preds = %bb18
; invoke core::panicking::panic
invoke void @_ZN4core9panicking5panic17h0c30414c03dbaa75E(ptr align 1 @alloc_ec595fc0e82ef92fc59bd74f68296eae, i64 73, ptr align 8 @alloc_de0e111772569183ce64d8c631a4a53c) #6
to label %unreachable unwind label %cleanup
bb4: ; preds = %bb1, %bb20
%11 = load i64, ptr %n, align 8, !noundef !2
store i64 %11, ptr %i, align 8
br label %bb5
bb14: ; preds = %cleanup
%12 = load ptr, ptr %0, align 8, !noundef !2
%13 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
%14 = load i32, ptr %13, align 8, !noundef !2
%15 = insertvalue { ptr, i32 } poison, ptr %12, 0
%16 = insertvalue { ptr, i32 } %15, i32 %14, 1
resume { ptr, i32 } %16
cleanup: ; preds = %bb7, %bb5, %bb19
%17 = landingpad { ptr, i32 }
cleanup
%18 = extractvalue { ptr, i32 } %17, 0
%19 = extractvalue { ptr, i32 } %17, 1
%20 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 0
store ptr %18, ptr %20, align 8
%21 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
store i32 %19, ptr %21, align 8
br label %bb14
unreachable: ; preds = %bb19
unreachable
bb5: ; preds = %bb10, %bb4
; invoke <core::slice::iter::Iter<T> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
%22 = invoke align 1 ptr @"_ZN106_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h41c1c6141187c094E"(ptr align 8 %self)
to label %bb6 unwind label %cleanup
bb6: ; preds = %bb5
store ptr %22, ptr %_11, align 8
%23 = load ptr, ptr %_11, align 8, !noundef !2
%24 = ptrtoint ptr %23 to i64
%25 = icmp eq i64 %24, 0
%_12 = select i1 %25, i64 0, i64 1
%26 = icmp eq i64 %_12, 1
br i1 %26, label %bb7, label %bb11
bb7: ; preds = %bb6
%x = load ptr, ptr %_11, align 8, !nonnull !2, !align !4, !noundef !2
%27 = load i64, ptr %i, align 8, !noundef !2
%28 = sub i64 %27, 1
store i64 %28, ptr %i, align 8
store ptr %x, ptr %_16, align 8
%29 = load ptr, ptr %_16, align 8, !nonnull !2, !align !4, !noundef !2
; invoke issue_73396_bounds_check_after_position::rposition_slice_to_no_bounds_check::{{closure}}
%_14 = invoke zeroext i1 @"_ZN39issue_73396_bounds_check_after_position34rposition_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17hc8d3489862ffcefeE"(ptr align 1 %predicate, ptr align 1 %29)
to label %bb8 unwind label %cleanup
bb11: ; preds = %bb6
br label %bb12
bb8: ; preds = %bb7
br i1 %_14, label %bb9, label %bb10
bb10: ; preds = %bb8
br label %bb5
bb9: ; preds = %bb8
%_18 = load i64, ptr %i, align 8, !noundef !2
%_19 = load i64, ptr %n, align 8, !noundef !2
%_17 = icmp ult i64 %_18, %_19
call void @llvm.assume(i1 %_17)
%_20 = load i64, ptr %i, align 8, !noundef !2
%30 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
store i64 %_20, ptr %30, align 8
store i64 1, ptr %1, align 8
br label %bb13
bb13: ; preds = %bb12, %bb9
%31 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 0
%32 = load i64, ptr %31, align 8, !range !5, !noundef !2
%33 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
%34 = load i64, ptr %33, align 8
%35 = insertvalue { i64, i64 } poison, i64 %32, 0
%36 = insertvalue { i64, i64 } %35, i64 %34, 1
ret { i64, i64 } %36
bb12: ; preds = %bb11
store i64 0, ptr %1, align 8
br label %bb13
}
; <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::rposition
; Function Attrs: inlinehint nonlazybind uwtable
define { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h4635c5af17f83fa7E"(ptr align 8 %self) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%0 = alloca { ptr, i32 }, align 8
%_25 = alloca i8, align 1
%_16 = alloca ptr, align 8
%_11 = alloca ptr, align 8
%i = alloca i64, align 8
%n = alloca i64, align 8
%1 = alloca { i64, i64 }, align 8
%predicate = alloca %"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:75:43: 75:46]", align 1
br i1 false, label %bb1, label %bb2
bb2: ; preds = %start
%2 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self1 = load ptr, ptr %2, align 8, !noundef !2
%self2 = load ptr, ptr %self, align 8, !nonnull !2, !noundef !2
br i1 true, label %bb17, label %bb16
bb1: ; preds = %start
%3 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self3 = load ptr, ptr %3, align 8, !noundef !2
%4 = ptrtoint ptr %self3 to i64
store i64 %4, ptr %n, align 8
br label %bb4
bb16: ; preds = %bb2
store i8 0, ptr %_25, align 1
br label %bb18
bb17: ; preds = %bb2
store i8 1, ptr %_25, align 1
br label %bb18
bb18: ; preds = %bb17, %bb16
%5 = load i8, ptr %_25, align 1, !range !3, !noundef !2
%6 = trunc i8 %5 to i1
%_24 = xor i1 %6, true
br i1 %_24, label %bb19, label %bb20
bb20: ; preds = %bb18
%7 = ptrtoint ptr %self1 to i64
%8 = ptrtoint ptr %self2 to i64
%9 = sub nuw i64 %7, %8
%10 = udiv exact i64 %9, 1
store i64 %10, ptr %n, align 8
br label %bb4
bb19: ; preds = %bb18
; invoke core::panicking::panic
invoke void @_ZN4core9panicking5panic17h0c30414c03dbaa75E(ptr align 1 @alloc_ec595fc0e82ef92fc59bd74f68296eae, i64 73, ptr align 8 @alloc_de0e111772569183ce64d8c631a4a53c) #6
to label %unreachable unwind label %cleanup
bb4: ; preds = %bb1, %bb20
%11 = load i64, ptr %n, align 8, !noundef !2
store i64 %11, ptr %i, align 8
br label %bb5
bb14: ; preds = %cleanup
%12 = load ptr, ptr %0, align 8, !noundef !2
%13 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
%14 = load i32, ptr %13, align 8, !noundef !2
%15 = insertvalue { ptr, i32 } poison, ptr %12, 0
%16 = insertvalue { ptr, i32 } %15, i32 %14, 1
resume { ptr, i32 } %16
cleanup: ; preds = %bb7, %bb5, %bb19
%17 = landingpad { ptr, i32 }
cleanup
%18 = extractvalue { ptr, i32 } %17, 0
%19 = extractvalue { ptr, i32 } %17, 1
%20 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 0
store ptr %18, ptr %20, align 8
%21 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
store i32 %19, ptr %21, align 8
br label %bb14
unreachable: ; preds = %bb19
unreachable
bb5: ; preds = %bb10, %bb4
; invoke <core::slice::iter::Iter<T> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
%22 = invoke align 1 ptr @"_ZN106_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h41c1c6141187c094E"(ptr align 8 %self)
to label %bb6 unwind label %cleanup
bb6: ; preds = %bb5
store ptr %22, ptr %_11, align 8
%23 = load ptr, ptr %_11, align 8, !noundef !2
%24 = ptrtoint ptr %23 to i64
%25 = icmp eq i64 %24, 0
%_12 = select i1 %25, i64 0, i64 1
%26 = icmp eq i64 %_12, 1
br i1 %26, label %bb7, label %bb11
bb7: ; preds = %bb6
%x = load ptr, ptr %_11, align 8, !nonnull !2, !align !4, !noundef !2
%27 = load i64, ptr %i, align 8, !noundef !2
%28 = sub i64 %27, 1
store i64 %28, ptr %i, align 8
store ptr %x, ptr %_16, align 8
%29 = load ptr, ptr %_16, align 8, !nonnull !2, !align !4, !noundef !2
; invoke issue_73396_bounds_check_after_position::rposition_slice_from_no_bounds_check::{{closure}}
%_14 = invoke zeroext i1 @"_ZN39issue_73396_bounds_check_after_position36rposition_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h7296da868918d0daE"(ptr align 1 %predicate, ptr align 1 %29)
to label %bb8 unwind label %cleanup
bb11: ; preds = %bb6
br label %bb12
bb8: ; preds = %bb7
br i1 %_14, label %bb9, label %bb10
bb10: ; preds = %bb8
br label %bb5
bb9: ; preds = %bb8
%_18 = load i64, ptr %i, align 8, !noundef !2
%_19 = load i64, ptr %n, align 8, !noundef !2
%_17 = icmp ult i64 %_18, %_19
call void @llvm.assume(i1 %_17)
%_20 = load i64, ptr %i, align 8, !noundef !2
%30 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
store i64 %_20, ptr %30, align 8
store i64 1, ptr %1, align 8
br label %bb13
bb13: ; preds = %bb12, %bb9
%31 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 0
%32 = load i64, ptr %31, align 8, !range !5, !noundef !2
%33 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
%34 = load i64, ptr %33, align 8
%35 = insertvalue { i64, i64 } poison, i64 %32, 0
%36 = insertvalue { i64, i64 } %35, i64 %34, 1
ret { i64, i64 } %36
bb12: ; preds = %bb11
store i64 0, ptr %1, align 8
br label %bb13
}
; <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::rposition
; Function Attrs: inlinehint nonlazybind uwtable
define { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h5db3b3c3f65ee4c2E"(ptr align 8 %self) unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%0 = alloca { ptr, i32 }, align 8
%_25 = alloca i8, align 1
%_16 = alloca ptr, align 8
%_11 = alloca ptr, align 8
%i = alloca i64, align 8
%n = alloca i64, align 8
%1 = alloca { i64, i64 }, align 8
%predicate = alloca %"[closure@tests/codegen/issues/issue-73396-bounds-check-after-position.rs:90:43: 90:46]", align 1
br i1 false, label %bb1, label %bb2
bb2: ; preds = %start
%2 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self1 = load ptr, ptr %2, align 8, !noundef !2
%self2 = load ptr, ptr %self, align 8, !nonnull !2, !noundef !2
br i1 true, label %bb17, label %bb16
bb1: ; preds = %start
%3 = getelementptr inbounds { ptr, ptr }, ptr %self, i32 0, i32 1
%self3 = load ptr, ptr %3, align 8, !noundef !2
%4 = ptrtoint ptr %self3 to i64
store i64 %4, ptr %n, align 8
br label %bb4
bb16: ; preds = %bb2
store i8 0, ptr %_25, align 1
br label %bb18
bb17: ; preds = %bb2
store i8 1, ptr %_25, align 1
br label %bb18
bb18: ; preds = %bb17, %bb16
%5 = load i8, ptr %_25, align 1, !range !3, !noundef !2
%6 = trunc i8 %5 to i1
%_24 = xor i1 %6, true
br i1 %_24, label %bb19, label %bb20
bb20: ; preds = %bb18
%7 = ptrtoint ptr %self1 to i64
%8 = ptrtoint ptr %self2 to i64
%9 = sub nuw i64 %7, %8
%10 = udiv exact i64 %9, 1
store i64 %10, ptr %n, align 8
br label %bb4
bb19: ; preds = %bb18
; invoke core::panicking::panic
invoke void @_ZN4core9panicking5panic17h0c30414c03dbaa75E(ptr align 1 @alloc_ec595fc0e82ef92fc59bd74f68296eae, i64 73, ptr align 8 @alloc_de0e111772569183ce64d8c631a4a53c) #6
to label %unreachable unwind label %cleanup
bb4: ; preds = %bb1, %bb20
%11 = load i64, ptr %n, align 8, !noundef !2
store i64 %11, ptr %i, align 8
br label %bb5
bb14: ; preds = %cleanup
%12 = load ptr, ptr %0, align 8, !noundef !2
%13 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
%14 = load i32, ptr %13, align 8, !noundef !2
%15 = insertvalue { ptr, i32 } poison, ptr %12, 0
%16 = insertvalue { ptr, i32 } %15, i32 %14, 1
resume { ptr, i32 } %16
cleanup: ; preds = %bb7, %bb5, %bb19
%17 = landingpad { ptr, i32 }
cleanup
%18 = extractvalue { ptr, i32 } %17, 0
%19 = extractvalue { ptr, i32 } %17, 1
%20 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 0
store ptr %18, ptr %20, align 8
%21 = getelementptr inbounds { ptr, i32 }, ptr %0, i32 0, i32 1
store i32 %19, ptr %21, align 8
br label %bb14
unreachable: ; preds = %bb19
unreachable
bb5: ; preds = %bb10, %bb4
; invoke <core::slice::iter::Iter<T> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
%22 = invoke align 1 ptr @"_ZN106_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..double_ended..DoubleEndedIterator$GT$9next_back17h41c1c6141187c094E"(ptr align 8 %self)
to label %bb6 unwind label %cleanup
bb6: ; preds = %bb5
store ptr %22, ptr %_11, align 8
%23 = load ptr, ptr %_11, align 8, !noundef !2
%24 = ptrtoint ptr %23 to i64
%25 = icmp eq i64 %24, 0
%_12 = select i1 %25, i64 0, i64 1
%26 = icmp eq i64 %_12, 1
br i1 %26, label %bb7, label %bb11
bb7: ; preds = %bb6
%x = load ptr, ptr %_11, align 8, !nonnull !2, !align !4, !noundef !2
%27 = load i64, ptr %i, align 8, !noundef !2
%28 = sub i64 %27, 1
store i64 %28, ptr %i, align 8
store ptr %x, ptr %_16, align 8
%29 = load ptr, ptr %_16, align 8, !nonnull !2, !align !4, !noundef !2
; invoke issue_73396_bounds_check_after_position::rposition_index_no_bounds_check::{{closure}}
%_14 = invoke zeroext i1 @"_ZN39issue_73396_bounds_check_after_position31rposition_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17hebfb37f35bc4dddfE"(ptr align 1 %predicate, ptr align 1 %29)
to label %bb8 unwind label %cleanup
bb11: ; preds = %bb6
br label %bb12
bb8: ; preds = %bb7
br i1 %_14, label %bb9, label %bb10
bb10: ; preds = %bb8
br label %bb5
bb9: ; preds = %bb8
%_18 = load i64, ptr %i, align 8, !noundef !2
%_19 = load i64, ptr %n, align 8, !noundef !2
%_17 = icmp ult i64 %_18, %_19
call void @llvm.assume(i1 %_17)
%_20 = load i64, ptr %i, align 8, !noundef !2
%30 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
store i64 %_20, ptr %30, align 8
store i64 1, ptr %1, align 8
br label %bb13
bb13: ; preds = %bb12, %bb9
%31 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 0
%32 = load i64, ptr %31, align 8, !range !5, !noundef !2
%33 = getelementptr inbounds { i64, i64 }, ptr %1, i32 0, i32 1
%34 = load i64, ptr %33, align 8
%35 = insertvalue { i64, i64 } poison, i64 %32, 0
%36 = insertvalue { i64, i64 } %35, i64 %34, 1
ret { i64, i64 } %36
bb12: ; preds = %bb11
store i64 0, ptr %1, align 8
br label %bb13
}
; Function Attrs: nonlazybind uwtable
define { ptr, i64 } @position_slice_to_no_bounds_check(ptr align 1 %s.0, i64 %s.1) unnamed_addr #1 {
start:
%_9 = alloca i64, align 8
%_4 = alloca { ptr, ptr }, align 8
%_2 = alloca { i64, i64 }, align 8
%0 = alloca { ptr, i64 }, align 8
; call core::slice::<impl [T]>::iter
%1 = call { ptr, ptr } @"_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hc2bc82a9da745a53E"(ptr align 1 %s.0, i64 %s.1)
store { ptr, ptr } %1, ptr %_4, align 8
; call <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::position
%2 = call { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17had4e29db686da3c3E"(ptr align 8 %_4)
store { i64, i64 } %2, ptr %_2, align 8
%_5 = load i64, ptr %_2, align 8, !range !5, !noundef !2
%3 = icmp eq i64 %_5, 1
br i1 %3, label %bb3, label %bb5
bb3: ; preds = %start
%4 = getelementptr inbounds { i64, i64 }, ptr %_2, i32 0, i32 1
%idx = load i64, ptr %4, align 8, !noundef !2
store i64 %idx, ptr %_9, align 8
%5 = load i64, ptr %_9, align 8, !noundef !2
; call core::slice::index::<impl core::ops::index::Index<I> for [T]>::index
%6 = call { ptr, i64 } @"_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h66a3bc8ab0c1335cE"(ptr align 1 %s.0, i64 %s.1, i64 %5, ptr align 8 @alloc_3be2c4c24977a1246f0f21c86e12e13d)
%_8.0 = extractvalue { ptr, i64 } %6, 0
%_8.1 = extractvalue { ptr, i64 } %6, 1
%7 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
store ptr %_8.0, ptr %7, align 8
%8 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
store i64 %_8.1, ptr %8, align 8
br label %bb6
bb5: ; preds = %start
%9 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
store ptr %s.0, ptr %9, align 8
%10 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
store i64 %s.1, ptr %10, align 8
br label %bb6
bb6: ; preds = %bb5, %bb3
%11 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
%12 = load ptr, ptr %11, align 8, !nonnull !2, !align !4, !noundef !2
%13 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
%14 = load i64, ptr %13, align 8, !noundef !2
%15 = insertvalue { ptr, i64 } poison, ptr %12, 0
%16 = insertvalue { ptr, i64 } %15, i64 %14, 1
ret { ptr, i64 } %16
}
; issue_73396_bounds_check_after_position::position_slice_to_no_bounds_check::{{closure}}
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @"_ZN39issue_73396_bounds_check_after_position33position_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h4684d6c4f2db2c2eE"(ptr align 1 %_1, ptr align 1 %b) unnamed_addr #0 {
start:
%_3 = load i8, ptr %b, align 1, !noundef !2
%0 = icmp eq i8 %_3, 92
ret i1 %0
}
; Function Attrs: nonlazybind uwtable
define { ptr, i64 } @position_slice_from_no_bounds_check(ptr align 1 %s.0, i64 %s.1) unnamed_addr #1 {
start:
%_9 = alloca i64, align 8
%_4 = alloca { ptr, ptr }, align 8
%_2 = alloca { i64, i64 }, align 8
%0 = alloca { ptr, i64 }, align 8
; call core::slice::<impl [T]>::iter
%1 = call { ptr, ptr } @"_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hc2bc82a9da745a53E"(ptr align 1 %s.0, i64 %s.1)
store { ptr, ptr } %1, ptr %_4, align 8
; call <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::position
%2 = call { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17he231b42fb8f32e16E"(ptr align 8 %_4)
store { i64, i64 } %2, ptr %_2, align 8
%_5 = load i64, ptr %_2, align 8, !range !5, !noundef !2
%3 = icmp eq i64 %_5, 1
br i1 %3, label %bb3, label %bb5
bb3: ; preds = %start
%4 = getelementptr inbounds { i64, i64 }, ptr %_2, i32 0, i32 1
%idx = load i64, ptr %4, align 8, !noundef !2
store i64 %idx, ptr %_9, align 8
%5 = load i64, ptr %_9, align 8, !noundef !2
; call core::slice::index::<impl core::ops::index::Index<I> for [T]>::index
%6 = call { ptr, i64 } @"_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17hf11adc2032126944E"(ptr align 1 %s.0, i64 %s.1, i64 %5, ptr align 8 @alloc_1aa28502097eab29d2364e0f05756451)
%_8.0 = extractvalue { ptr, i64 } %6, 0
%_8.1 = extractvalue { ptr, i64 } %6, 1
%7 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
store ptr %_8.0, ptr %7, align 8
%8 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
store i64 %_8.1, ptr %8, align 8
br label %bb6
bb5: ; preds = %start
%9 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
store ptr %s.0, ptr %9, align 8
%10 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
store i64 %s.1, ptr %10, align 8
br label %bb6
bb6: ; preds = %bb5, %bb3
%11 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
%12 = load ptr, ptr %11, align 8, !nonnull !2, !align !4, !noundef !2
%13 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
%14 = load i64, ptr %13, align 8, !noundef !2
%15 = insertvalue { ptr, i64 } poison, ptr %12, 0
%16 = insertvalue { ptr, i64 } %15, i64 %14, 1
ret { ptr, i64 } %16
}
; issue_73396_bounds_check_after_position::position_slice_from_no_bounds_check::{{closure}}
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @"_ZN39issue_73396_bounds_check_after_position35position_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h33ac7926901bfdabE"(ptr align 1 %_1, ptr align 1 %b) unnamed_addr #0 {
start:
%_3 = load i8, ptr %b, align 1, !noundef !2
%0 = icmp eq i8 %_3, 92
ret i1 %0
}
; Function Attrs: nonlazybind uwtable
define i8 @position_index_no_bounds_check(ptr align 1 %s.0, i64 %s.1) unnamed_addr #1 {
start:
%_4 = alloca { ptr, ptr }, align 8
%_2 = alloca { i64, i64 }, align 8
%0 = alloca i8, align 1
; call core::slice::<impl [T]>::iter
%1 = call { ptr, ptr } @"_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hc2bc82a9da745a53E"(ptr align 1 %s.0, i64 %s.1)
store { ptr, ptr } %1, ptr %_4, align 8
; call <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::position
%2 = call { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8position17h8533e6dc674a7121E"(ptr align 8 %_4)
store { i64, i64 } %2, ptr %_2, align 8
%_5 = load i64, ptr %_2, align 8, !range !5, !noundef !2
%3 = icmp eq i64 %_5, 1
br i1 %3, label %bb3, label %bb5
bb3: ; preds = %start
%4 = getelementptr inbounds { i64, i64 }, ptr %_2, i32 0, i32 1
%idx = load i64, ptr %4, align 8, !noundef !2
%_8 = icmp ult i64 %idx, %s.1
%5 = call i1 @llvm.expect.i1(i1 %_8, i1 true)
br i1 %5, label %bb4, label %panic
bb5: ; preds = %start
store i8 42, ptr %0, align 1
br label %bb6
bb4: ; preds = %bb3
%6 = getelementptr inbounds [0 x i8], ptr %s.0, i64 0, i64 %idx
%7 = load i8, ptr %6, align 1, !noundef !2
store i8 %7, ptr %0, align 1
br label %bb6
panic: ; preds = %bb3
; call core::panicking::panic_bounds_check
call void @_ZN4core9panicking18panic_bounds_check17h2c24583383b0129bE(i64 %idx, i64 %s.1, ptr align 8 @alloc_6d0dcba2cfb971c18983344891bc74d3) #6
unreachable
bb6: ; preds = %bb5, %bb4
%8 = load i8, ptr %0, align 1, !noundef !2
ret i8 %8
}
; issue_73396_bounds_check_after_position::position_index_no_bounds_check::{{closure}}
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @"_ZN39issue_73396_bounds_check_after_position30position_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h4c285c223db8e52aE"(ptr align 1 %_1, ptr align 1 %b) unnamed_addr #0 {
start:
%_3 = load i8, ptr %b, align 1, !noundef !2
%0 = icmp eq i8 %_3, 92
ret i1 %0
}
; Function Attrs: nonlazybind uwtable
define { ptr, i64 } @rposition_slice_to_no_bounds_check(ptr align 1 %s.0, i64 %s.1) unnamed_addr #1 {
start:
%_9 = alloca i64, align 8
%_4 = alloca { ptr, ptr }, align 8
%_2 = alloca { i64, i64 }, align 8
%0 = alloca { ptr, i64 }, align 8
; call core::slice::<impl [T]>::iter
%1 = call { ptr, ptr } @"_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hc2bc82a9da745a53E"(ptr align 1 %s.0, i64 %s.1)
store { ptr, ptr } %1, ptr %_4, align 8
; call <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::rposition
%2 = call { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h07494362af3538e8E"(ptr align 8 %_4)
store { i64, i64 } %2, ptr %_2, align 8
%_5 = load i64, ptr %_2, align 8, !range !5, !noundef !2
%3 = icmp eq i64 %_5, 1
br i1 %3, label %bb3, label %bb5
bb3: ; preds = %start
%4 = getelementptr inbounds { i64, i64 }, ptr %_2, i32 0, i32 1
%idx = load i64, ptr %4, align 8, !noundef !2
store i64 %idx, ptr %_9, align 8
%5 = load i64, ptr %_9, align 8, !noundef !2
; call core::slice::index::<impl core::ops::index::Index<I> for [T]>::index
%6 = call { ptr, i64 } @"_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17h66a3bc8ab0c1335cE"(ptr align 1 %s.0, i64 %s.1, i64 %5, ptr align 8 @alloc_bc51fbc4dba7ecff3cbe7998b8cdf04b)
%_8.0 = extractvalue { ptr, i64 } %6, 0
%_8.1 = extractvalue { ptr, i64 } %6, 1
%7 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
store ptr %_8.0, ptr %7, align 8
%8 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
store i64 %_8.1, ptr %8, align 8
br label %bb6
bb5: ; preds = %start
%9 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
store ptr %s.0, ptr %9, align 8
%10 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
store i64 %s.1, ptr %10, align 8
br label %bb6
bb6: ; preds = %bb5, %bb3
%11 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
%12 = load ptr, ptr %11, align 8, !nonnull !2, !align !4, !noundef !2
%13 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
%14 = load i64, ptr %13, align 8, !noundef !2
%15 = insertvalue { ptr, i64 } poison, ptr %12, 0
%16 = insertvalue { ptr, i64 } %15, i64 %14, 1
ret { ptr, i64 } %16
}
; issue_73396_bounds_check_after_position::rposition_slice_to_no_bounds_check::{{closure}}
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @"_ZN39issue_73396_bounds_check_after_position34rposition_slice_to_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17hc8d3489862ffcefeE"(ptr align 1 %_1, ptr align 1 %b) unnamed_addr #0 {
start:
%_3 = load i8, ptr %b, align 1, !noundef !2
%0 = icmp eq i8 %_3, 92
ret i1 %0
}
; Function Attrs: nonlazybind uwtable
define { ptr, i64 } @rposition_slice_from_no_bounds_check(ptr align 1 %s.0, i64 %s.1) unnamed_addr #1 {
start:
%_9 = alloca i64, align 8
%_4 = alloca { ptr, ptr }, align 8
%_2 = alloca { i64, i64 }, align 8
%0 = alloca { ptr, i64 }, align 8
; call core::slice::<impl [T]>::iter
%1 = call { ptr, ptr } @"_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hc2bc82a9da745a53E"(ptr align 1 %s.0, i64 %s.1)
store { ptr, ptr } %1, ptr %_4, align 8
; call <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::rposition
%2 = call { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h4635c5af17f83fa7E"(ptr align 8 %_4)
store { i64, i64 } %2, ptr %_2, align 8
%_5 = load i64, ptr %_2, align 8, !range !5, !noundef !2
%3 = icmp eq i64 %_5, 1
br i1 %3, label %bb3, label %bb5
bb3: ; preds = %start
%4 = getelementptr inbounds { i64, i64 }, ptr %_2, i32 0, i32 1
%idx = load i64, ptr %4, align 8, !noundef !2
store i64 %idx, ptr %_9, align 8
%5 = load i64, ptr %_9, align 8, !noundef !2
; call core::slice::index::<impl core::ops::index::Index<I> for [T]>::index
%6 = call { ptr, i64 } @"_ZN4core5slice5index74_$LT$impl$u20$core..ops..index..Index$LT$I$GT$$u20$for$u20$$u5b$T$u5d$$GT$5index17hf11adc2032126944E"(ptr align 1 %s.0, i64 %s.1, i64 %5, ptr align 8 @alloc_4ffa1e0c5f69e41cbb461912a83bf72c)
%_8.0 = extractvalue { ptr, i64 } %6, 0
%_8.1 = extractvalue { ptr, i64 } %6, 1
%7 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
store ptr %_8.0, ptr %7, align 8
%8 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
store i64 %_8.1, ptr %8, align 8
br label %bb6
bb5: ; preds = %start
%9 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
store ptr %s.0, ptr %9, align 8
%10 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
store i64 %s.1, ptr %10, align 8
br label %bb6
bb6: ; preds = %bb5, %bb3
%11 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 0
%12 = load ptr, ptr %11, align 8, !nonnull !2, !align !4, !noundef !2
%13 = getelementptr inbounds { ptr, i64 }, ptr %0, i32 0, i32 1
%14 = load i64, ptr %13, align 8, !noundef !2
%15 = insertvalue { ptr, i64 } poison, ptr %12, 0
%16 = insertvalue { ptr, i64 } %15, i64 %14, 1
ret { ptr, i64 } %16
}
; issue_73396_bounds_check_after_position::rposition_slice_from_no_bounds_check::{{closure}}
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @"_ZN39issue_73396_bounds_check_after_position36rposition_slice_from_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17h7296da868918d0daE"(ptr align 1 %_1, ptr align 1 %b) unnamed_addr #0 {
start:
%_3 = load i8, ptr %b, align 1, !noundef !2
%0 = icmp eq i8 %_3, 92
ret i1 %0
}
; Function Attrs: nonlazybind uwtable
define i8 @rposition_index_no_bounds_check(ptr align 1 %s.0, i64 %s.1) unnamed_addr #1 {
start:
%_4 = alloca { ptr, ptr }, align 8
%_2 = alloca { i64, i64 }, align 8
%0 = alloca i8, align 1
; call core::slice::<impl [T]>::iter
%1 = call { ptr, ptr } @"_ZN4core5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$4iter17hc2bc82a9da745a53E"(ptr align 1 %s.0, i64 %s.1)
store { ptr, ptr } %1, ptr %_4, align 8
; call <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::rposition
%2 = call { i64, i64 } @"_ZN91_$LT$core..slice..iter..Iter$LT$T$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$9rposition17h5db3b3c3f65ee4c2E"(ptr align 8 %_4)
store { i64, i64 } %2, ptr %_2, align 8
%_5 = load i64, ptr %_2, align 8, !range !5, !noundef !2
%3 = icmp eq i64 %_5, 1
br i1 %3, label %bb3, label %bb5
bb3: ; preds = %start
%4 = getelementptr inbounds { i64, i64 }, ptr %_2, i32 0, i32 1
%idx = load i64, ptr %4, align 8, !noundef !2
%_8 = icmp ult i64 %idx, %s.1
%5 = call i1 @llvm.expect.i1(i1 %_8, i1 true)
br i1 %5, label %bb4, label %panic
bb5: ; preds = %start
store i8 42, ptr %0, align 1
br label %bb6
bb4: ; preds = %bb3
%6 = getelementptr inbounds [0 x i8], ptr %s.0, i64 0, i64 %idx
%7 = load i8, ptr %6, align 1, !noundef !2
store i8 %7, ptr %0, align 1
br label %bb6
panic: ; preds = %bb3
; call core::panicking::panic_bounds_check
call void @_ZN4core9panicking18panic_bounds_check17h2c24583383b0129bE(i64 %idx, i64 %s.1, ptr align 8 @alloc_710ed194fbc5b9f5c247e30afb3033da) #6
unreachable
bb6: ; preds = %bb5, %bb4
%8 = load i8, ptr %0, align 1, !noundef !2
ret i8 %8
}
; issue_73396_bounds_check_after_position::rposition_index_no_bounds_check::{{closure}}
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @"_ZN39issue_73396_bounds_check_after_position31rposition_index_no_bounds_check28_$u7b$$u7b$closure$u7d$$u7d$17hebfb37f35bc4dddfE"(ptr align 1 %_1, ptr align 1 %b) unnamed_addr #0 {
start:
%_3 = load i8, ptr %b, align 1, !noundef !2
%0 = icmp eq i8 %_3, 92
ret i1 %0
}
; core::slice::index::slice_end_index_len_fail
; Function Attrs: cold noinline noreturn nonlazybind uwtable
declare void @_ZN4core5slice5index24slice_end_index_len_fail17h80a8d89025e3e486E(i64, i64, ptr align 8) unnamed_addr #2
; core::slice::index::slice_index_order_fail
; Function Attrs: cold noinline noreturn nonlazybind uwtable
declare void @_ZN4core5slice5index22slice_index_order_fail17hbb92ac81d067154bE(i64, i64, ptr align 8) unnamed_addr #2
; Function Attrs: nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite)
declare void @llvm.assume(i1 noundef) #3
; core::slice::index::slice_start_index_len_fail
; Function Attrs: cold noinline noreturn nonlazybind uwtable
declare void @_ZN4core5slice5index26slice_start_index_len_fail17hebf4c07799653c4cE(i64, i64, ptr align 8) unnamed_addr #2
; Function Attrs: nonlazybind uwtable
declare i32 @rust_eh_personality(i32, i32, i64, ptr, ptr) unnamed_addr #1
; core::panicking::panic
; Function Attrs: cold noinline noreturn nonlazybind uwtable
declare void @_ZN4core9panicking5panic17h0c30414c03dbaa75E(ptr align 1, i64, ptr align 8) unnamed_addr #2
; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare { i64, i1 } @llvm.uadd.with.overflow.i64(i64, i64) #4
; Function Attrs: nocallback nofree nosync nounwind willreturn memory(none)
declare i1 @llvm.expect.i1(i1, i1) #5
; core::panicking::panic_bounds_check
; Function Attrs: cold noinline noreturn nonlazybind uwtable
declare void @_ZN4core9panicking18panic_bounds_check17h2c24583383b0129bE(i64, i64, ptr align 8) unnamed_addr #2
attributes #0 = { inlinehint nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #1 = { nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #2 = { cold noinline noreturn nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #3 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nocallback nofree nosync nounwind willreturn memory(none) }
attributes #6 = { noreturn }
!llvm.module.flags = !{!0, !1}
!0 = !{i32 8, !"PIC Level", i32 2}
!1 = !{i32 2, !"RtLibUseGOT", i32 1}
!2 = !{}
!3 = !{i8 0, i8 2}
!4 = !{i64 1}
!5 = !{i64 0, i64 2}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment