Skip to content

Instantly share code, notes, and snippets.

@comex
Created February 20, 2020 09:23
Show Gist options
  • Save comex/881074b1bcc545e299e65527c719eef4 to your computer and use it in GitHub Desktop.
Save comex/881074b1bcc545e299e65527c719eef4 to your computer and use it in GitHub Desktop.
; ModuleID = 'confused.ll'
source_filename = "boke.7rcbfp3g-cgu.2"
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.7.0"
%"alloc::vec::Vec<i32>" = type { [0 x i64], { i32*, i64 }, [0 x i64], i64, [0 x i64] }
%"alloc::vec::Vec<u8>" = type { [0 x i64], { i8*, i64 }, [0 x i64], i64, [0 x i64] }
%"unwind::libunwind::_Unwind_Exception" = type { [0 x i64], i64, [0 x i64], void (i32, %"unwind::libunwind::_Unwind_Exception"*)*, [0 x i64], [6 x i64], [0 x i64] }
%"unwind::libunwind::_Unwind_Context" = type { [0 x i8] }
; Function Attrs: noinline nounwind
declare hidden fastcc void @_ZN4boke6xprint17hb7d1645b4e6e84f5E(i64) unnamed_addr #0
; Function Attrs: noinline nounwind
define hidden fastcc void @_ZN4boke7do_test17hecf60cb18da69309E(i64) unnamed_addr #0 personality i32 (i32, i32, i64, %"unwind::libunwind::_Unwind_Exception"*, %"unwind::libunwind::_Unwind_Context"*)* @rust_eh_personality {
%2 = alloca %"alloc::vec::Vec<i32>", align 8
%3 = tail call i8* @__rust_alloc(i64 24, i64 8) #6
%4 = icmp eq i8* %3, null
br i1 %4, label %5, label %6
5: ; preds = %1
tail call void @_ZN5alloc5alloc18handle_alloc_error17h8b8658ef1c4b3b2dE(i64 24, i64 8) #6
unreachable
6: ; preds = %1
%7 = tail call i8* @__rust_alloc_zeroed(i64 3, i64 1) #6, !noalias !2
%8 = icmp eq i8* %7, null
br i1 %8, label %9, label %10
9: ; preds = %6
tail call void @_ZN5alloc5alloc18handle_alloc_error17h8b8658ef1c4b3b2dE(i64 3, i64 1) #6, !noalias !2
unreachable
10: ; preds = %6
%11 = bitcast i8* %3 to i8**
store i8* %7, i8** %11, align 8
%12 = getelementptr inbounds i8, i8* %3, i64 8
%13 = bitcast i8* %12 to i64*
store i64 3, i64* %13, align 8
%14 = getelementptr inbounds i8, i8* %3, i64 16
%15 = bitcast i8* %14 to i64*
store i64 3, i64* %15, align 8
%16 = bitcast %"alloc::vec::Vec<i32>"* %2 to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %16)
%17 = getelementptr inbounds %"alloc::vec::Vec<i32>", %"alloc::vec::Vec<i32>"* %2, i64 0, i32 0, i64 0
store i64 4, i64* %17, align 8, !alias.scope !5
%18 = getelementptr inbounds %"alloc::vec::Vec<i32>", %"alloc::vec::Vec<i32>"* %2, i64 0, i32 1, i32 1
%19 = bitcast i64* %18 to i8*
call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %19, i8 0, i64 16, i1 false) #6, !alias.scope !5
%20 = bitcast i8* %3 to %"alloc::vec::Vec<u8>"*
%21 = getelementptr inbounds i8, i8* %3, i64 24
%22 = bitcast i8* %21 to %"alloc::vec::Vec<u8>"*
%23 = icmp eq i64 %0, 0
%24 = getelementptr inbounds %"alloc::vec::Vec<i32>", %"alloc::vec::Vec<i32>"* %2, i64 0, i32 3
%25 = icmp eq i64 %0, 0
%26 = bitcast %"alloc::vec::Vec<i32>"* %2 to i32**
%27 = bitcast %"alloc::vec::Vec<i32>"* %2 to i8**
%28 = bitcast %"alloc::vec::Vec<i32>"* %2 to i8**
%29 = shl nuw i64 %0, 2
br label %30
30: ; preds = %133, %10
%31 = phi %"alloc::vec::Vec<u8>"* [ %20, %10 ], [ %32, %133 ]
%32 = getelementptr inbounds %"alloc::vec::Vec<u8>", %"alloc::vec::Vec<u8>"* %31, i64 1
%33 = bitcast %"alloc::vec::Vec<u8>"* %31 to {}**
%34 = load {}*, {}** %33, align 8
%35 = getelementptr inbounds %"alloc::vec::Vec<u8>", %"alloc::vec::Vec<u8>"* %31, i64 0, i32 1, i32 1
%36 = load i64, i64* %35, align 8
%37 = getelementptr inbounds %"alloc::vec::Vec<u8>", %"alloc::vec::Vec<u8>"* %31, i64 0, i32 3
%38 = load i64, i64* %37, align 8
%39 = icmp eq {}* %34, null
br i1 %39, label %40, label %196
40: ; preds = %133, %30
%41 = phi %"alloc::vec::Vec<u8>"* [ %32, %133 ], [ %32, %30 ]
%42 = icmp eq %"alloc::vec::Vec<u8>"* %41, %22
br i1 %42, label %59, label %43
43: ; preds = %40
br label %44
44: ; preds = %56, %43
%45 = phi %"alloc::vec::Vec<u8>"* [ %46, %56 ], [ %41, %43 ]
%46 = getelementptr inbounds %"alloc::vec::Vec<u8>", %"alloc::vec::Vec<u8>"* %45, i64 1
%47 = bitcast %"alloc::vec::Vec<u8>"* %45 to {}**
%48 = load {}*, {}** %47, align 8
%49 = getelementptr inbounds %"alloc::vec::Vec<u8>", %"alloc::vec::Vec<u8>"* %45, i64 0, i32 1, i32 1
%50 = load i64, i64* %49, align 8
%51 = icmp eq {}* %48, null
br i1 %51, label %58, label %52
52: ; preds = %44
%53 = icmp eq i64 %50, 0
br i1 %53, label %56, label %54
54: ; preds = %52
%55 = bitcast {}* %48 to i8*
tail call void @__rust_dealloc(i8* nonnull %55, i64 %50, i64 1) #6
br label %56
56: ; preds = %54, %52
%57 = icmp eq %"alloc::vec::Vec<u8>"* %46, %22
br i1 %57, label %58, label %44
58: ; preds = %56, %44
br label %59
59: ; preds = %58, %40
tail call void @__rust_dealloc(i8* nonnull %3, i64 24, i64 8) #6
%60 = getelementptr inbounds %"alloc::vec::Vec<i32>", %"alloc::vec::Vec<i32>"* %2, i64 0, i32 1, i32 1
%61 = load i64, i64* %60, align 8
%62 = icmp eq i64 %61, 0
br i1 %62, label %67, label %63
63: ; preds = %59
%64 = bitcast %"alloc::vec::Vec<i32>"* %2 to i8**
%65 = load i8*, i8** %64, align 8
%66 = shl i64 %61, 2
tail call void @__rust_dealloc(i8* nonnull %65, i64 %66, i64 4) #6
br label %67
67: ; preds = %63, %59
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %16)
ret void
68: ; preds = %127
br label %70
69: ; preds = %195
br label %70
70: ; preds = %69, %68
%71 = icmp ult i64 %74, %0
br i1 %71, label %72, label %129
72: ; preds = %198, %70
%73 = phi i64 [ %74, %70 ], [ 0, %198 ]
%74 = add nuw i64 %73, 1
%75 = mul i64 %73, %0
%76 = add nuw i64 %73, 1
%77 = mul i64 %76, %0
%78 = add i64 %77, -1
%79 = icmp ult i64 %78, %75
%80 = sub i64 %78, %75
br i1 %79, label %135, label %81
81: ; preds = %72
%82 = icmp ult i64 %38, %78
br i1 %25, label %84, label %83
83: ; preds = %81
br label %138
84: ; preds = %81
br label %85
85: ; preds = %127, %84
%86 = phi i32 [ %87, %127 ], [ 0, %84 ]
%87 = add i32 %86, 1
%88 = load i64, i64* %24, align 8
%89 = load i64, i64* %18, align 8, !noalias !8
%90 = sub i64 %89, %88
%91 = icmp ult i64 %90, %0
br i1 %91, label %92, label %126
92: ; preds = %85
%93 = tail call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %88, i64 %0) #6
%94 = extractvalue { i64, i1 } %93, 0
%95 = extractvalue { i64, i1 } %93, 1
br i1 %95, label %174, label %96
96: ; preds = %92
%97 = shl i64 %89, 1
%98 = icmp ugt i64 %97, %94
%99 = select i1 %98, i64 %97, i64 %94
%100 = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %99, i64 4) #6
%101 = extractvalue { i64, i1 } %100, 1
br i1 %101, label %174, label %102
102: ; preds = %96
%103 = extractvalue { i64, i1 } %100, 0
%104 = icmp eq i64 %89, 0
br i1 %104, label %109, label %105
105: ; preds = %102
%106 = shl i64 %89, 2
%107 = load i8*, i8** %27, align 8, !noalias !8, !nonnull !11
%108 = tail call i8* @__rust_realloc(i8* nonnull %107, i64 %106, i64 4, i64 %103) #6, !noalias !8
br label %111
109: ; preds = %102
%110 = tail call i8* @__rust_alloc(i64 %103, i64 4) #6, !noalias !8
br label %111
111: ; preds = %109, %105
%112 = phi i8* [ %110, %109 ], [ %108, %105 ]
%113 = icmp eq i8* %112, null
br i1 %113, label %168, label %114
114: ; preds = %111
store i8* %112, i8** %28, align 8, !noalias !8
store i64 %99, i64* %18, align 8, !noalias !8
%115 = bitcast i8* %112 to i32*
%116 = load i64, i64* %24, align 8
%117 = getelementptr inbounds i32, i32* %115, i64 %116
br label %118
118: ; preds = %118, %114
%119 = phi i64 [ %121, %118 ], [ %0, %114 ]
%120 = phi i32* [ %122, %118 ], [ %117, %114 ]
%121 = add i64 %119, -1
store i32 0, i32* %120, align 4, !noalias !12
%122 = getelementptr inbounds i32, i32* %120, i64 1
%123 = icmp eq i64 %121, 0
br i1 %123, label %124, label %118
124: ; preds = %118
%125 = add i64 %116, %0
store i64 %125, i64* %24, align 8, !noalias !12
br label %126
126: ; preds = %124, %85
br i1 %82, label %186, label %127
127: ; preds = %126
tail call fastcc void @_ZN4boke6xprint17hb7d1645b4e6e84f5E(i64 %80)
%128 = icmp eq i32 %86, 0
br i1 %128, label %68, label %85
129: ; preds = %70
br label %130
130: ; preds = %196, %129
%131 = icmp eq i64 %36, 0
br i1 %131, label %133, label %132
132: ; preds = %130
tail call void @__rust_dealloc(i8* nonnull %197, i64 %36, i64 1) #6
br label %133
133: ; preds = %132, %130
%134 = icmp eq %"alloc::vec::Vec<u8>"* %32, %22
br i1 %134, label %40, label %30
135: ; preds = %72
%136 = phi i64 [ %75, %72 ]
%137 = phi i64 [ %78, %72 ]
call void @"_ZN80_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$alloc..vec..SpecExtend$LT$T$C$I$GT$$GT$11spec_extend17hc03afbd7b7565be1E"(%"alloc::vec::Vec<i32>"* nonnull align 8 dereferenceable(24) %2, i64 %0, i32 0) #6
call void @_ZN4core5slice22slice_index_order_fail17hd81cf90b73a8c00cE(i64 %136, i64 %137) #6
unreachable
138: ; preds = %195, %83
%139 = load i64, i64* %24, align 8
%140 = load i64, i64* %18, align 8, !noalias !8
%141 = sub i64 %140, %139
%142 = icmp ult i64 %141, %0
br i1 %142, label %143, label %177
143: ; preds = %138
%144 = tail call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %139, i64 %0) #6
%145 = extractvalue { i64, i1 } %144, 0
%146 = extractvalue { i64, i1 } %144, 1
br i1 %146, label %175, label %147
147: ; preds = %143
%148 = shl i64 %140, 1
%149 = icmp ugt i64 %148, %145
%150 = select i1 %149, i64 %148, i64 %145
%151 = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %150, i64 4) #6
%152 = extractvalue { i64, i1 } %151, 1
br i1 %152, label %175, label %153
153: ; preds = %147
%154 = extractvalue { i64, i1 } %151, 0
%155 = icmp eq i64 %140, 0
br i1 %155, label %156, label %158
156: ; preds = %153
%157 = tail call i8* @__rust_alloc(i64 %154, i64 4) #6, !noalias !8
br label %162
158: ; preds = %153
%159 = shl i64 %140, 2
%160 = load i8*, i8** %27, align 8, !noalias !8, !nonnull !11
%161 = tail call i8* @__rust_realloc(i8* nonnull %160, i64 %159, i64 4, i64 %154) #6, !noalias !8
br label %162
162: ; preds = %158, %156
%163 = phi i8* [ %157, %156 ], [ %161, %158 ]
%164 = icmp eq i8* %163, null
br i1 %164, label %170, label %165
165: ; preds = %162
store i8* %163, i8** %28, align 8, !noalias !8
store i64 %150, i64* %18, align 8, !noalias !8
%166 = bitcast i8* %163 to i32*
%167 = load i64, i64* %24, align 8
br label %179
168: ; preds = %111
%169 = phi i64 [ %103, %111 ]
br label %172
170: ; preds = %162
%171 = phi i64 [ %154, %162 ]
br label %172
172: ; preds = %170, %168
%173 = phi i64 [ %169, %168 ], [ %171, %170 ]
tail call void @_ZN5alloc5alloc18handle_alloc_error17h8b8658ef1c4b3b2dE(i64 %173, i64 4) #6, !noalias !8
unreachable
174: ; preds = %96, %92
br label %176
175: ; preds = %147, %143
br label %176
176: ; preds = %175, %174
tail call void @_ZN5alloc7raw_vec17capacity_overflow17h11335beb3fd927e8E() #6
unreachable
177: ; preds = %138
%178 = load i32*, i32** %26, align 8, !alias.scope !21
br label %179
179: ; preds = %177, %165
%180 = phi i64 [ %139, %177 ], [ %167, %165 ]
%181 = phi i32* [ %178, %177 ], [ %166, %165 ]
%182 = getelementptr inbounds i32, i32* %181, i64 %180
%183 = bitcast i32* %182 to i8*
call void @llvm.memset.p0i8.i64(i8* align 4 %183, i8 0, i64 %29, i1 false)
br label %184
184: ; preds = %179
%185 = add i64 %180, %0
store i64 %185, i64* %24, align 8, !noalias !12
br i1 %82, label %189, label %195
186: ; preds = %126
%187 = phi i64 [ %38, %126 ]
%188 = phi i64 [ %78, %126 ]
br label %192
189: ; preds = %184
%190 = phi i64 [ %38, %184 ]
%191 = phi i64 [ %78, %184 ]
br label %192
192: ; preds = %189, %186
%193 = phi i64 [ %190, %189 ], [ %187, %186 ]
%194 = phi i64 [ %191, %189 ], [ %188, %186 ]
tail call void @_ZN4core5slice20slice_index_len_fail17hc5c580cbfa3ea8b2E(i64 %194, i64 %193) #6
unreachable
195: ; preds = %184
tail call fastcc void @_ZN4boke6xprint17hb7d1645b4e6e84f5E(i64 %80)
br i1 true, label %69, label %138
196: ; preds = %30
%197 = bitcast {}* %34 to i8*
br i1 %23, label %130, label %198
198: ; preds = %196
br label %72
}
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #1
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #1
; Function Attrs: nounwind readnone speculatable
declare { i64, i1 } @llvm.uadd.with.overflow.i64(i64, i64) #2
; Function Attrs: nounwind
declare i32 @rust_eh_personality(i32, i32, i64, %"unwind::libunwind::_Unwind_Exception"*, %"unwind::libunwind::_Unwind_Context"*) unnamed_addr #3
; Function Attrs: noreturn nounwind
declare void @_ZN5alloc5alloc18handle_alloc_error17h8b8658ef1c4b3b2dE(i64, i64) unnamed_addr #4
; Function Attrs: nounwind
declare noalias i8* @__rust_alloc(i64, i64) unnamed_addr #3
; Function Attrs: cold noinline noreturn nounwind
declare void @_ZN4core5slice22slice_index_order_fail17hd81cf90b73a8c00cE(i64, i64) unnamed_addr #5
; Function Attrs: cold noinline noreturn nounwind
declare void @_ZN4core5slice20slice_index_len_fail17hc5c580cbfa3ea8b2E(i64, i64) unnamed_addr #5
; Function Attrs: argmemonly nounwind
declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #1
; Function Attrs: nounwind
declare i8* @__rust_alloc_zeroed(i64, i64) unnamed_addr #3
; Function Attrs: nounwind readnone speculatable
declare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64) #2
; Function Attrs: nounwind
declare i8* @__rust_realloc(i8*, i64, i64, i64) unnamed_addr #3
; Function Attrs: noreturn nounwind
declare void @_ZN5alloc7raw_vec17capacity_overflow17h11335beb3fd927e8E() unnamed_addr #4
; Function Attrs: nounwind
declare void @__rust_dealloc(i8*, i64, i64) unnamed_addr #3
; Function Attrs: nounwind
declare hidden void @"_ZN80_$LT$alloc..vec..Vec$LT$T$GT$$u20$as$u20$alloc..vec..SpecExtend$LT$T$C$I$GT$$GT$11spec_extend17hc03afbd7b7565be1E"(%"alloc::vec::Vec<i32>"* align 8 dereferenceable(24), i64, i32) unnamed_addr #3
attributes #0 = { noinline nounwind "frame-pointer"="all" "probe-stack"="__rust_probestack" "target-cpu"="core2" }
attributes #1 = { argmemonly nounwind }
attributes #2 = { nounwind readnone speculatable }
attributes #3 = { nounwind "frame-pointer"="all" "probe-stack"="__rust_probestack" "target-cpu"="core2" }
attributes #4 = { noreturn nounwind "frame-pointer"="all" "probe-stack"="__rust_probestack" "target-cpu"="core2" }
attributes #5 = { cold noinline noreturn nounwind "frame-pointer"="all" "probe-stack"="__rust_probestack" "target-cpu"="core2" }
attributes #6 = { nounwind }
!llvm.module.flags = !{!0, !1}
!0 = !{i32 7, !"PIC Level", i32 2}
!1 = !{i32 7, !"PIE Level", i32 2}
!2 = !{!3}
!3 = distinct !{!3, !4, !"_ZN5alloc3vec9from_elem17h2c623b1a547469b1E: argument 0"}
!4 = distinct !{!4, !"_ZN5alloc3vec9from_elem17h2c623b1a547469b1E"}
!5 = !{!6}
!6 = distinct !{!6, !7, !"_ZN5alloc3vec12Vec$LT$T$GT$3new17hc130d09da876d824E: argument 0"}
!7 = distinct !{!7, !"_ZN5alloc3vec12Vec$LT$T$GT$3new17hc130d09da876d824E"}
!8 = !{!9}
!9 = distinct !{!9, !10, !"_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16reserve_internal17he2026f09dd64cbf6E: argument 0"}
!10 = distinct !{!10, !"_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$16reserve_internal17he2026f09dd64cbf6E"}
!11 = !{}
!12 = !{!13, !15, !17, !19}
!13 = distinct !{!13, !14, !"_ZN4core4iter6traits8iterator8Iterator8try_fold17h56895c8bc180eceeE: argument 0"}
!14 = distinct !{!14, !"_ZN4core4iter6traits8iterator8Iterator8try_fold17h56895c8bc180eceeE"}
!15 = distinct !{!15, !16, !"_ZN94_$LT$core..iter..adapters..Take$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hcf0ab1fd6a9658e5E: argument 0"}
!16 = distinct !{!16, !"_ZN94_$LT$core..iter..adapters..Take$LT$I$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hcf0ab1fd6a9658e5E"}
!17 = distinct !{!17, !18, !"_ZN4core4iter6traits8iterator8Iterator4fold17hef6671e4cf47f500E: argument 0"}
!18 = distinct !{!18, !"_ZN4core4iter6traits8iterator8Iterator4fold17hef6671e4cf47f500E"}
!19 = distinct !{!19, !20, !"_ZN4core4iter6traits8iterator8Iterator8for_each17h6ae0f78d475b5670E: argument 0"}
!20 = distinct !{!20, !"_ZN4core4iter6traits8iterator8Iterator8for_each17h6ae0f78d475b5670E"}
!21 = !{!22}
!22 = distinct !{!22, !23, !"_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$3ptr17h644bcc2fd513dacdE: argument 0"}
!23 = distinct !{!23, !"_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$3ptr17h644bcc2fd513dacdE"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment