Skip to content

core::num::f16b Rust's 16bit Brain Float - #160859

Open
Jamesbarford wants to merge 5 commits into
rust-lang:mainfrom
Jamesbarford:feat/fb16-pt1
Open

Jamesbarford wants to merge 5 commits into
rust-lang:mainfrom
Jamesbarford:feat/fb16-pt1

Conversation

@Jamesbarford

@Jamesbarford Jamesbarford commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

View all comments

Implements the RFC: f16b type. Best reviewed commit by commit, happy to split into separate PRs if that is deemed easier to review. However the line count and surface area is, in my opinion, reasonably small.

Adds;

  • ABI plumbing for the f16b along with bfloat lang item to work with LLVM, GCC is explicitly unimplemented!(...)
  • f16b feature gate, page for f16b on libruscdoc and a struct bf16 in core::num
  • Tests
  • Treat f16b as a scalar primitive for scalable vectors

Issues;

@rustbot

rustbot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_attr_ir

cc @jdonszelmann, @JonathanBrouwer

This PR changes rustc_public

cc @oli-obk, @celinval, @ouz-a, @makai410

rustc_codegen_gcc is developed in its own repository. If possible, consider making this change to rust-lang/rustc_codegen_gcc instead.

cc @antoyo, @GuillaumeGomez

@rustbot rustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Aug 10, 2026
@rustbot rustbot added T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Aug 10, 2026
@rustbot

rustbot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: compiler
  • compiler expanded to 75 candidates
  • Random selection from 18 candidates

@rust-log-analyzer

This comment has been minimized.

@jieyouxu

Copy link
Copy Markdown
Member

@rustbot reroll

@rustbot rustbot assigned mati865 and unassigned jieyouxu Aug 10, 2026
Comment thread compiler/rustc_codegen_gcc/src/type_.rs Outdated
}

fn type_f16b(&self) -> Type<'gcc> {
bug!("f16b is not supported by the GCC codegen backend")

@antoyo antoyo Aug 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks 😄, I will aim to add it in a follow up PR 👍

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, as @folkertdev pointed out, it was a doddle. So I've included the implementation in the PR 👍

@rustbot

rustbot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

rustc_codegen_cranelift is developed in its own repository. If possible, consider making this change to rust-lang/rustc_codegen_cranelift instead.

cc @bjorn3

Comment thread compiler/rustc_ty_utils/src/layout.rs
Comment thread compiler/rustc_target/src/callconv/mips64.rs
@rust-log-analyzer

This comment has been minimized.

Comment thread compiler/rustc_target/src/callconv/mips64.rs
Comment thread library/core/src/num/f16b.rs Outdated
Comment thread compiler/rustc_codegen_ssa/src/mir/naked_asm.rs Outdated
Comment thread library/core/src/num/f16b.rs Outdated
Comment thread library/core/src/num/bfloat.rs
Comment thread tests/codegen-llvm/float/f16b.rs Outdated
@rust-log-analyzer

This comment has been minimized.

@rustbot rustbot added the A-test-infra-minicore Area: `minicore` test auxiliary and `//@ add-core-stubs` label Aug 12, 2026
@rustbot

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@rustbot

rustbot commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

Some changes occurred in cfg and check-cfg configuration

cc @Urgau

miri is developed in its own repository. If the Miri part of this change can be broken out, consider making this change to rust-lang/miri instead. However, if Miri needs adjusting for rustc changes, just ignore this message.

cc @rust-lang/miri

@rust-log-analyzer

This comment has been minimized.

@mati865

mati865 commented Aug 12, 2026

Copy link
Copy Markdown
Member

I'm not a good reviewer for this change. Can somebody here pick it up rather than blindly rerolling?

@folkertdev

Copy link
Copy Markdown
Contributor

r? me

@rust-bors rust-bors Bot removed the S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. label Sep 17, 2026
@rust-bors

rust-bors Bot commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

This pull request was unapproved.

This PR was contained in a rollup (#162918), which was unapproved.

View changes since this unapproval

@folkertdev

folkertdev commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Ah, I think that is just a conflict between PRs in that rollup, specifically #161987. So we should just let that merge and then add this back to the queue.

@folkertdev

Copy link
Copy Markdown
Contributor

@Jamesbarford can you rebase and fix that conflict?

@rustbot

rustbot commented Sep 18, 2026

Copy link
Copy Markdown
Collaborator

This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed.

Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers.

@rust-log-analyzer

This comment has been minimized.

@Jamesbarford

Copy link
Copy Markdown
Contributor Author

@rustbot ready

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Sep 18, 2026
@folkertdev

Copy link
Copy Markdown
Contributor

@bors r+

@rust-bors

rust-bors Bot commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

📌 Commit c1287ce has been approved by folkertdev

It is now in the queue for this repository.

@rust-bors rust-bors Bot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Sep 18, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Sep 18, 2026
…ertdev

`core::num::f16b` Rust's 16bit Brain Float

Implements the [RFC: f16b type](rust-lang/rfcs#3983). Best reviewed commit by commit, happy to split into separate PRs if that is deemed easier to review. However the line count and surface area is, in my opinion, reasonably small.

Adds;
- ABI plumbing for the `f16b` along with `bfloat` lang item to work with LLVM, GCC is explicitly `unimplemented!(...)`
- `f16b` feature gate, page for `f16b` on libruscdoc and a `struct bf16` in `core::num`
- Tests
- Treat `f16b` as a scalar primitive for scalable vectors

Issues;
- [Tracking Issue](rust-lang#160630)
- [RFC](rust-lang/rfcs#3983)
rust-bors Bot pushed a commit that referenced this pull request Sep 18, 2026
…uwer

Rollup of 8 pull requests

Successful merges:

 - #160859 (`core::num::f16b` Rust's 16bit Brain Float)
 - #162177 (Properly implement the gpu-kernel ABI for amdgpu)
 - #162591 (Move parse error recovery for expression operators "out of line" & refactor in the area)
 - #162733 (Add useful APIs to `Unique(Arc|Rc)`)
 - #162950 (More AST lowering cleanups)
 - #162964 (Update `browser-ui-test` version to `0.25.2`)
 - #162797 (yeet AliasConstKind::opt_def_id)
 - #162836 (Ping T-libs-ping instead of T-libs-fcp for backports)
@JonathanBrouwer

Copy link
Copy Markdown
Member

💔 I suspect this PR failed tests as part of a rollup
@bors r-

After fixing the problem, consider running a try job for the failed job before re-approving.

Link to failure: #162975 (comment)

@rust-bors

rust-bors Bot commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

This pull request was unapproved.

This PR was contained in a rollup (#162975), which was unapproved.

View changes since this unapproval

@folkertdev

Copy link
Copy Markdown
Contributor

Hmm, GCC 11 is very old (current version is 16), I suspect it just does not have this symbol?

--- stderr -------------------------------
error: linking with `cc` failed: exit status: 1
   |
   = note:  "cc" "-m64" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/float/f16b/rustccAlleh/symbols.o" "<1 object files omitted>" "-Wl,--as-needed" "-Wl,-Bdynamic" "<sysroot>/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-1ae09a3721ccfcdf.so" "-Wl,-Bstatic" "<sysroot>/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-*.rlib" "-Wl,-Bdynamic" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-L" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/float/f16b/rustccAlleh/raw-dylibs" "-B<sysroot>/lib/rustlib/x86_64-unknown-linux-gnu/bin/gcc-ld" "-B<sysroot>/lib/rustlib/x86_64-unknown-linux-gnu/bin/gcc-ld" "-fuse-ld=lld" "-Wl,--eh-frame-hdr" "-Wl,-z,noexecstack" "-L" "/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "-L" "<sysroot>/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/float/f16b/a" "-Wl,--gc-sections" "-pie" "-Wl,-z,relro,-z,now" "-Wl,--strip-debug" "-nodefaultlibs" "-Wl,-rpath,$ORIGIN/../../../../stage2/lib/rustlib/x86_64-unknown-linux-gnu/lib,--enable-new-dtags,-z,origin"
   = note: some arguments are omitted. use `--verbose` to show all linker arguments
   = note: rust-lld: error: undefined symbol: __truncsfbf2
           >>> referenced by f16b.adc03c64e5889bf6-cgu.0
           >>>               /checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/float/f16b/a.f16b.adc03c64e5889bf6-cgu.0.rcgu.o:(f16b::main)
           >>> referenced by f16b.adc03c64e5889bf6-cgu.0
           >>>               /checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/float/f16b/a.f16b.adc03c64e5889bf6-cgu.0.rcgu.o:(<core::num::bfloat::f16b>::to_bits)
           >>> referenced by f16b.adc03c64e5889bf6-cgu.0
           >>>               /checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/float/f16b/a.f16b.adc03c64e5889bf6-cgu.0.rcgu.o:(<f32 as core::convert::From<core::num::bfloat::f16b>>::from)
           >>> did you mean: __truncsfhf2
           >>> defined in: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libgcc_s.so.1
           collect2: error: ld returned 1 exit status

Did we get unlucky with the runner just having a really old GCC? Or maybe this conversion is normally optimized out but not at opt level 0.

Anyhow, I'd just add -Copt-level=3 and a FIXME to remove it once we have that symbol in compiler-builtins.

@tgross35

Copy link
Copy Markdown
Member

Could somebody with this built dump the unoptimized LLVM IR for that test? __truncsfbf2 should be added to c-b in a followup, but I can't imagine why it's emitting a trunc call for what should be purely bitwise ops. That's a bit reminiscent of the miscompilation llvm/llvm-project#97981.

@tgross35

Copy link
Copy Markdown
Member

I imagine adding -O to the test may fix it since that was a nopt failure, but it should come with a FIXME(f16b) once we understand the problem

@Jamesbarford

Jamesbarford commented Sep 19, 2026

Copy link
Copy Markdown
Contributor Author

Could somebody with this built dump the unoptimized LLVM IR for that test? __truncsfbf2 should be added to c-b in a followup, but I can't imagine why it's emitting a trunc call for what should be purely bitwise ops. That's a bit reminiscent of the miscompilation llvm/llvm-project#97981.

(The IR dump is huge so I've made it a markdown dropdown thingy)

Unoptimised LLVM-IR Dump
; ModuleID = 'f16b.9f00d607cf6f8058-cgu.0'
source_filename = "f16b.9f00d607cf6f8058-cgu.0"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%"core::fmt::rt::Argument<'_>" = type { %"core::fmt::rt::ArgumentType<'_>" }
%"core::fmt::rt::ArgumentType<'_>" = type { ptr, [1 x i64] }

@vtable.0 = private unnamed_addr constant <{ [24 x i8], ptr, ptr, ptr }> <{ [24 x i8] c"\00\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00", ptr @_RNSNvYNCINvNtCs1vn2fv7hoci_3std2rt10lang_startuE0INtNtNtCsaWjkfsaqAJ7_4core3ops8function6FnOnceuE9call_once6vtableCsdEmYN0yN6GW_4f16b, ptr @_RNCINvNtCs1vn2fv7hoci_3std2rt10lang_startuE0CsdEmYN0yN6GW_4f16b, ptr @_RNCINvNtCs1vn2fv7hoci_3std2rt10lang_startuE0CsdEmYN0yN6GW_4f16b }>, align 8, !guid !0
@vtable.1 = private unnamed_addr constant <{ [24 x i8], ptr }> <{ [24 x i8] c"\00\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00", ptr @_RNvXs1g_NtCsaWjkfsaqAJ7_4core3fmtRNtNtCsdv34ydNcq0v_5alloc6string6StringNtB6_5Debug3fmtCsdEmYN0yN6GW_4f16b }>, align 8, !guid !1
@vtable.2 = private unnamed_addr constant <{ [24 x i8], ptr }> <{ [24 x i8] c"\00\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00", ptr @_RNvXs1g_NtCsaWjkfsaqAJ7_4core3fmtRReNtB6_5Debug3fmtCsdEmYN0yN6GW_4f16b }>, align 8, !guid !2
@vtable.3 = private unnamed_addr constant <{ [24 x i8], ptr }> <{ [24 x i8] c"\00\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00", ptr @_RNvXs1g_NtCsaWjkfsaqAJ7_4core3fmtRNtNtNtB8_3num6bfloat4f16bNtB6_5Debug3fmtCsdEmYN0yN6GW_4f16b }>, align 8, !guid !3
@vtable.4 = private unnamed_addr constant <{ [24 x i8], ptr }> <{ [24 x i8] c"\00\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00", ptr @"_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h7bfb83fe036768bbE" }>, align 8, !guid !4
@alloc_94b9d93a972c9ddf5a033fb4b08ba432 = private unnamed_addr constant [28 x i8] c"library/core/src/ptr/mod.rs\00", align 1, !guid !5
@alloc_11d34ebd17763e81ab439495f00083b4 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_94b9d93a972c9ddf5a033fb4b08ba432, [16 x i8] c"\1B\00\00\00\00\00\00\00*\02\00\00\05\00\00\00" }>, align 8, !guid !6
@alloc_4e0b9646061945c00d0edbf1d69fff6a = private unnamed_addr constant [29 x i8] c"library/alloc/src/vec/mod.rs\00", align 1, !guid !7
@alloc_7997e28b82957ae1f1ede169744c3539 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_4e0b9646061945c00d0edbf1d69fff6a, [16 x i8] c"\1C\00\00\00\00\00\00\00\B2\08\00\00\09\00\00\00" }>, align 8, !guid !8
@alloc_f85406d658e94b9c37cd2112f10307ee = private unnamed_addr constant [8 x i8] c"\02\00\00\00\00\00\00\00", align 8, !guid !9
@alloc_58a1f0dc22620a4fe3c54bd5dac478ee = private unnamed_addr constant [25 x i8] c"./tests/ui/float/f16b.rs\00", align 1, !guid !10
@alloc_5d8028bdbc1b46820ac6679ab7b9b9ee = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_58a1f0dc22620a4fe3c54bd5dac478ee, [16 x i8] c"\18\00\00\00\00\00\00\00\1A\00\00\00\05\00\00\00" }>, align 8, !guid !11
@alloc_1a9482986fb91a3b9ec2a1ee45274d7e = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_58a1f0dc22620a4fe3c54bd5dac478ee, [16 x i8] c"\18\00\00\00\00\00\00\00\1B\00\00\00\05\00\00\00" }>, align 8, !guid !12
@alloc_b4c54f6159d272a055076b41aa6540d8 = private unnamed_addr constant [2 x i8] zeroinitializer, align 2, !guid !13
@alloc_95954a9216b111c1e45c82f58f84d656 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_58a1f0dc22620a4fe3c54bd5dac478ee, [16 x i8] c"\18\00\00\00\00\00\00\00!\00\00\00\09\00\00\00" }>, align 8, !guid !14
@alloc_c8cf9126240858e3061ae7ffcf02fb94 = private unnamed_addr constant [2 x i8] c"\80?", align 2, !guid !15
@alloc_6f113a0041b7ff021ef8f930a40390b4 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_58a1f0dc22620a4fe3c54bd5dac478ee, [16 x i8] c"\18\00\00\00\00\00\00\00\22\00\00\00\09\00\00\00" }>, align 8, !guid !16
@alloc_79a5d30b8232ffd52374838ddbab6aec = private unnamed_addr constant [4 x i8] c"\00\00\80?", align 4, !guid !17
@alloc_bee23e8b490ac4af3291f51849ea220d = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_58a1f0dc22620a4fe3c54bd5dac478ee, [16 x i8] c"\18\00\00\00\00\00\00\00#\00\00\00\09\00\00\00" }>, align 8, !guid !18
@alloc_b1db6afa18ecb74ecab70f8b3bed3cf9 = private unnamed_addr constant [27 x i8] c"assertion failed: ONE < two", align 1, !guid !19
@alloc_05942d896d0cc3a36944f42c94ff00e1 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_58a1f0dc22620a4fe3c54bd5dac478ee, [16 x i8] c"\18\00\00\00\00\00\00\00(\00\00\00\09\00\00\00" }>, align 8, !guid !20
@alloc_573a56c3f18b40fc4d727a350ba80220 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_58a1f0dc22620a4fe3c54bd5dac478ee, [16 x i8] c"\18\00\00\00\00\00\00\00)\00\00\00\09\00\00\00" }>, align 8, !guid !21
@alloc_49d10da4072934366a2a64f0fec45a75 = private unnamed_addr constant [28 x i8] c"assertion failed: nan != nan", align 1, !guid !22
@alloc_0cd6eebdfb1ee64d55dae2834e41f1c1 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_58a1f0dc22620a4fe3c54bd5dac478ee, [16 x i8] c"\18\00\00\00\00\00\00\00*\00\00\00\09\00\00\00" }>, align 8, !guid !23
@alloc_0c812808379efded5a4fb82d2790b556 = private unnamed_addr constant [2 x i8] c"\C0\00", align 1, !guid !24
@alloc_2624a2c89f8402b769ddf36fa38bb69e = private unnamed_addr constant [3 x i8] c"1.0", align 1, !guid !25
@alloc_7a6079c9aae084f6a2d7148e7ce07ec1 = private unnamed_addr constant <{ ptr, [8 x i8] }> <{ ptr @alloc_2624a2c89f8402b769ddf36fa38bb69e, [8 x i8] c"\03\00\00\00\00\00\00\00" }>, align 8, !guid !26
@alloc_8b48e84c8080a21030e0474552946d41 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_58a1f0dc22620a4fe3c54bd5dac478ee, [16 x i8] c"\18\00\00\00\00\00\00\00+\00\00\00\09\00\00\00" }>, align 8, !guid !27
@alloc_6ca19ec93e48593013d9e5fe9aa07bc0 = private unnamed_addr constant [3 x i8] c"1e0", align 1, !guid !28
@alloc_2dc31201251ca28f00d72ff4424fc796 = private unnamed_addr constant <{ ptr, [8 x i8] }> <{ ptr @alloc_6ca19ec93e48593013d9e5fe9aa07bc0, [8 x i8] c"\03\00\00\00\00\00\00\00" }>, align 8, !guid !29
@alloc_18a082dfcace8ceb43947a9c48412b7f = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_58a1f0dc22620a4fe3c54bd5dac478ee, [16 x i8] c"\18\00\00\00\00\00\00\00,\00\00\00\09\00\00\00" }>, align 8, !guid !30
@alloc_d65a28d499d69f6fb185c45710caa177 = private unnamed_addr constant [3 x i8] c"1E0", align 1, !guid !31
@alloc_24a988e6d4e3f474ff55fc677011f038 = private unnamed_addr constant <{ ptr, [8 x i8] }> <{ ptr @alloc_d65a28d499d69f6fb185c45710caa177, [8 x i8] c"\03\00\00\00\00\00\00\00" }>, align 8, !guid !32
@alloc_b18d96f27f120c096afa1cb5bc2b261f = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_58a1f0dc22620a4fe3c54bd5dac478ee, [16 x i8] c"\18\00\00\00\00\00\00\00-\00\00\00\09\00\00\00" }>, align 8, !guid !33
@alloc_fad0cd83b7d1858a846a172eb260e593 = private unnamed_addr constant [42 x i8] c"is_aligned_to: align is not a power-of-two", align 1, !guid !34
@alloc_462d48c71ecbcc11b125140bcb84ed12 = private unnamed_addr constant [34 x i8] c"library/core/src/ptr/const_ptr.rs\00", align 1, !guid !35
@alloc_9f9d061f6ab1cb0745c9e10a6b366547 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_462d48c71ecbcc11b125140bcb84ed12, [16 x i8] c"!\00\00\00\00\00\00\00N\05\00\00\0D\00\00\00" }>, align 8, !guid !36
@alloc_0a6a989224bce28eb2f5fb5f80443071 = private unnamed_addr constant [33 x i8] c"library/alloc/src/raw_vec/mod.rs\00", align 1, !guid !37
@alloc_e2b53753a95eef97b6eacc3398601c76 = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_0a6a989224bce28eb2f5fb5f80443071, [16 x i8] c" \00\00\00\00\00\00\00\C2\01\00\00\15\00\00\00" }>, align 8, !guid !38
@alloc_04efbf03187c458d585646bf49ad0822 = private unnamed_addr constant [28 x i8] c"library/core/src/fmt/mod.rs\00", align 1, !guid !39
@alloc_91d9c872ce60c0f37a47eab5b2d0a81f = private unnamed_addr constant <{ ptr, [16 x i8] }> <{ ptr @alloc_04efbf03187c458d585646bf49ad0822, [16 x i8] c"\1B\00\00\00\00\00\00\00q\03\00\00*\00\00\00" }>, align 8, !guid !40
@anon.0d8ff39247ac42d1cb9fa7e9cb02200e.0 = private unnamed_addr constant <{ [8 x i8], [8 x i8] }> <{ [8 x i8] zeroinitializer, [8 x i8] undef }>, align 8, !guid !41
@alloc_57d70e9d94c65ecfc15225d29a5ed72b = private unnamed_addr constant [198 x i8] c"unsafe precondition(s) violated: Vec::set_len requires that new_len <= capacity()\0A\0AThis indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.", align 1, !guid !42
@alloc_bd3468a7b96187f70c1ce98a3e7a63bf = private unnamed_addr constant [283 x i8] c"unsafe precondition(s) violated: ptr::copy_nonoverlapping requires that both pointer arguments are aligned and non-null and the specified memory ranges do not overlap\0A\0AThis indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.", align 1, !guid !43
@alloc_64e308ef4babfeb8b6220184de794a17 = private unnamed_addr constant [221 x i8] c"unsafe precondition(s) violated: hint::assert_unchecked must never be called when the condition is false\0A\0AThis indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.", align 1, !guid !44
@alloc_763310d78c99c2c1ad3f8a9821e942f3 = private unnamed_addr constant [61 x i8] c"is_nonoverlapping: `size_of::<T>() * count` overflows a usize", align 1, !guid !45
@alloc_a28e8c8fd5088943a8b5d44af697ff83 = private unnamed_addr constant [279 x i8] c"unsafe precondition(s) violated: slice::from_raw_parts requires the pointer to be aligned and non-null, and the total size of the slice not to exceed `isize::MAX`\0A\0AThis indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.", align 1, !guid !46

; f16b::assert_traits::<core::num::bfloat::f16b>
; Function Attrs: nonlazybind uwtable
define internal void @_RINvCsdEmYN0yN6GW_4f16b13assert_traitsNtNtNtCsaWjkfsaqAJ7_4core3num6bfloat4f16bEB2_() unnamed_addr #0 !guid !52 {
start:
  ret void
}

; <core::option::Option<&str>>::map_or_else::<alloc::string::String, alloc::fmt::format::{closure#0}, <str as alloc::borrow::ToOwned>::to_owned>
; Function Attrs: inlinehint nonlazybind uwtable
define internal void @_RINvMNtCsaWjkfsaqAJ7_4core6optionINtB3_6OptionReE11map_or_elseNtNtCsdv34ydNcq0v_5alloc6string6StringNCNvNtB12_3fmt6format0NvYeNtNtB12_6borrow7ToOwned8to_ownedECsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_0, ptr %0, i64 %1, ptr align 8 %default) unnamed_addr #1 personality ptr @rust_eh_personality !guid !53 {
start:
  %_10 = alloca [1 x i8], align 1
  %_9 = alloca [1 x i8], align 1
  %self = alloca [16 x i8], align 8
  store ptr %0, ptr %self, align 8
  %2 = getelementptr inbounds i8, ptr %self, i64 8
  store i64 %1, ptr %2, align 8
  store i8 1, ptr %_10, align 1
  store i8 1, ptr %_9, align 1
  %3 = load ptr, ptr %self, align 8
  %4 = getelementptr inbounds i8, ptr %self, i64 8
  %5 = load i64, ptr %4, align 8
  %6 = ptrtoint ptr %3 to i64
  %7 = icmp eq i64 %6, 0
  %_4 = select i1 %7, i64 0, i64 1
  %8 = trunc nuw i64 %_4 to i1
  br i1 %8, label %bb3, label %bb2

bb3:                                              ; preds = %start
  %t.0 = load ptr, ptr %self, align 8
  %9 = getelementptr inbounds i8, ptr %self, i64 8
  %t.1 = load i64, ptr %9, align 8
  store i8 0, ptr %_9, align 1
; call <<str as alloc::borrow::ToOwned>::to_owned as core::ops::function::FnOnce<(&str,)>>::call_once
  call void @_RNvYNvYeNtNtCsdv34ydNcq0v_5alloc6borrow7ToOwned8to_ownedINtNtNtCsaWjkfsaqAJ7_4core3ops8function6FnOnceTReEE9call_onceCsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_0, ptr %t.0, i64 %t.1) #15
  br label %bb4

bb2:                                              ; preds = %start
  store i8 0, ptr %_10, align 1
; call alloc::fmt::format::{closure#0}
  call void @_RNCNvNtCsdv34ydNcq0v_5alloc3fmt6format0CsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_0, ptr align 8 %default) #15
  br label %bb5

bb5:                                              ; preds = %bb2
  br label %bb6

bb6:                                              ; preds = %bb4, %bb5
  ret void

bb4:                                              ; preds = %bb3
  br label %bb6

bb1:                                              ; No predecessors!
  unreachable

bb7:                                              ; No predecessors!
  unreachable

bb8:                                              ; No predecessors!
  unreachable

bb9:                                              ; No predecessors!
  unreachable

bb10:                                             ; No predecessors!
  unreachable

bb11:                                             ; No predecessors!
  unreachable
}

; <core::fmt::rt::Argument>::new_lower_exp::<core::num::bfloat::f16b>
; Function Attrs: inlinehint nonlazybind uwtable
define internal void @_RINvMNtNtCsaWjkfsaqAJ7_4core3fmt2rtNtB3_8Argument13new_lower_expNtNtNtB7_3num6bfloat4f16bECsdEmYN0yN6GW_4f16b(ptr sret([16 x i8]) align 8 %_0, ptr align 2 %x) unnamed_addr #1 !guid !54 {
start:
  %_2 = alloca [16 x i8], align 8
  store ptr %x, ptr %_2, align 8
  %0 = getelementptr inbounds i8, ptr %_2, i64 8
  store ptr @_RNvXs6_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3fmt8LowerExp3fmtCsdEmYN0yN6GW_4f16b, ptr %0, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %_0, ptr align 8 %_2, i64 16, i1 false)
  ret void
}

; <core::fmt::rt::Argument>::new_upper_exp::<core::num::bfloat::f16b>
; Function Attrs: inlinehint nonlazybind uwtable
define internal void @_RINvMNtNtCsaWjkfsaqAJ7_4core3fmt2rtNtB3_8Argument13new_upper_expNtNtNtB7_3num6bfloat4f16bECsdEmYN0yN6GW_4f16b(ptr sret([16 x i8]) align 8 %_0, ptr align 2 %x) unnamed_addr #1 !guid !55 {
start:
  %_2 = alloca [16 x i8], align 8
  store ptr %x, ptr %_2, align 8
  %0 = getelementptr inbounds i8, ptr %_2, i64 8
  store ptr @_RNvXs7_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3fmt8UpperExp3fmtCsdEmYN0yN6GW_4f16b, ptr %0, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %_0, ptr align 8 %_2, i64 16, i1 false)
  ret void
}

; <core::fmt::rt::Argument>::new_debug::<core::num::bfloat::f16b>
; Function Attrs: inlinehint nonlazybind uwtable
define internal void @_RINvMNtNtCsaWjkfsaqAJ7_4core3fmt2rtNtB3_8Argument9new_debugNtNtNtB7_3num6bfloat4f16bECsdEmYN0yN6GW_4f16b(ptr sret([16 x i8]) align 8 %_0, ptr align 2 %x) unnamed_addr #1 !guid !56 {
start:
  %_2 = alloca [16 x i8], align 8
  store ptr %x, ptr %_2, align 8
  %0 = getelementptr inbounds i8, ptr %_2, i64 8
  store ptr @_RNvXs5_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3fmt5Debug3fmtCsdEmYN0yN6GW_4f16b, ptr %0, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %_0, ptr align 8 %_2, i64 16, i1 false)
  ret void
}

; <core::fmt::Arguments>::new::<2, 1>
; Function Attrs: inlinehint nonlazybind uwtable
define internal { ptr, ptr } @_RINvMs2_NtCsaWjkfsaqAJ7_4core3fmtNtB6_9Arguments3newKj2_Kj1_ECsdEmYN0yN6GW_4f16b(ptr %template, ptr align 8 %args) unnamed_addr #1 !guid !57 {
start:
  %0 = insertvalue { ptr, ptr } poison, ptr %template, 0
  %1 = insertvalue { ptr, ptr } %0, ptr %args, 1
  ret { ptr, ptr } %1
}

; std::rt::lang_start::<()>
; Function Attrs: nonlazybind uwtable
define hidden i64 @_RINvNtCs1vn2fv7hoci_3std2rt10lang_startuECsdEmYN0yN6GW_4f16b(ptr %main, i64 %argc, ptr %argv, i8 %sigpipe) unnamed_addr #0 !guid !58 {
start:
  %_7 = alloca [8 x i8], align 8
  store ptr %main, ptr %_7, align 8
; call std::rt::lang_start_internal
  %_0 = call i64 @_ZN3std2rt19lang_start_internal17he4f5a0bd1413deb2E(ptr %_7, ptr align 8 @vtable.0, i64 %argc, ptr %argv, i8 %sigpipe)
  ret i64 %_0
}

; core::ptr::drop_glue::<alloc::vec::Vec<u8>>
; Function Attrs: nonlazybind uwtable
define internal void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueINtNtCsdv34ydNcq0v_5alloc3vec3VechEECsdEmYN0yN6GW_4f16b(ptr align 8 %_1) unnamed_addr #0 personality ptr @rust_eh_personality !guid !59 {
start:
  %0 = alloca [16 x i8], align 8
; invoke <alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop
  invoke void @"_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h0feba81f2ea3929bE"(ptr align 8 %_1)
          to label %bb4 unwind label %cleanup

bb3:                                              ; preds = %cleanup
; invoke core::ptr::drop_glue::<alloc::raw_vec::RawVec<u8>>
  invoke void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueINtNtCsdv34ydNcq0v_5alloc7raw_vec6RawVechEECsdEmYN0yN6GW_4f16b(ptr align 8 %_1) #16
          to label %bb2 unwind label %terminate

cleanup:                                          ; preds = %start
  %1 = landingpad { ptr, i32 }
          cleanup
  %2 = extractvalue { ptr, i32 } %1, 0
  %3 = extractvalue { ptr, i32 } %1, 1
  store ptr %2, ptr %0, align 8
  %4 = getelementptr inbounds i8, ptr %0, i64 8
  store i32 %3, ptr %4, align 8
  br label %bb3

bb4:                                              ; preds = %start
; call core::ptr::drop_glue::<alloc::raw_vec::RawVec<u8>>
  call void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueINtNtCsdv34ydNcq0v_5alloc7raw_vec6RawVechEECsdEmYN0yN6GW_4f16b(ptr align 8 %_1)
  ret void

terminate:                                        ; preds = %bb3
  %5 = landingpad { ptr, i32 }
          filter [0 x ptr] zeroinitializer
; call core::panicking::panic_in_cleanup
  call void @_ZN4core9panicking16panic_in_cleanup17hb1723739b92501d8E() #17
  unreachable

bb2:                                              ; preds = %bb3
  %6 = load ptr, ptr %0, align 8
  %7 = getelementptr inbounds i8, ptr %0, i64 8
  %8 = load i32, ptr %7, align 8
  %9 = insertvalue { ptr, i32 } poison, ptr %6, 0
  %10 = insertvalue { ptr, i32 } %9, i32 %8, 1
  resume { ptr, i32 } %10
}

; core::ptr::drop_glue::<alloc::raw_vec::RawVec<u8>>
; Function Attrs: nonlazybind uwtable
define internal void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueINtNtCsdv34ydNcq0v_5alloc7raw_vec6RawVechEECsdEmYN0yN6GW_4f16b(ptr align 8 %_1) unnamed_addr #0 !guid !60 {
start:
; call <alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop
  call void @"_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h5166f35166831ea9E"(ptr align 8 %_1)
  ret void
}

; core::ptr::drop_glue::<alloc::string::String>
; Function Attrs: nonlazybind uwtable
define internal void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueNtNtCsdv34ydNcq0v_5alloc6string6StringECsdEmYN0yN6GW_4f16b(ptr align 8 %_1) unnamed_addr #0 !guid !61 {
start:
; call core::ptr::drop_glue::<alloc::vec::Vec<u8>>
  call void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueINtNtCsdv34ydNcq0v_5alloc3vec3VechEECsdEmYN0yN6GW_4f16b(ptr align 8 %_1)
  ret void
}

; core::panicking::assert_failed::<alloc::string::String, &str>
; Function Attrs: cold minsize noinline noreturn nonlazybind optsize uwtable
define internal void @_RINvNtCsaWjkfsaqAJ7_4core9panicking13assert_failedNtNtCsdv34ydNcq0v_5alloc6string6StringReECsdEmYN0yN6GW_4f16b(i8 %kind, ptr align 8 %0, ptr align 8 %1, ptr %args.0, ptr %args.1, ptr align 8 %2) unnamed_addr #2 !guid !62 {
start:
  %right = alloca [8 x i8], align 8
  %left = alloca [8 x i8], align 8
  store ptr %0, ptr %left, align 8
  store ptr %1, ptr %right, align 8
; call core::panicking::assert_failed_inner
  call void @_ZN4core9panicking19assert_failed_inner17hd29e19f36dd1a4dfE(i8 %kind, ptr %left, ptr align 8 @vtable.1, ptr %right, ptr align 8 @vtable.2, ptr %args.0, ptr %args.1, ptr align 8 %2) #18
  unreachable
}

; core::panicking::assert_failed::<core::num::bfloat::f16b, core::num::bfloat::f16b>
; Function Attrs: cold minsize noinline noreturn nonlazybind optsize uwtable
define internal void @_RINvNtCsaWjkfsaqAJ7_4core9panicking13assert_failedNtNtNtB4_3num6bfloat4f16bBM_ECsdEmYN0yN6GW_4f16b(i8 %kind, ptr align 2 %0, ptr align 2 %1, ptr %args.0, ptr %args.1, ptr align 8 %2) unnamed_addr #2 !guid !63 {
start:
  %right = alloca [8 x i8], align 8
  %left = alloca [8 x i8], align 8
  store ptr %0, ptr %left, align 8
  store ptr %1, ptr %right, align 8
; call core::panicking::assert_failed_inner
  call void @_ZN4core9panicking19assert_failed_inner17hd29e19f36dd1a4dfE(i8 %kind, ptr %left, ptr align 8 @vtable.3, ptr %right, ptr align 8 @vtable.3, ptr %args.0, ptr %args.1, ptr align 8 %2) #18
  unreachable
}

; core::panicking::assert_failed::<u16, u16>
; Function Attrs: cold minsize noinline noreturn nonlazybind optsize uwtable
define internal void @_RINvNtCsaWjkfsaqAJ7_4core9panicking13assert_failedttECsdEmYN0yN6GW_4f16b(i8 %kind, ptr align 2 %0, ptr align 2 %1, ptr %args.0, ptr %args.1, ptr align 8 %2) unnamed_addr #2 !guid !64 {
start:
  %right = alloca [8 x i8], align 8
  %left = alloca [8 x i8], align 8
  store ptr %0, ptr %left, align 8
  store ptr %1, ptr %right, align 8
; call core::panicking::assert_failed_inner
  call void @_ZN4core9panicking19assert_failed_inner17hd29e19f36dd1a4dfE(i8 %kind, ptr %left, ptr align 8 @vtable.4, ptr %right, ptr align 8 @vtable.4, ptr %args.0, ptr %args.1, ptr align 8 %2) #18
  unreachable
}

; std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>
; Function Attrs: noinline nonlazybind uwtable
define internal void @_RINvNtNtCs1vn2fv7hoci_3std3sys9backtrace28___rust_begin_short_backtraceFEuuECsdEmYN0yN6GW_4f16b(ptr %f) unnamed_addr #3 !guid !65 {
start:
  %_2 = alloca [0 x i8], align 1
; call <fn() as core::ops::function::FnOnce<()>>::call_once
  call void @_RNvYFEuINtNtNtCsaWjkfsaqAJ7_4core3ops8function6FnOnceuE9call_onceCsdEmYN0yN6GW_4f16b(ptr %f) #15
  call void asm sideeffect "", "~{memory}"(), !srcloc !66
  ret void
}

; <u8 as <[_]>::to_vec_in::ConvertVec>::to_vec::<alloc::alloc::Global>
; Function Attrs: inlinehint nonlazybind uwtable
define internal void @_RINvXs_NvMNtCsdv34ydNcq0v_5alloc5sliceSp9to_vec_inhNtB5_10ConvertVec6to_vecNtNtBa_5alloc6GlobalECsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %v, ptr %s.0, i64 %s.1) unnamed_addr #1 !guid !67 {
start:
  %_17 = alloca [8 x i8], align 8
; call <alloc::raw_vec::RawVecInner>::with_capacity_in
  %0 = call { i64, ptr } @_RNvMs5_NtCsdv34ydNcq0v_5alloc7raw_vecNtB5_11RawVecInner16with_capacity_inCsdEmYN0yN6GW_4f16b(i64 %s.1, i64 1, i64 1) #15
  %_10.0 = extractvalue { i64, ptr } %0, 0
  %_10.1 = extractvalue { i64, ptr } %0, 1
  store i64 %_10.0, ptr %v, align 8
  %1 = getelementptr inbounds i8, ptr %v, i64 8
  store ptr %_10.1, ptr %1, align 8
  %2 = getelementptr inbounds i8, ptr %v, i64 16
  store i64 0, ptr %2, align 8
  %_4 = icmp ugt i64 %s.1, 0
  br i1 %_4, label %bb1, label %bb2

bb2:                                              ; preds = %bb9, %start
  ret void

bb1:                                              ; preds = %start
  %3 = getelementptr inbounds i8, ptr %v, i64 8
  %_12 = load ptr, ptr %3, align 8
  br label %bb4

bb4:                                              ; preds = %bb1
; call core::ptr::copy_nonoverlapping::precondition_check
  call void @_RNvNvNtCsaWjkfsaqAJ7_4core3ptr19copy_nonoverlapping18precondition_checkCsdEmYN0yN6GW_4f16b(ptr %s.0, ptr %_12, i64 1, i64 1, i64 %s.1, ptr align 8 @alloc_11d34ebd17763e81ab439495f00083b4) #19
  br label %bb6

bb6:                                              ; preds = %bb4
  %4 = mul nuw nsw i64 %s.1, 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %_12, ptr align 1 %s.0, i64 %4, i1 false)
  br label %bb7

bb7:                                              ; preds = %bb6
  br label %bb12

bb12:                                             ; preds = %bb7
  %self = load i64, ptr %v, align 8
  store i64 %self, ptr %_17, align 8
  br label %bb10

bb10:                                             ; preds = %bb12
  %5 = load i64, ptr %_17, align 8
; call <alloc::vec::Vec<_, _>>::set_len::precondition_check
  call void @_RNvNvMs_NtCsdv34ydNcq0v_5alloc3vecINtB6_3VecppE7set_len18precondition_checkCsdEmYN0yN6GW_4f16b(i64 %s.1, i64 %5, ptr align 8 @alloc_7997e28b82957ae1f1ede169744c3539) #19
  br label %bb9

bb9:                                              ; preds = %bb10
  %6 = getelementptr inbounds i8, ptr %v, i64 16
  store i64 %s.1, ptr %6, align 8
  br label %bb2

bb11:                                             ; No predecessors!
  unreachable
}

; std::rt::lang_start::<()>::{closure#0}
; Function Attrs: inlinehint nonlazybind uwtable
define internal i32 @_RNCINvNtCs1vn2fv7hoci_3std2rt10lang_startuE0CsdEmYN0yN6GW_4f16b(ptr align 8 %_1) unnamed_addr #1 !guid !68 {
start:
  %_4 = load ptr, ptr %_1, align 8
; call std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>
  call void @_RINvNtNtCs1vn2fv7hoci_3std3sys9backtrace28___rust_begin_short_backtraceFEuuECsdEmYN0yN6GW_4f16b(ptr %_4) #20
; call <() as std::process::Termination>::report
  %self = call i8 @_RNvXsU_NtCs1vn2fv7hoci_3std7processuNtB5_11Termination6reportCsdEmYN0yN6GW_4f16b() #15
  %_0 = zext i8 %self to i32
  ret i32 %_0
}

; alloc::fmt::format::{closure#0}
; Function Attrs: inlinehint nonlazybind uwtable
define internal void @_RNCNvNtCsdv34ydNcq0v_5alloc3fmt6format0CsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_0, ptr align 8 %_1) unnamed_addr #1 !guid !69 {
start:
  %_2.0 = load ptr, ptr %_1, align 8
  %0 = getelementptr inbounds i8, ptr %_1, i64 8
  %_2.1 = load ptr, ptr %0, align 8
; call alloc::fmt::format::format_inner
  call void @_ZN5alloc3fmt6format12format_inner17h1939683252c66edaE(ptr sret([24 x i8]) align 8 %_0, ptr %_2.0, ptr %_2.1)
  ret void
}

; <std::rt::lang_start<()>::{closure#0} as core::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
; Function Attrs: inlinehint nonlazybind uwtable
define internal i32 @_RNSNvYNCINvNtCs1vn2fv7hoci_3std2rt10lang_startuE0INtNtNtCsaWjkfsaqAJ7_4core3ops8function6FnOnceuE9call_once6vtableCsdEmYN0yN6GW_4f16b(ptr %_1) unnamed_addr #1 !guid !70 {
start:
  %_2 = alloca [0 x i8], align 1
  %0 = load ptr, ptr %_1, align 8
; call <std::rt::lang_start<()>::{closure#0} as core::ops::function::FnOnce<()>>::call_once
  %_0 = call i32 @_RNvYNCINvNtCs1vn2fv7hoci_3std2rt10lang_startuE0INtNtNtCsaWjkfsaqAJ7_4core3ops8function6FnOnceuE9call_onceCsdEmYN0yN6GW_4f16b(ptr %0) #15
  ret i32 %_0
}

; f16b::main
; Function Attrs: nonlazybind uwtable
define hidden void @_RNvCsdEmYN0yN6GW_4f16b4main() unnamed_addr #0 personality ptr @rust_eh_personality !guid !71 {
start:
  %0 = alloca [16 x i8], align 8
  %_126 = alloca [16 x i8], align 8
  %args2 = alloca [16 x i8], align 8
  %_121 = alloca [24 x i8], align 8
  %_120 = alloca [24 x i8], align 8
  %_108 = alloca [16 x i8], align 8
  %args1 = alloca [16 x i8], align 8
  %_103 = alloca [24 x i8], align 8
  %_102 = alloca [24 x i8], align 8
  %_90 = alloca [16 x i8], align 8
  %args = alloca [16 x i8], align 8
  %_85 = alloca [24 x i8], align 8
  %_84 = alloca [24 x i8], align 8
  %_70 = alloca [2 x i8], align 2
  %nan = alloca [2 x i8], align 2
  %negative_zero = alloca [2 x i8], align 2
  %two = alloca [2 x i8], align 2
  %_50 = alloca [4 x i8], align 4
  %_26 = alloca [2 x i8], align 2
  %_7 = load i64, ptr @alloc_f85406d658e94b9c37cd2112f10307ee, align 8
  %_8 = load i64, ptr @alloc_f85406d658e94b9c37cd2112f10307ee, align 8
  %_6 = icmp eq i64 %_7, %_8
  br i1 %_6, label %bb1, label %bb2

bb2:                                              ; preds = %start
; call core::panicking::assert_failed
  call void @_ZN4core9panicking13assert_failed17h954bb607e8fa2f62E(i8 0, ptr align 8 @alloc_f85406d658e94b9c37cd2112f10307ee, ptr align 8 @alloc_f85406d658e94b9c37cd2112f10307ee, ptr null, ptr undef, ptr align 8 @alloc_5d8028bdbc1b46820ac6679ab7b9b9ee) #18
  unreachable

bb1:                                              ; preds = %start
  %_18 = load i64, ptr @alloc_f85406d658e94b9c37cd2112f10307ee, align 8
  %_19 = load i64, ptr @alloc_f85406d658e94b9c37cd2112f10307ee, align 8
  %_17 = icmp eq i64 %_18, %_19
  br i1 %_17, label %bb3, label %bb4

bb4:                                              ; preds = %bb1
; call core::panicking::assert_failed
  call void @_ZN4core9panicking13assert_failed17h954bb607e8fa2f62E(i8 0, ptr align 8 @alloc_f85406d658e94b9c37cd2112f10307ee, ptr align 8 @alloc_f85406d658e94b9c37cd2112f10307ee, ptr null, ptr undef, ptr align 8 @alloc_1a9482986fb91a3b9ec2a1ee45274d7e) #18
  unreachable

bb3:                                              ; preds = %bb1
; call f16b::assert_traits::<core::num::bfloat::f16b>
  call void @_RINvCsdEmYN0yN6GW_4f16b13assert_traitsNtNtNtCsaWjkfsaqAJ7_4core3num6bfloat4f16bEB2_()
; call <core::num::bfloat::f16b as core::default::Default>::default
  %_27 = call bfloat @_RNvXs1_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_7default7Default7defaultCsdEmYN0yN6GW_4f16b() #15
; call <core::num::bfloat::f16b>::to_bits
  %1 = call i16 @_RNvMNtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB2_4f16b7to_bitsCsdEmYN0yN6GW_4f16b(bfloat %_27) #15
  store i16 %1, ptr %_26, align 2
  %_32 = load i16, ptr %_26, align 2
  %_33 = load i16, ptr @alloc_b4c54f6159d272a055076b41aa6540d8, align 2
  %_31 = icmp eq i16 %_32, %_33
  br i1 %_31, label %bb8, label %bb9

bb9:                                              ; preds = %bb3
; call core::panicking::assert_failed::<u16, u16>
  call void @_RINvNtCsaWjkfsaqAJ7_4core9panicking13assert_failedttECsdEmYN0yN6GW_4f16b(i8 0, ptr align 2 %_26, ptr align 2 @alloc_b4c54f6159d272a055076b41aa6540d8, ptr null, ptr undef, ptr align 8 @alloc_95954a9216b111c1e45c82f58f84d656) #18
  unreachable

bb8:                                              ; preds = %bb3
  %_43 = load i16, ptr @alloc_c8cf9126240858e3061ae7ffcf02fb94, align 2
  %_44 = load i16, ptr @alloc_c8cf9126240858e3061ae7ffcf02fb94, align 2
  %_42 = icmp eq i16 %_43, %_44
  br i1 %_42, label %bb10, label %bb11

bb11:                                             ; preds = %bb8
; call core::panicking::assert_failed::<u16, u16>
  call void @_RINvNtCsaWjkfsaqAJ7_4core9panicking13assert_failedttECsdEmYN0yN6GW_4f16b(i8 0, ptr align 2 @alloc_c8cf9126240858e3061ae7ffcf02fb94, ptr align 2 @alloc_c8cf9126240858e3061ae7ffcf02fb94, ptr null, ptr undef, ptr align 8 @alloc_6f113a0041b7ff021ef8f930a40390b4) #18
  unreachable

bb10:                                             ; preds = %bb8
; call <f32 as core::convert::From<core::num::bfloat::f16b>>::from
  %_51 = call float @_RNvXs4_NtNtCsaWjkfsaqAJ7_4core3num6bfloatfINtNtB9_7convert4FromNtB5_4f16bE4fromCsdEmYN0yN6GW_4f16b(bfloat 1.000000e+00) #15
; call <f32>::to_bits
  %2 = call i32 @_RNvMNtCsaWjkfsaqAJ7_4core3f32f7to_bitsCsdEmYN0yN6GW_4f16b(float %_51) #15
  store i32 %2, ptr %_50, align 4
  %_56 = load i32, ptr %_50, align 4
  %_57 = load i32, ptr @alloc_79a5d30b8232ffd52374838ddbab6aec, align 4
  %_55 = icmp eq i32 %_56, %_57
  br i1 %_55, label %bb14, label %bb15

bb15:                                             ; preds = %bb10
; call core::panicking::assert_failed
  call void @_ZN4core9panicking13assert_failed17hb4a161b9b8ed4885E(i8 0, ptr align 4 %_50, ptr align 4 @alloc_79a5d30b8232ffd52374838ddbab6aec, ptr null, ptr undef, ptr align 8 @alloc_bee23e8b490ac4af3291f51849ea220d) #18
  unreachable

bb14:                                             ; preds = %bb10
; call <core::num::bfloat::f16b>::from_bits
  %3 = call bfloat @_RNvMNtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB2_4f16b9from_bitsCsdEmYN0yN6GW_4f16b(i16 16384) #15
  store bfloat %3, ptr %two, align 2
; call <core::num::bfloat::f16b>::from_bits
  %4 = call bfloat @_RNvMNtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB2_4f16b9from_bitsCsdEmYN0yN6GW_4f16b(i16 -32768) #15
  store bfloat %4, ptr %negative_zero, align 2
; call <core::num::bfloat::f16b>::from_bits
  %5 = call bfloat @_RNvMNtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB2_4f16b9from_bitsCsdEmYN0yN6GW_4f16b(i16 32704) #15
  store bfloat %5, ptr %nan, align 2
; call <core::num::bfloat::f16b as core::cmp::PartialOrd>::lt
  %_64 = call zeroext i1 @_RNvYNtNtNtCsaWjkfsaqAJ7_4core3num6bfloat4f16bNtNtB8_3cmp10PartialOrd2ltCsdEmYN0yN6GW_4f16b(ptr align 2 @alloc_c8cf9126240858e3061ae7ffcf02fb94, ptr align 2 %two) #15
  br i1 %_64, label %bb20, label %bb21

bb21:                                             ; preds = %bb14
; call core::panicking::panic
  call void @_ZN4core9panicking5panic17h98534be65c42f13aE(ptr @alloc_b1db6afa18ecb74ecab70f8b3bed3cf9, i64 27, ptr align 8 @alloc_05942d896d0cc3a36944f42c94ff00e1) #18
  unreachable

bb20:                                             ; preds = %bb14
; call <core::num::bfloat::f16b>::from_bits
  %6 = call bfloat @_RNvMNtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB2_4f16b9from_bitsCsdEmYN0yN6GW_4f16b(i16 0) #15
  store bfloat %6, ptr %_70, align 2
; call <core::num::bfloat::f16b as core::cmp::PartialEq>::eq
  %_74 = call zeroext i1 @_RNvXs2_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3cmp9PartialEq2eqCsdEmYN0yN6GW_4f16b(ptr align 2 %_70, ptr align 2 %negative_zero) #15
  br i1 %_74, label %bb24, label %bb25

bb25:                                             ; preds = %bb20
; call core::panicking::assert_failed::<core::num::bfloat::f16b, core::num::bfloat::f16b>
  call void @_RINvNtCsaWjkfsaqAJ7_4core9panicking13assert_failedNtNtNtB4_3num6bfloat4f16bBM_ECsdEmYN0yN6GW_4f16b(i8 0, ptr align 2 %_70, ptr align 2 %negative_zero, ptr null, ptr undef, ptr align 8 @alloc_573a56c3f18b40fc4d727a350ba80220) #18
  unreachable

bb24:                                             ; preds = %bb20
; call <core::num::bfloat::f16b as core::cmp::PartialEq>::ne
  %_78 = call zeroext i1 @_RNvYNtNtNtCsaWjkfsaqAJ7_4core3num6bfloat4f16bNtNtB8_3cmp9PartialEq2neCsdEmYN0yN6GW_4f16b(ptr align 2 %nan, ptr align 2 %nan) #15
  br i1 %_78, label %bb27, label %bb28

bb28:                                             ; preds = %bb24
; call core::panicking::panic
  call void @_ZN4core9panicking5panic17h98534be65c42f13aE(ptr @alloc_49d10da4072934366a2a64f0fec45a75, i64 28, ptr align 8 @alloc_0cd6eebdfb1ee64d55dae2834e41f1c1) #18
  unreachable

bb27:                                             ; preds = %bb24
; call <core::fmt::rt::Argument>::new_debug::<core::num::bfloat::f16b>
  call void @_RINvMNtNtCsaWjkfsaqAJ7_4core3fmt2rtNtB3_8Argument9new_debugNtNtNtB7_3num6bfloat4f16bECsdEmYN0yN6GW_4f16b(ptr sret([16 x i8]) align 8 %_90, ptr align 2 @alloc_c8cf9126240858e3061ae7ffcf02fb94) #15
  %7 = getelementptr inbounds nuw %"core::fmt::rt::Argument<'_>", ptr %args, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %7, ptr align 8 %_90, i64 16, i1 false)
; call <core::fmt::Arguments>::new::<2, 1>
  %8 = call { ptr, ptr } @_RINvMs2_NtCsaWjkfsaqAJ7_4core3fmtNtB6_9Arguments3newKj2_Kj1_ECsdEmYN0yN6GW_4f16b(ptr @alloc_0c812808379efded5a4fb82d2790b556, ptr align 8 %args) #15
  %_86.0 = extractvalue { ptr, ptr } %8, 0
  %_86.1 = extractvalue { ptr, ptr } %8, 1
; call alloc::fmt::format
  call void @_RNvNtCsdv34ydNcq0v_5alloc3fmt6formatCsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_85, ptr %_86.0, ptr %_86.1) #15
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %_84, ptr align 8 %_85, i64 24, i1 false)
; invoke <alloc::string::String as core::cmp::PartialEq<&str>>::eq
  %_96 = invoke zeroext i1 @_RNvXs1y_NtCsdv34ydNcq0v_5alloc6stringNtB6_6StringINtNtCsaWjkfsaqAJ7_4core3cmp9PartialEqReE2eqCsdEmYN0yN6GW_4f16b(ptr align 8 %_84, ptr align 8 @alloc_7a6079c9aae084f6a2d7148e7ce07ec1)
          to label %bb33 unwind label %cleanup

bb55:                                             ; preds = %cleanup
; invoke core::ptr::drop_glue::<alloc::string::String>
  invoke void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueNtNtCsdv34ydNcq0v_5alloc6string6StringECsdEmYN0yN6GW_4f16b(ptr align 8 %_84) #16
          to label %bb56 unwind label %terminate

cleanup:                                          ; preds = %bb35, %bb27
  %9 = landingpad { ptr, i32 }
          cleanup
  %10 = extractvalue { ptr, i32 } %9, 0
  %11 = extractvalue { ptr, i32 } %9, 1
  store ptr %10, ptr %0, align 8
  %12 = getelementptr inbounds i8, ptr %0, i64 8
  store i32 %11, ptr %12, align 8
  br label %bb55

bb33:                                             ; preds = %bb27
  br i1 %_96, label %bb34, label %bb35

bb35:                                             ; preds = %bb33
; invoke core::panicking::assert_failed::<alloc::string::String, &str>
  invoke void @_RINvNtCsaWjkfsaqAJ7_4core9panicking13assert_failedNtNtCsdv34ydNcq0v_5alloc6string6StringReECsdEmYN0yN6GW_4f16b(i8 0, ptr align 8 %_84, ptr align 8 @alloc_7a6079c9aae084f6a2d7148e7ce07ec1, ptr null, ptr undef, ptr align 8 @alloc_8b48e84c8080a21030e0474552946d41) #21
          to label %unreachable unwind label %cleanup

bb34:                                             ; preds = %bb33
; call core::ptr::drop_glue::<alloc::string::String>
  call void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueNtNtCsdv34ydNcq0v_5alloc6string6StringECsdEmYN0yN6GW_4f16b(ptr align 8 %_84)
; call <core::fmt::rt::Argument>::new_lower_exp::<core::num::bfloat::f16b>
  call void @_RINvMNtNtCsaWjkfsaqAJ7_4core3fmt2rtNtB3_8Argument13new_lower_expNtNtNtB7_3num6bfloat4f16bECsdEmYN0yN6GW_4f16b(ptr sret([16 x i8]) align 8 %_108, ptr align 2 @alloc_c8cf9126240858e3061ae7ffcf02fb94) #15
  %13 = getelementptr inbounds nuw %"core::fmt::rt::Argument<'_>", ptr %args1, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %13, ptr align 8 %_108, i64 16, i1 false)
; call <core::fmt::Arguments>::new::<2, 1>
  %14 = call { ptr, ptr } @_RINvMs2_NtCsaWjkfsaqAJ7_4core3fmtNtB6_9Arguments3newKj2_Kj1_ECsdEmYN0yN6GW_4f16b(ptr @alloc_0c812808379efded5a4fb82d2790b556, ptr align 8 %args1) #15
  %_104.0 = extractvalue { ptr, ptr } %14, 0
  %_104.1 = extractvalue { ptr, ptr } %14, 1
; call alloc::fmt::format
  call void @_RNvNtCsdv34ydNcq0v_5alloc3fmt6formatCsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_103, ptr %_104.0, ptr %_104.1) #15
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %_102, ptr align 8 %_103, i64 24, i1 false)
; invoke <alloc::string::String as core::cmp::PartialEq<&str>>::eq
  %_114 = invoke zeroext i1 @_RNvXs1y_NtCsdv34ydNcq0v_5alloc6stringNtB6_6StringINtNtCsaWjkfsaqAJ7_4core3cmp9PartialEqReE2eqCsdEmYN0yN6GW_4f16b(ptr align 8 %_102, ptr align 8 @alloc_2dc31201251ca28f00d72ff4424fc796)
          to label %bb41 unwind label %cleanup3

unreachable:                                      ; preds = %bb51, %bb43, %bb35
  unreachable

bb54:                                             ; preds = %cleanup3
; invoke core::ptr::drop_glue::<alloc::string::String>
  invoke void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueNtNtCsdv34ydNcq0v_5alloc6string6StringECsdEmYN0yN6GW_4f16b(ptr align 8 %_102) #16
          to label %bb56 unwind label %terminate

cleanup3:                                         ; preds = %bb43, %bb34
  %15 = landingpad { ptr, i32 }
          cleanup
  %16 = extractvalue { ptr, i32 } %15, 0
  %17 = extractvalue { ptr, i32 } %15, 1
  store ptr %16, ptr %0, align 8
  %18 = getelementptr inbounds i8, ptr %0, i64 8
  store i32 %17, ptr %18, align 8
  br label %bb54

bb41:                                             ; preds = %bb34
  br i1 %_114, label %bb42, label %bb43

bb43:                                             ; preds = %bb41
; invoke core::panicking::assert_failed::<alloc::string::String, &str>
  invoke void @_RINvNtCsaWjkfsaqAJ7_4core9panicking13assert_failedNtNtCsdv34ydNcq0v_5alloc6string6StringReECsdEmYN0yN6GW_4f16b(i8 0, ptr align 8 %_102, ptr align 8 @alloc_2dc31201251ca28f00d72ff4424fc796, ptr null, ptr undef, ptr align 8 @alloc_18a082dfcace8ceb43947a9c48412b7f) #21
          to label %unreachable unwind label %cleanup3

bb42:                                             ; preds = %bb41
; call core::ptr::drop_glue::<alloc::string::String>
  call void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueNtNtCsdv34ydNcq0v_5alloc6string6StringECsdEmYN0yN6GW_4f16b(ptr align 8 %_102)
; call <core::fmt::rt::Argument>::new_upper_exp::<core::num::bfloat::f16b>
  call void @_RINvMNtNtCsaWjkfsaqAJ7_4core3fmt2rtNtB3_8Argument13new_upper_expNtNtNtB7_3num6bfloat4f16bECsdEmYN0yN6GW_4f16b(ptr sret([16 x i8]) align 8 %_126, ptr align 2 @alloc_c8cf9126240858e3061ae7ffcf02fb94) #15
  %19 = getelementptr inbounds nuw %"core::fmt::rt::Argument<'_>", ptr %args2, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %19, ptr align 8 %_126, i64 16, i1 false)
; call <core::fmt::Arguments>::new::<2, 1>
  %20 = call { ptr, ptr } @_RINvMs2_NtCsaWjkfsaqAJ7_4core3fmtNtB6_9Arguments3newKj2_Kj1_ECsdEmYN0yN6GW_4f16b(ptr @alloc_0c812808379efded5a4fb82d2790b556, ptr align 8 %args2) #15
  %_122.0 = extractvalue { ptr, ptr } %20, 0
  %_122.1 = extractvalue { ptr, ptr } %20, 1
; call alloc::fmt::format
  call void @_RNvNtCsdv34ydNcq0v_5alloc3fmt6formatCsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_121, ptr %_122.0, ptr %_122.1) #15
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %_120, ptr align 8 %_121, i64 24, i1 false)
; invoke <alloc::string::String as core::cmp::PartialEq<&str>>::eq
  %_132 = invoke zeroext i1 @_RNvXs1y_NtCsdv34ydNcq0v_5alloc6stringNtB6_6StringINtNtCsaWjkfsaqAJ7_4core3cmp9PartialEqReE2eqCsdEmYN0yN6GW_4f16b(ptr align 8 %_120, ptr align 8 @alloc_24a988e6d4e3f474ff55fc677011f038)
          to label %bb49 unwind label %cleanup4

bb53:                                             ; preds = %cleanup4
; invoke core::ptr::drop_glue::<alloc::string::String>
  invoke void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueNtNtCsdv34ydNcq0v_5alloc6string6StringECsdEmYN0yN6GW_4f16b(ptr align 8 %_120) #16
          to label %bb56 unwind label %terminate

cleanup4:                                         ; preds = %bb51, %bb42
  %21 = landingpad { ptr, i32 }
          cleanup
  %22 = extractvalue { ptr, i32 } %21, 0
  %23 = extractvalue { ptr, i32 } %21, 1
  store ptr %22, ptr %0, align 8
  %24 = getelementptr inbounds i8, ptr %0, i64 8
  store i32 %23, ptr %24, align 8
  br label %bb53

bb49:                                             ; preds = %bb42
  br i1 %_132, label %bb50, label %bb51

bb51:                                             ; preds = %bb49
; invoke core::panicking::assert_failed::<alloc::string::String, &str>
  invoke void @_RINvNtCsaWjkfsaqAJ7_4core9panicking13assert_failedNtNtCsdv34ydNcq0v_5alloc6string6StringReECsdEmYN0yN6GW_4f16b(i8 0, ptr align 8 %_120, ptr align 8 @alloc_24a988e6d4e3f474ff55fc677011f038, ptr null, ptr undef, ptr align 8 @alloc_b18d96f27f120c096afa1cb5bc2b261f) #21
          to label %unreachable unwind label %cleanup4

bb50:                                             ; preds = %bb49
; call core::ptr::drop_glue::<alloc::string::String>
  call void @_RINvNtCsaWjkfsaqAJ7_4core3ptr9drop_glueNtNtCsdv34ydNcq0v_5alloc6string6StringECsdEmYN0yN6GW_4f16b(ptr align 8 %_120)
  ret void

terminate:                                        ; preds = %bb55, %bb54, %bb53
  %25 = landingpad { ptr, i32 }
          filter [0 x ptr] zeroinitializer
; call core::panicking::panic_in_cleanup
  call void @_ZN4core9panicking16panic_in_cleanup17hb1723739b92501d8E() #17
  unreachable

bb56:                                             ; preds = %bb55, %bb54, %bb53
  %26 = load ptr, ptr %0, align 8
  %27 = getelementptr inbounds i8, ptr %0, i64 8
  %28 = load i32, ptr %27, align 8
  %29 = insertvalue { ptr, i32 } poison, ptr %26, 0
  %30 = insertvalue { ptr, i32 } %29, i32 %28, 1
  resume { ptr, i32 } %30
}

; <f32>::to_bits
; Function Attrs: inlinehint nonlazybind uwtable
define internal i32 @_RNvMNtCsaWjkfsaqAJ7_4core3f32f7to_bitsCsdEmYN0yN6GW_4f16b(float %self) unnamed_addr #1 !guid !72 {
start:
  %_0 = bitcast float %self to i32
  ret i32 %_0
}

; <core::num::bfloat::f16b>::to_bits
; Function Attrs: inlinehint nonlazybind uwtable
define internal i16 @_RNvMNtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB2_4f16b7to_bitsCsdEmYN0yN6GW_4f16b(bfloat %self) unnamed_addr #1 !guid !73 {
start:
  %_0 = bitcast bfloat %self to i16
  ret i16 %_0
}

; <core::num::bfloat::f16b>::from_bits
; Function Attrs: inlinehint nonlazybind uwtable
define internal bfloat @_RNvMNtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB2_4f16b9from_bitsCsdEmYN0yN6GW_4f16b(i16 %bits) unnamed_addr #1 !guid !74 {
start:
  %_0 = bitcast i16 %bits to bfloat
  ret bfloat %_0
}

; <*const ()>::is_aligned_to
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @_RNvMNtNtCsaWjkfsaqAJ7_4core3ptr9const_ptrPu13is_aligned_toCsdEmYN0yN6GW_4f16b(ptr %self, i64 %align) unnamed_addr #1 !guid !75 {
start:
  %0 = call i64 @llvm.ctpop.i64(i64 %align)
  %_9 = trunc i64 %0 to i32
  %_3 = icmp eq i32 %_9, 1
  br i1 %_3, label %bb1, label %bb2

bb2:                                              ; preds = %start
; call core::panicking::panic_fmt
  call void @_ZN4core9panicking9panic_fmt17hba2e70fc52687e14E(ptr @alloc_fad0cd83b7d1858a846a172eb260e593, ptr inttoptr (i64 85 to ptr), ptr align 8 @alloc_9f9d061f6ab1cb0745c9e10a6b366547) #18
  unreachable

bb1:                                              ; preds = %start
  %_7 = ptrtoint ptr %self to i64
  %_8 = sub i64 %align, 1
  %_6 = and i64 %_7, %_8
  %_0 = icmp eq i64 %_6, 0
  ret i1 %_0
}

; <alloc::raw_vec::RawVecInner>::with_capacity_in
; Function Attrs: inlinehint nonlazybind uwtable
define internal { i64, ptr } @_RNvMs5_NtCsdv34ydNcq0v_5alloc7raw_vecNtB5_11RawVecInner16with_capacity_inCsdEmYN0yN6GW_4f16b(i64 %capacity, i64 %elem_layout.0, i64 %elem_layout.1) unnamed_addr #1 !guid !76 {
start:
  %self = alloca [8 x i8], align 8
  %_4 = alloca [24 x i8], align 8
; call alloc::raw_vec::RawVecInner<A>::try_allocate_in
  call void @"_ZN5alloc7raw_vec20RawVecInner$LT$A$GT$15try_allocate_in17ha2b28eb1e6b30393E"(ptr sret([24 x i8]) align 8 %_4, i64 %capacity, i1 zeroext false, i64 %elem_layout.0, i64 %elem_layout.1)
  %_5 = load i64, ptr %_4, align 8
  %0 = trunc nuw i64 %_5 to i1
  br i1 %0, label %bb3, label %bb4

bb3:                                              ; preds = %start
  %1 = getelementptr inbounds i8, ptr %_4, i64 8
  %err.0 = load i64, ptr %1, align 8
  %2 = getelementptr inbounds i8, ptr %1, i64 8
  %err.1 = load i64, ptr %2, align 8
; call alloc::raw_vec::handle_error
  call void @_ZN5alloc7raw_vec12handle_error17h2b454d5bf66b113aE(i64 %err.0, i64 %err.1) #21
  unreachable

bb4:                                              ; preds = %start
  %3 = getelementptr inbounds i8, ptr %_4, i64 8
  %this.0 = load i64, ptr %3, align 8
  %4 = getelementptr inbounds i8, ptr %3, i64 8
  %this.1 = load ptr, ptr %4, align 8
  %5 = icmp eq i64 %elem_layout.1, 0
  br i1 %5, label %bb6, label %bb7

bb6:                                              ; preds = %bb4
  store i64 -1, ptr %self, align 8
  br label %bb5

bb7:                                              ; preds = %bb4
  store i64 %this.0, ptr %self, align 8
  br label %bb5

bb5:                                              ; preds = %bb7, %bb6
  %6 = load i64, ptr %self, align 8
  %_11 = sub i64 %6, 0
  %_7 = icmp ugt i64 %capacity, %_11
  %cond = xor i1 %_7, true
  br label %bb8

bb8:                                              ; preds = %bb5
; call core::hint::assert_unchecked::precondition_check
  call void @_RNvNvNtCsaWjkfsaqAJ7_4core4hint16assert_unchecked18precondition_checkCsdEmYN0yN6GW_4f16b(i1 zeroext %cond, ptr align 8 @alloc_e2b53753a95eef97b6eacc3398601c76) #19
  br label %bb9

bb9:                                              ; preds = %bb8
  %7 = insertvalue { i64, ptr } poison, i64 %this.0, 0
  %8 = insertvalue { i64, ptr } %7, ptr %this.1, 1
  ret { i64, ptr } %8

bb2:                                              ; No predecessors!
  unreachable
}

; core::intrinsics::cold_path
; Function Attrs: cold nounwind nonlazybind uwtable
define internal void @_RNvNtCsaWjkfsaqAJ7_4core10intrinsics9cold_pathCsdEmYN0yN6GW_4f16b() unnamed_addr #4 !guid !77 {
start:
  ret void
}

; alloc::fmt::format
; Function Attrs: inlinehint nonlazybind uwtable
define internal void @_RNvNtCsdv34ydNcq0v_5alloc3fmt6formatCsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_0, ptr %0, ptr %1) unnamed_addr #1 !guid !78 {
start:
  %_2 = alloca [16 x i8], align 8
  %args = alloca [16 x i8], align 8
  store ptr %0, ptr %args, align 8
  %2 = getelementptr inbounds i8, ptr %args, i64 8
  store ptr %1, ptr %2, align 8
  %3 = getelementptr inbounds i8, ptr %args, i64 8
  %_7 = load ptr, ptr %3, align 8
  %bits = ptrtoint ptr %_7 to i64
  %_8 = and i64 %bits, 1
  %4 = icmp eq i64 %_8, 1
  br i1 %4, label %bb2, label %bb3

bb2:                                              ; preds = %start
  %self = load ptr, ptr %args, align 8
  %len = lshr i64 %bits, 1
  br label %bb5

bb3:                                              ; preds = %start
  %5 = load ptr, ptr @anon.0d8ff39247ac42d1cb9fa7e9cb02200e.0, align 8
  %6 = load i64, ptr getelementptr inbounds (i8, ptr @anon.0d8ff39247ac42d1cb9fa7e9cb02200e.0, i64 8), align 8
  store ptr %5, ptr %_2, align 8
  %7 = getelementptr inbounds i8, ptr %_2, i64 8
  store i64 %6, ptr %7, align 8
  br label %bb4

bb5:                                              ; preds = %bb2
; call core::slice::raw::from_raw_parts::precondition_check
  call void @_RNvNvNtNtCsaWjkfsaqAJ7_4core5slice3raw14from_raw_parts18precondition_checkCsdEmYN0yN6GW_4f16b(ptr %self, i64 1, i64 1, i64 %len, ptr align 8 @alloc_91d9c872ce60c0f37a47eab5b2d0a81f) #19
  br label %bb7

bb7:                                              ; preds = %bb5
  store ptr %self, ptr %_2, align 8
  %8 = getelementptr inbounds i8, ptr %_2, i64 8
  store i64 %len, ptr %8, align 8
  br label %bb4

bb4:                                              ; preds = %bb3, %bb7
  %9 = load ptr, ptr %_2, align 8
  %10 = getelementptr inbounds i8, ptr %_2, i64 8
  %11 = load i64, ptr %10, align 8
; call <core::option::Option<&str>>::map_or_else::<alloc::string::String, alloc::fmt::format::{closure#0}, <str as alloc::borrow::ToOwned>::to_owned>
  call void @_RINvMNtCsaWjkfsaqAJ7_4core6optionINtB3_6OptionReE11map_or_elseNtNtCsdv34ydNcq0v_5alloc6string6StringNCNvNtB12_3fmt6format0NvYeNtNtB12_6borrow7ToOwned8to_ownedECsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_0, ptr %9, i64 %11, ptr align 8 %args) #15
  ret void
}

; <alloc::vec::Vec<_, _>>::set_len::precondition_check
; Function Attrs: inlinehint nounwind nonlazybind uwtable
define internal void @_RNvNvMs_NtCsdv34ydNcq0v_5alloc3vecINtB6_3VecppE7set_len18precondition_checkCsdEmYN0yN6GW_4f16b(i64 %new_len, i64 %capacity, ptr align 8 %0) unnamed_addr #5 !guid !79 {
start:
  %_3 = icmp ule i64 %new_len, %capacity
  br i1 %_3, label %bb1, label %bb2

bb2:                                              ; preds = %start
; call core::panicking::panic_nounwind_fmt
  call void @_ZN4core9panicking18panic_nounwind_fmt17hdf576476058f9a27E(ptr @alloc_57d70e9d94c65ecfc15225d29a5ed72b, ptr inttoptr (i64 397 to ptr), i1 zeroext false, ptr align 8 %0) #22
  unreachable

bb1:                                              ; preds = %start
  ret void
}

; core::ptr::copy_nonoverlapping::precondition_check
; Function Attrs: inlinehint nounwind nonlazybind uwtable
define internal void @_RNvNvNtCsaWjkfsaqAJ7_4core3ptr19copy_nonoverlapping18precondition_checkCsdEmYN0yN6GW_4f16b(ptr %src, ptr %dst, i64 %size, i64 %align, i64 %count, ptr align 8 %0) unnamed_addr #5 personality ptr @rust_eh_personality !guid !80 {
start:
  %zero_size = alloca [1 x i8], align 1
  %1 = icmp eq i64 %count, 0
  br i1 %1, label %bb1, label %bb2

bb1:                                              ; preds = %start
  store i8 1, ptr %zero_size, align 1
  br label %bb3

bb2:                                              ; preds = %start
  %2 = icmp eq i64 %size, 0
  %3 = zext i1 %2 to i8
  store i8 %3, ptr %zero_size, align 1
  br label %bb3

bb3:                                              ; preds = %bb2, %bb1
  %4 = load i8, ptr %zero_size, align 1
  %is_zst = trunc nuw i8 %4 to i1
; invoke <*const ()>::is_aligned_to
  %_15 = invoke zeroext i1 @_RNvMNtNtCsaWjkfsaqAJ7_4core3ptr9const_ptrPu13is_aligned_toCsdEmYN0yN6GW_4f16b(ptr %src, i64 %align)
          to label %bb15 unwind label %terminate

terminate:                                        ; preds = %bb5, %bb4, %bb3
  %5 = landingpad { ptr, i32 }
          filter [0 x ptr] zeroinitializer
; call core::panicking::panic_cannot_unwind
  call void @_ZN4core9panicking19panic_cannot_unwind17h988270db92395335E() #17
  unreachable

bb15:                                             ; preds = %bb3
  br i1 %_15, label %bb11, label %bb12

bb12:                                             ; preds = %bb15
  br label %bb7

bb11:                                             ; preds = %bb15
  br i1 %is_zst, label %bb13, label %bb14

bb7:                                              ; preds = %bb14, %bb12
  br label %bb8

bb14:                                             ; preds = %bb11
  %_17 = ptrtoint ptr %src to i64
  %_16 = icmp eq i64 %_17, 0
  %_8 = xor i1 %_16, true
  br i1 %_8, label %bb4, label %bb7

bb13:                                             ; preds = %bb11
  br label %bb4

bb4:                                              ; preds = %bb13, %bb14
; invoke <*const ()>::is_aligned_to
  %_18 = invoke zeroext i1 @_RNvMNtNtCsaWjkfsaqAJ7_4core3ptr9const_ptrPu13is_aligned_toCsdEmYN0yN6GW_4f16b(ptr %dst, i64 %align)
          to label %bb20 unwind label %terminate

bb8:                                              ; preds = %bb6, %bb7
  br label %bb9

bb20:                                             ; preds = %bb4
  br i1 %_18, label %bb16, label %bb17

bb17:                                             ; preds = %bb20
  br label %bb6

bb16:                                             ; preds = %bb20
  %6 = load i8, ptr %zero_size, align 1
  %7 = trunc nuw i8 %6 to i1
  br i1 %7, label %bb18, label %bb19

bb6:                                              ; preds = %bb19, %bb17
  br label %bb8

bb19:                                             ; preds = %bb16
  %_20 = ptrtoint ptr %dst to i64
  %_19 = icmp eq i64 %_20, 0
  %_10 = xor i1 %_19, true
  br i1 %_10, label %bb5, label %bb6

bb18:                                             ; preds = %bb16
  br label %bb5

bb5:                                              ; preds = %bb18, %bb19
; invoke core::ub_checks::maybe_is_nonoverlapping::runtime
  %_6 = invoke zeroext i1 @_RNvNvNtCsaWjkfsaqAJ7_4core9ub_checks23maybe_is_nonoverlapping7runtimeCsdEmYN0yN6GW_4f16b(ptr %src, ptr %dst, i64 %size, i64 %count)
          to label %bb21 unwind label %terminate

bb9:                                              ; preds = %bb21, %bb8
; call core::panicking::panic_nounwind_fmt
  call void @_ZN4core9panicking18panic_nounwind_fmt17hdf576476058f9a27E(ptr @alloc_bd3468a7b96187f70c1ce98a3e7a63bf, ptr inttoptr (i64 567 to ptr), i1 zeroext false, ptr align 8 %0) #22
  unreachable

bb21:                                             ; preds = %bb5
  br i1 %_6, label %bb10, label %bb9

bb10:                                             ; preds = %bb21
  ret void
}

; core::hint::assert_unchecked::precondition_check
; Function Attrs: inlinehint nounwind nonlazybind uwtable
define internal void @_RNvNvNtCsaWjkfsaqAJ7_4core4hint16assert_unchecked18precondition_checkCsdEmYN0yN6GW_4f16b(i1 zeroext %cond, ptr align 8 %0) unnamed_addr #5 !guid !81 {
start:
  br i1 %cond, label %bb2, label %bb1

bb1:                                              ; preds = %start
; call core::panicking::panic_nounwind_fmt
  call void @_ZN4core9panicking18panic_nounwind_fmt17hdf576476058f9a27E(ptr @alloc_64e308ef4babfeb8b6220184de794a17, ptr inttoptr (i64 443 to ptr), i1 zeroext false, ptr align 8 %0) #22
  unreachable

bb2:                                              ; preds = %start
  ret void
}

; core::ub_checks::maybe_is_nonoverlapping::runtime
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @_RNvNvNtCsaWjkfsaqAJ7_4core9ub_checks23maybe_is_nonoverlapping7runtimeCsdEmYN0yN6GW_4f16b(ptr %src, ptr %dst, i64 %size, i64 %count) unnamed_addr #1 !guid !82 {
start:
  %diff = alloca [8 x i8], align 8
  %_9 = alloca [16 x i8], align 8
  %src_usize = ptrtoint ptr %src to i64
  %dst_usize = ptrtoint ptr %dst to i64
  %0 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %size, i64 %count)
  %_13.0 = extractvalue { i64, i1 } %0, 0
  %_13.1 = extractvalue { i64, i1 } %0, 1
  br i1 %_13.1, label %bb1, label %bb3

bb3:                                              ; preds = %start
  %1 = getelementptr inbounds i8, ptr %_9, i64 8
  store i64 %_13.0, ptr %1, align 8
  store i64 1, ptr %_9, align 8
  %2 = getelementptr inbounds i8, ptr %_9, i64 8
  %size1 = load i64, ptr %2, align 8
  %_21 = icmp ult i64 %src_usize, %dst_usize
  br i1 %_21, label %bb4, label %bb5

bb1:                                              ; preds = %start
; call core::panicking::panic_nounwind
  call void @_ZN4core9panicking14panic_nounwind17h4d7d7f3e0d5495adE(ptr @alloc_763310d78c99c2c1ad3f8a9821e942f3, i64 61) #22
  unreachable

bb5:                                              ; preds = %bb3
  %3 = sub i64 %src_usize, %dst_usize
  store i64 %3, ptr %diff, align 8
  br label %bb6

bb4:                                              ; preds = %bb3
  %4 = sub i64 %dst_usize, %src_usize
  store i64 %4, ptr %diff, align 8
  br label %bb6

bb6:                                              ; preds = %bb4, %bb5
  %5 = load i64, ptr %diff, align 8
  %_0 = icmp uge i64 %5, %size1
  ret i1 %_0
}

; core::slice::raw::from_raw_parts::precondition_check
; Function Attrs: inlinehint nounwind nonlazybind uwtable
define internal void @_RNvNvNtNtCsaWjkfsaqAJ7_4core5slice3raw14from_raw_parts18precondition_checkCsdEmYN0yN6GW_4f16b(ptr %data, i64 %size, i64 %align, i64 %len, ptr align 8 %0) unnamed_addr #5 personality ptr @rust_eh_personality !guid !83 {
start:
  %max_len = alloca [8 x i8], align 8
; invoke <*const ()>::is_aligned_to
  %_11 = invoke zeroext i1 @_RNvMNtNtCsaWjkfsaqAJ7_4core3ptr9const_ptrPu13is_aligned_toCsdEmYN0yN6GW_4f16b(ptr %data, i64 %align)
          to label %bb8 unwind label %terminate

terminate:                                        ; preds = %start
  %1 = landingpad { ptr, i32 }
          filter [0 x ptr] zeroinitializer
; call core::panicking::panic_cannot_unwind
  call void @_ZN4core9panicking19panic_cannot_unwind17h988270db92395335E() #17
  unreachable

bb8:                                              ; preds = %start
  br i1 %_11, label %bb6, label %bb7

bb7:                                              ; preds = %bb8
  br label %bb4

bb6:                                              ; preds = %bb8
  %_13 = ptrtoint ptr %data to i64
  %_12 = icmp eq i64 %_13, 0
  %_5 = xor i1 %_12, true
  br i1 %_5, label %bb1, label %bb4

bb4:                                              ; preds = %bb6, %bb7
  br label %bb5

bb1:                                              ; preds = %bb6
  %2 = icmp eq i64 %size, 0
  br i1 %2, label %bb9, label %bb10

bb5:                                              ; preds = %bb3, %bb4
; call core::panicking::panic_nounwind_fmt
  call void @_ZN4core9panicking18panic_nounwind_fmt17hdf576476058f9a27E(ptr @alloc_a28e8c8fd5088943a8b5d44af697ff83, ptr inttoptr (i64 559 to ptr), i1 zeroext false, ptr align 8 %0) #22
  unreachable

bb9:                                              ; preds = %bb1
  store i64 -1, ptr %max_len, align 8
  br label %bb11

bb10:                                             ; preds = %bb1
  %3 = udiv i64 9223372036854775807, %size
  store i64 %3, ptr %max_len, align 8
  br label %bb11

bb11:                                             ; preds = %bb10, %bb9
  %4 = load i64, ptr %max_len, align 8
  %_7 = icmp ule i64 %len, %4
  br i1 %_7, label %bb2, label %bb3

bb3:                                              ; preds = %bb11
  br label %bb5

bb2:                                              ; preds = %bb11
  ret void
}

; <core::num::bfloat::f16b as core::default::Default>::default
; Function Attrs: inlinehint nonlazybind uwtable
define internal bfloat @_RNvXs1_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_7default7Default7defaultCsdEmYN0yN6GW_4f16b() unnamed_addr #1 !guid !84 {
start:
  ret bfloat 0.000000e+00
}

; <&alloc::string::String as core::fmt::Debug>::fmt
; Function Attrs: nonlazybind uwtable
define internal zeroext i1 @_RNvXs1g_NtCsaWjkfsaqAJ7_4core3fmtRNtNtCsdv34ydNcq0v_5alloc6string6StringNtB6_5Debug3fmtCsdEmYN0yN6GW_4f16b(ptr align 8 %self, ptr align 8 %f) unnamed_addr #0 !guid !85 {
start:
  %_3 = load ptr, ptr %self, align 8
; call <alloc::string::String as core::fmt::Debug>::fmt
  %_0 = call zeroext i1 @_RNvXsr_NtCsdv34ydNcq0v_5alloc6stringNtB5_6StringNtNtCsaWjkfsaqAJ7_4core3fmt5Debug3fmtCsdEmYN0yN6GW_4f16b(ptr align 8 %_3, ptr align 8 %f) #15
  ret i1 %_0
}

; <&core::num::bfloat::f16b as core::fmt::Debug>::fmt
; Function Attrs: nonlazybind uwtable
define internal zeroext i1 @_RNvXs1g_NtCsaWjkfsaqAJ7_4core3fmtRNtNtNtB8_3num6bfloat4f16bNtB6_5Debug3fmtCsdEmYN0yN6GW_4f16b(ptr align 8 %self, ptr align 8 %f) unnamed_addr #0 !guid !86 {
start:
  %_3 = load ptr, ptr %self, align 8
; call <core::num::bfloat::f16b as core::fmt::Debug>::fmt
  %_0 = call zeroext i1 @_RNvXs5_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3fmt5Debug3fmtCsdEmYN0yN6GW_4f16b(ptr align 2 %_3, ptr align 8 %f) #15
  ret i1 %_0
}

; <&&str as core::fmt::Debug>::fmt
; Function Attrs: nonlazybind uwtable
define internal zeroext i1 @_RNvXs1g_NtCsaWjkfsaqAJ7_4core3fmtRReNtB6_5Debug3fmtCsdEmYN0yN6GW_4f16b(ptr align 8 %self, ptr align 8 %f) unnamed_addr #0 !guid !87 {
start:
  %_3 = load ptr, ptr %self, align 8
; call <&T as core::fmt::Debug>::fmt
  %_0 = call zeroext i1 @"_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h8631e4aa4f4ef90aE"(ptr align 8 %_3, ptr align 8 %f)
  ret i1 %_0
}

; <alloc::string::String as core::cmp::PartialEq<&str>>::eq
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @_RNvXs1y_NtCsdv34ydNcq0v_5alloc6stringNtB6_6StringINtNtCsaWjkfsaqAJ7_4core3cmp9PartialEqReE2eqCsdEmYN0yN6GW_4f16b(ptr align 8 %self, ptr align 8 %other) unnamed_addr #1 !guid !88 {
start:
  %_0 = alloca [1 x i8], align 1
  %0 = getelementptr inbounds i8, ptr %self, i64 8
  %_9 = load ptr, ptr %0, align 8
  %1 = getelementptr inbounds i8, ptr %self, i64 16
  %_8 = load i64, ptr %1, align 8
  %self.0 = load ptr, ptr %other, align 8
  %2 = getelementptr inbounds i8, ptr %other, i64 8
  %self.1 = load i64, ptr %2, align 8
  %_15 = icmp eq i64 %_8, %self.1
  br i1 %_15, label %bb1, label %bb2

bb2:                                              ; preds = %start
  store i8 0, ptr %_0, align 1
  br label %bb3

bb1:                                              ; preds = %start
  %_21 = call i32 @memcmp(ptr %_9, ptr %self.0, i64 %_8)
  %3 = icmp eq i32 %_21, 0
  %4 = zext i1 %3 to i8
  store i8 %4, ptr %_0, align 1
  br label %bb3

bb3:                                              ; preds = %bb1, %bb2
  %5 = load i8, ptr %_0, align 1
  %6 = trunc nuw i8 %5 to i1
  ret i1 %6
}

; <str as alloc::borrow::ToOwned>::to_owned
; Function Attrs: inlinehint nonlazybind uwtable
define internal void @_RNvXs2_NtCsdv34ydNcq0v_5alloc3streNtNtB7_6borrow7ToOwned8to_ownedCsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_0, ptr %self.0, i64 %self.1) unnamed_addr #1 !guid !89 {
start:
  %bytes = alloca [24 x i8], align 8
; call <u8 as <[_]>::to_vec_in::ConvertVec>::to_vec::<alloc::alloc::Global>
  call void @_RINvXs_NvMNtCsdv34ydNcq0v_5alloc5sliceSp9to_vec_inhNtB5_10ConvertVec6to_vecNtNtBa_5alloc6GlobalECsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %bytes, ptr %self.0, i64 %self.1) #15
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %_0, ptr align 8 %bytes, i64 24, i1 false)
  ret void
}

; <core::num::bfloat::f16b as core::cmp::PartialEq>::eq
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @_RNvXs2_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3cmp9PartialEq2eqCsdEmYN0yN6GW_4f16b(ptr align 2 %self, ptr align 2 %other) unnamed_addr #1 !guid !90 {
start:
  %_4 = load bfloat, ptr %self, align 2
  %_9 = bitcast bfloat %_4 to i16
  %_8 = zext i16 %_9 to i32
  %_7 = shl i32 %_8, 16
  %_3 = bitcast i32 %_7 to float
  %_6 = load bfloat, ptr %other, align 2
  %_12 = bitcast bfloat %_6 to i16
  %_11 = zext i16 %_12 to i32
  %_10 = shl i32 %_11, 16
  %_5 = bitcast i32 %_10 to float
  %_0 = fcmp oeq float %_3, %_5
  ret i1 %_0
}

; <core::num::bfloat::f16b as core::cmp::PartialOrd>::partial_cmp
; Function Attrs: inlinehint nonlazybind uwtable
define internal i8 @_RNvXs3_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3cmp10PartialOrd11partial_cmpCsdEmYN0yN6GW_4f16b(ptr align 2 %self, ptr align 2 %other) unnamed_addr #1 !guid !91 {
start:
  %_0 = alloca [1 x i8], align 1
  %value = load bfloat, ptr %self, align 2
  %_11 = bitcast bfloat %value to i16
  %_10 = zext i16 %_11 to i32
  %_9 = shl i32 %_10, 16
  %_4 = bitcast i32 %_9 to float
  %value1 = load bfloat, ptr %other, align 2
  %_14 = bitcast bfloat %value1 to i16
  %_13 = zext i16 %_14 to i32
  %_12 = shl i32 %_13, 16
  %_7 = bitcast i32 %_12 to float
  %_15 = fcmp ole float %_4, %_7
  %_16 = fcmp oge float %_4, %_7
  br i1 %_15, label %bb3, label %bb2

bb2:                                              ; preds = %start
  br i1 %_16, label %bb6, label %bb7

bb3:                                              ; preds = %start
  br i1 %_16, label %bb4, label %bb5

bb7:                                              ; preds = %bb2
  store i8 -2, ptr %_0, align 1
  br label %bb1

bb6:                                              ; preds = %bb2
  store i8 1, ptr %_0, align 1
  br label %bb1

bb1:                                              ; preds = %bb4, %bb5, %bb6, %bb7
  %0 = load i8, ptr %_0, align 1
  ret i8 %0

bb5:                                              ; preds = %bb3
  store i8 -1, ptr %_0, align 1
  br label %bb1

bb4:                                              ; preds = %bb3
  store i8 0, ptr %_0, align 1
  br label %bb1
}

; <f32 as core::convert::From<core::num::bfloat::f16b>>::from
; Function Attrs: inlinehint nonlazybind uwtable
define internal float @_RNvXs4_NtNtCsaWjkfsaqAJ7_4core3num6bfloatfINtNtB9_7convert4FromNtB5_4f16bE4fromCsdEmYN0yN6GW_4f16b(bfloat %value) unnamed_addr #1 !guid !92 {
start:
  %_4 = bitcast bfloat %value to i16
  %_3 = zext i16 %_4 to i32
  %_2 = shl i32 %_3, 16
  %_0 = bitcast i32 %_2 to float
  ret float %_0
}

; <core::num::bfloat::f16b as core::fmt::Debug>::fmt
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @_RNvXs5_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3fmt5Debug3fmtCsdEmYN0yN6GW_4f16b(ptr align 2 %self, ptr align 8 %formatter) unnamed_addr #1 !guid !93 {
start:
  %_4 = alloca [4 x i8], align 4
  %value = load bfloat, ptr %self, align 2
  %_8 = bitcast bfloat %value to i16
  %_7 = zext i16 %_8 to i32
  %_6 = shl i32 %_7, 16
  store i32 %_6, ptr %_4, align 4
; call core::fmt::float::<impl core::fmt::Debug for f32>::fmt
  %_0 = call zeroext i1 @"_ZN4core3fmt5float50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$f32$GT$3fmt17h29568947b0bb8250E"(ptr align 4 %_4, ptr align 8 %formatter)
  ret i1 %_0
}

; <core::num::bfloat::f16b as core::fmt::LowerExp>::fmt
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @_RNvXs6_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3fmt8LowerExp3fmtCsdEmYN0yN6GW_4f16b(ptr align 2 %self, ptr align 8 %formatter) unnamed_addr #1 !guid !94 {
start:
  %_4 = alloca [4 x i8], align 4
  %value = load bfloat, ptr %self, align 2
  %_8 = bitcast bfloat %value to i16
  %_7 = zext i16 %_8 to i32
  %_6 = shl i32 %_7, 16
  store i32 %_6, ptr %_4, align 4
; call core::fmt::float::<impl core::fmt::LowerExp for f32>::fmt
  %_0 = call zeroext i1 @"_ZN4core3fmt5float53_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$f32$GT$3fmt17h7a0f11f4501f8b72E"(ptr align 4 %_4, ptr align 8 %formatter)
  ret i1 %_0
}

; <core::num::bfloat::f16b as core::fmt::UpperExp>::fmt
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @_RNvXs7_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3fmt8UpperExp3fmtCsdEmYN0yN6GW_4f16b(ptr align 2 %self, ptr align 8 %formatter) unnamed_addr #1 !guid !95 {
start:
  %_4 = alloca [4 x i8], align 4
  %value = load bfloat, ptr %self, align 2
  %_8 = bitcast bfloat %value to i16
  %_7 = zext i16 %_8 to i32
  %_6 = shl i32 %_7, 16
  store i32 %_6, ptr %_4, align 4
; call core::fmt::float::<impl core::fmt::UpperExp for f32>::fmt
  %_0 = call zeroext i1 @"_ZN4core3fmt5float53_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$f32$GT$3fmt17h080b6345db86b948E"(ptr align 4 %_4, ptr align 8 %formatter)
  ret i1 %_0
}

; <() as std::process::Termination>::report
; Function Attrs: inlinehint nonlazybind uwtable
define internal i8 @_RNvXsU_NtCs1vn2fv7hoci_3std7processuNtB5_11Termination6reportCsdEmYN0yN6GW_4f16b() unnamed_addr #1 !guid !96 {
start:
  ret i8 0
}

; <alloc::string::String as core::fmt::Debug>::fmt
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @_RNvXsr_NtCsdv34ydNcq0v_5alloc6stringNtB5_6StringNtNtCsaWjkfsaqAJ7_4core3fmt5Debug3fmtCsdEmYN0yN6GW_4f16b(ptr align 8 %self, ptr align 8 %f) unnamed_addr #1 !guid !97 {
start:
  %0 = getelementptr inbounds i8, ptr %self, i64 8
  %_8 = load ptr, ptr %0, align 8
  %1 = getelementptr inbounds i8, ptr %self, i64 16
  %_7 = load i64, ptr %1, align 8
; call <str as core::fmt::Debug>::fmt
  %_0 = call zeroext i1 @"_ZN40_$LT$str$u20$as$u20$core..fmt..Debug$GT$3fmt17h9bd333c3d4946041E"(ptr %_8, i64 %_7, ptr align 8 %f)
  ret i1 %_0
}

; <fn() as core::ops::function::FnOnce<()>>::call_once
; Function Attrs: inlinehint nonlazybind uwtable
define internal void @_RNvYFEuINtNtNtCsaWjkfsaqAJ7_4core3ops8function6FnOnceuE9call_onceCsdEmYN0yN6GW_4f16b(ptr %_1) unnamed_addr #1 !guid !98 {
start:
  %_2 = alloca [0 x i8], align 1
  call void %_1()
  ret void
}

; <std::rt::lang_start<()>::{closure#0} as core::ops::function::FnOnce<()>>::call_once
; Function Attrs: inlinehint nonlazybind uwtable
define internal i32 @_RNvYNCINvNtCs1vn2fv7hoci_3std2rt10lang_startuE0INtNtNtCsaWjkfsaqAJ7_4core3ops8function6FnOnceuE9call_onceCsdEmYN0yN6GW_4f16b(ptr %0) unnamed_addr #1 personality ptr @rust_eh_personality !guid !99 {
start:
  %_2 = alloca [0 x i8], align 1
  %_1 = alloca [8 x i8], align 8
  store ptr %0, ptr %_1, align 8
; call std::rt::lang_start::<()>::{closure#0}
  %_0 = call i32 @_RNCINvNtCs1vn2fv7hoci_3std2rt10lang_startuE0CsdEmYN0yN6GW_4f16b(ptr align 8 %_1) #15
  br label %bb1

bb1:                                              ; preds = %start
  ret i32 %_0

bb3:                                              ; No predecessors!
  unreachable

bb4:                                              ; No predecessors!
  unreachable
}

; <core::num::bfloat::f16b as core::cmp::PartialOrd>::lt
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @_RNvYNtNtNtCsaWjkfsaqAJ7_4core3num6bfloat4f16bNtNtB8_3cmp10PartialOrd2ltCsdEmYN0yN6GW_4f16b(ptr align 2 %self, ptr align 2 %other) unnamed_addr #1 !guid !100 {
start:
  %self1 = alloca [1 x i8], align 1
  %_0 = alloca [1 x i8], align 1
; call <core::num::bfloat::f16b as core::cmp::PartialOrd>::partial_cmp
  %0 = call i8 @_RNvXs3_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3cmp10PartialOrd11partial_cmpCsdEmYN0yN6GW_4f16b(ptr align 2 %self, ptr align 2 %other) #15
  store i8 %0, ptr %self1, align 1
  %1 = load i8, ptr %self1, align 1
  %2 = icmp eq i8 %1, -2
  %_4 = select i1 %2, i64 0, i64 1
  %3 = trunc nuw i64 %_4 to i1
  br i1 %3, label %bb4, label %bb5

bb4:                                              ; preds = %start
  %x = load i8, ptr %self1, align 1
  %4 = icmp slt i8 %x, 0
  %5 = zext i1 %4 to i8
  store i8 %5, ptr %_0, align 1
  br label %bb2

bb5:                                              ; preds = %start
  store i8 0, ptr %_0, align 1
  br label %bb2

bb2:                                              ; preds = %bb4, %bb5
  %6 = load i8, ptr %_0, align 1
  %7 = trunc nuw i8 %6 to i1
  ret i1 %7

bb3:                                              ; No predecessors!
  unreachable
}

; <core::num::bfloat::f16b as core::cmp::PartialEq>::ne
; Function Attrs: inlinehint nonlazybind uwtable
define internal zeroext i1 @_RNvYNtNtNtCsaWjkfsaqAJ7_4core3num6bfloat4f16bNtNtB8_3cmp9PartialEq2neCsdEmYN0yN6GW_4f16b(ptr align 2 %self, ptr align 2 %other) unnamed_addr #1 !guid !101 {
start:
; call <core::num::bfloat::f16b as core::cmp::PartialEq>::eq
  %_3 = call zeroext i1 @_RNvXs2_NtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB5_4f16bNtNtB9_3cmp9PartialEq2eqCsdEmYN0yN6GW_4f16b(ptr align 2 %self, ptr align 2 %other) #15
  %_0 = xor i1 %_3, true
  ret i1 %_0
}

; <<str as alloc::borrow::ToOwned>::to_owned as core::ops::function::FnOnce<(&str,)>>::call_once
; Function Attrs: inlinehint nonlazybind uwtable
define internal void @_RNvYNvYeNtNtCsdv34ydNcq0v_5alloc6borrow7ToOwned8to_ownedINtNtNtCsaWjkfsaqAJ7_4core3ops8function6FnOnceTReEE9call_onceCsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_0, ptr %0, i64 %1) unnamed_addr #1 !guid !102 {
start:
  %_2 = alloca [16 x i8], align 8
  store ptr %0, ptr %_2, align 8
  %2 = getelementptr inbounds i8, ptr %_2, i64 8
  store i64 %1, ptr %2, align 8
  %3 = load ptr, ptr %_2, align 8
  %4 = getelementptr inbounds i8, ptr %_2, i64 8
  %5 = load i64, ptr %4, align 8
; call <str as alloc::borrow::ToOwned>::to_owned
  call void @_RNvXs2_NtCsdv34ydNcq0v_5alloc3streNtNtB7_6borrow7ToOwned8to_ownedCsdEmYN0yN6GW_4f16b(ptr sret([24 x i8]) align 8 %_0, ptr %3, i64 %5) #15
  ret void
}

; Function Attrs: nounwind nonlazybind uwtable
declare i32 @rust_eh_personality(i32, i32, i64, ptr, ptr) unnamed_addr #6

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i64, i1 immarg) #7

; std::rt::lang_start_internal
; Function Attrs: nonlazybind uwtable
declare i64 @_ZN3std2rt19lang_start_internal17he4f5a0bd1413deb2E(ptr, ptr align 8, i64, ptr, i8) unnamed_addr #0

; <alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop
; Function Attrs: nonlazybind uwtable
declare void @"_ZN70_$LT$alloc..vec..Vec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h0feba81f2ea3929bE"(ptr align 8) unnamed_addr #0

; core::panicking::panic_in_cleanup
; Function Attrs: cold minsize noinline noreturn nounwind nonlazybind optsize uwtable
declare void @_ZN4core9panicking16panic_in_cleanup17hb1723739b92501d8E() unnamed_addr #8

; <alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop
; Function Attrs: nonlazybind uwtable
declare void @"_ZN77_$LT$alloc..raw_vec..RawVec$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$4drop17h5166f35166831ea9E"(ptr align 8) unnamed_addr #0

; core::panicking::assert_failed_inner
; Function Attrs: cold minsize noinline noreturn nonlazybind optsize uwtable
declare void @_ZN4core9panicking19assert_failed_inner17hd29e19f36dd1a4dfE(i8, ptr, ptr align 8, ptr, ptr align 8, ptr, ptr, ptr align 8) unnamed_addr #2

; <&T as core::fmt::Debug>::fmt
; Function Attrs: nonlazybind uwtable
declare zeroext i1 @"_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h7bfb83fe036768bbE"(ptr align 8, ptr align 8) unnamed_addr #0

; alloc::fmt::format::format_inner
; Function Attrs: nonlazybind uwtable
declare void @_ZN5alloc3fmt6format12format_inner17h1939683252c66edaE(ptr sret([24 x i8]) align 8, ptr, ptr) unnamed_addr #0

; core::panicking::assert_failed
; Function Attrs: cold minsize noinline noreturn nonlazybind optsize uwtable
declare void @_ZN4core9panicking13assert_failed17h954bb607e8fa2f62E(i8, ptr align 8, ptr align 8, ptr, ptr, ptr align 8) unnamed_addr #2

; core::panicking::assert_failed
; Function Attrs: cold minsize noinline noreturn nonlazybind optsize uwtable
declare void @_ZN4core9panicking13assert_failed17hb4a161b9b8ed4885E(i8, ptr align 4, ptr align 4, ptr, ptr, ptr align 8) unnamed_addr #2

; core::panicking::panic
; Function Attrs: cold noinline noreturn nonlazybind uwtable
declare void @_ZN4core9panicking5panic17h98534be65c42f13aE(ptr, i64, ptr align 8) unnamed_addr #9

; Function Attrs: nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.ctpop.i64(i64) #10

; core::panicking::panic_fmt
; Function Attrs: cold noinline noreturn nonlazybind uwtable
declare void @_ZN4core9panicking9panic_fmt17hba2e70fc52687e14E(ptr, ptr, ptr align 8) unnamed_addr #9

; alloc::raw_vec::RawVecInner<A>::try_allocate_in
; Function Attrs: nonlazybind uwtable
declare void @"_ZN5alloc7raw_vec20RawVecInner$LT$A$GT$15try_allocate_in17ha2b28eb1e6b30393E"(ptr sret([24 x i8]) align 8, i64, i1 zeroext, i64, i64) unnamed_addr #0

; alloc::raw_vec::handle_error
; Function Attrs: cold minsize noreturn nonlazybind optsize uwtable
declare void @_ZN5alloc7raw_vec12handle_error17h2b454d5bf66b113aE(i64, i64) unnamed_addr #11

; core::panicking::panic_nounwind_fmt
; Function Attrs: cold noinline noreturn nounwind nonlazybind uwtable
declare void @_ZN4core9panicking18panic_nounwind_fmt17hdf576476058f9a27E(ptr, ptr, i1 zeroext, ptr align 8) unnamed_addr #12

; core::panicking::panic_cannot_unwind
; Function Attrs: cold minsize noinline noreturn nounwind nonlazybind optsize uwtable
declare void @_ZN4core9panicking19panic_cannot_unwind17h988270db92395335E() unnamed_addr #8

; Function Attrs: nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none)
declare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64) #10

; core::panicking::panic_nounwind
; Function Attrs: cold noinline noreturn nounwind nonlazybind uwtable
declare void @_ZN4core9panicking14panic_nounwind17h4d7d7f3e0d5495adE(ptr, i64) unnamed_addr #12

; <&T as core::fmt::Debug>::fmt
; Function Attrs: nonlazybind uwtable
declare zeroext i1 @"_ZN42_$LT$$RF$T$u20$as$u20$core..fmt..Debug$GT$3fmt17h8631e4aa4f4ef90aE"(ptr align 8, ptr align 8) unnamed_addr #0

; Function Attrs: nonlazybind
declare i32 @memcmp(ptr, ptr, i64) #13

; core::fmt::float::<impl core::fmt::Debug for f32>::fmt
; Function Attrs: nonlazybind uwtable
declare zeroext i1 @"_ZN4core3fmt5float50_$LT$impl$u20$core..fmt..Debug$u20$for$u20$f32$GT$3fmt17h29568947b0bb8250E"(ptr align 4, ptr align 8) unnamed_addr #0

; core::fmt::float::<impl core::fmt::LowerExp for f32>::fmt
; Function Attrs: nonlazybind uwtable
declare zeroext i1 @"_ZN4core3fmt5float53_$LT$impl$u20$core..fmt..LowerExp$u20$for$u20$f32$GT$3fmt17h7a0f11f4501f8b72E"(ptr align 4, ptr align 8) unnamed_addr #0

; core::fmt::float::<impl core::fmt::UpperExp for f32>::fmt
; Function Attrs: nonlazybind uwtable
declare zeroext i1 @"_ZN4core3fmt5float53_$LT$impl$u20$core..fmt..UpperExp$u20$for$u20$f32$GT$3fmt17h080b6345db86b948E"(ptr align 4, ptr align 8) unnamed_addr #0

; <str as core::fmt::Debug>::fmt
; Function Attrs: nonlazybind uwtable
declare zeroext i1 @"_ZN40_$LT$str$u20$as$u20$core..fmt..Debug$GT$3fmt17h9bd333c3d4946041E"(ptr, i64, ptr align 8) unnamed_addr #0

; Function Attrs: nonlazybind
define i32 @main(i32 %0, ptr %1) unnamed_addr #14 !guid !103 {
top:
  %2 = sext i32 %0 to i64
; call std::rt::lang_start::<()>
  %3 = call i64 @_RINvNtCs1vn2fv7hoci_3std2rt10lang_startuECsdEmYN0yN6GW_4f16b(ptr @_RNvCsdEmYN0yN6GW_4f16b4main, i64 %2, ptr %1, i8 0)
  %4 = trunc i64 %3 to i32
  ret i32 %4
}

attributes #0 = { nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #1 = { inlinehint nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #2 = { cold minsize noinline noreturn nonlazybind optsize uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #3 = { noinline nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #4 = { cold nounwind nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #5 = { inlinehint nounwind nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #6 = { nounwind nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #7 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #8 = { cold minsize noinline noreturn nounwind nonlazybind optsize uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #9 = { cold noinline noreturn nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #10 = { nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none) }
attributes #11 = { cold minsize noreturn nonlazybind optsize uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #12 = { cold noinline noreturn nounwind nonlazybind uwtable "probe-stack"="inline-asm" "target-cpu"="x86-64" }
attributes #13 = { nonlazybind }
attributes #14 = { nonlazybind "target-cpu"="x86-64" }
attributes #15 = { inlinehint }
attributes #16 = { cold }
attributes #17 = { cold noreturn nounwind }
attributes #18 = { noinline noreturn }
attributes #19 = { inlinehint nounwind }
attributes #20 = { noinline }
attributes #21 = { noreturn }
attributes #22 = { noinline noreturn nounwind }

!llvm.module.flags = !{!47, !48, !49, !50}
!llvm.ident = !{!51}

!0 = !{i64 -1600652014269271300}
!1 = !{i64 8345009804700450249}
!2 = !{i64 -4283048476990646212}
!3 = !{i64 1812281324224875805}
!4 = !{i64 -8615454875415335154}
!5 = !{i64 -6072390214206484939}
!6 = !{i64 4212728473503912625}
!7 = !{i64 8687534814480052342}
!8 = !{i64 -3332859050758501548}
!9 = !{i64 6064905932967604362}
!10 = !{i64 -6164782504173010874}
!11 = !{i64 6171455564551284217}
!12 = !{i64 57331182440191813}
!13 = !{i64 7696083305018944369}
!14 = !{i64 2473590109890019106}
!15 = !{i64 4714061568689144025}
!16 = !{i64 -4950200390652900058}
!17 = !{i64 -1797015324137493841}
!18 = !{i64 -7421389537945849589}
!19 = !{i64 -1389579835485745230}
!20 = !{i64 -2157908958128370404}
!21 = !{i64 7427355899022169364}
!22 = !{i64 8866309290929709974}
!23 = !{i64 3087399888840100402}
!24 = !{i64 7866957501452891063}
!25 = !{i64 1199063000716462002}
!26 = !{i64 -5169637124435177249}
!27 = !{i64 -5047000417069478556}
!28 = !{i64 6358097874507641222}
!29 = !{i64 1795986484947770218}
!30 = !{i64 -7908243207829118872}
!31 = !{i64 3254291345694053802}
!32 = !{i64 -442772347597461973}
!33 = !{i64 -8001691223326353754}
!34 = !{i64 2654652855857422899}
!35 = !{i64 6207304483455538093}
!36 = !{i64 3270328491864974995}
!37 = !{i64 3240314367516448088}
!38 = !{i64 5470813251506142021}
!39 = !{i64 -7986533308710243069}
!40 = !{i64 -2388470675346722785}
!41 = !{i64 4719660839746538912}
!42 = !{i64 -7567540250891315310}
!43 = !{i64 3092012644709339753}
!44 = !{i64 -2075370187209531734}
!45 = !{i64 2731391045850346708}
!46 = !{i64 -7244322235235400977}
!47 = !{i32 8, !"PIC Level", i32 2}
!48 = !{i32 7, !"PIE Level", i32 2}
!49 = !{i32 2, !"RtLibUseGOT", i32 1}
!50 = !{i32 7, !"uwtable", i32 2}
!51 = !{!"rustc version 1.100.0-dev"}
!52 = !{i64 2190993414255123268}
!53 = !{i64 -5216096826112441296}
!54 = !{i64 -2819747383280818317}
!55 = !{i64 -2922717523717121548}
!56 = !{i64 1919015589277993089}
!57 = !{i64 7562231329930879928}
!58 = !{i64 -7849000705647225723}
!59 = !{i64 5286314641034595886}
!60 = !{i64 746672794381858328}
!61 = !{i64 -5744957986550526761}
!62 = !{i64 -2055088728271863767}
!63 = !{i64 1894077655601776}
!64 = !{i64 6376518008488864321}
!65 = !{i64 -2516207163288084716}
!66 = !{i64 6783690392213912}
!67 = !{i64 -4905183050330012054}
!68 = !{i64 7081091258427492876}
!69 = !{i64 8243682350872234704}
!70 = !{i64 1549954682624708735}
!71 = !{i64 5487261543118255626}
!72 = !{i64 7741550813219712051}
!73 = !{i64 5506677841556589397}
!74 = !{i64 1751642976254446368}
!75 = !{i64 -6598552905552801894}
!76 = !{i64 2844020933670757351}
!77 = !{i64 -2566901761245082560}
!78 = !{i64 8571395726395943360}
!79 = !{i64 2703073062856019271}
!80 = !{i64 8834236740134551569}
!81 = !{i64 -8686574314706043782}
!82 = !{i64 -8085093744195731048}
!83 = !{i64 8437423189465909409}
!84 = !{i64 5855572657481266179}
!85 = !{i64 3692894543584569581}
!86 = !{i64 -2274598545317639146}
!87 = !{i64 850920126583736585}
!88 = !{i64 626937370716295887}
!89 = !{i64 6654037119381032611}
!90 = !{i64 -8717098523617305991}
!91 = !{i64 -3563912024800321297}
!92 = !{i64 -1446556111880312167}
!93 = !{i64 -5014358077104063315}
!94 = !{i64 9070574748963290606}
!95 = !{i64 -5910327364420675218}
!96 = !{i64 6477174526314360098}
!97 = !{i64 7350074399682590350}
!98 = !{i64 -8298791460451316906}
!99 = !{i64 -8493928088893650554}
!100 = !{i64 -4320903058137526984}
!101 = !{i64 -6675916659449452121}
!102 = !{i64 4787674823314775023}
!103 = !{i64 -2624081020897602054}

Getting the text-based assembly on an x86_64 machine some of the functions like fn to_bits(...) look sus (unoptimised);

_RNvMNtNtCsaWjkfsaqAJ7_4core3num6bfloatNtB2_4f16b7to_bitsCsdEmYN0yN6GW_4f16b:
	.cfi_startproc
	pushq	%rax
	.cfi_def_cfa_offset 16
	pextrw	$0, %xmm0, %eax
	movw	%ax, %cx
	movw	%cx, %ax
	shll	$16, %eax
	movd	%eax, %xmm0
	movq	__truncsfbf2@GOTPCREL(%rip), %rax
	callq	*%rax
	pextrw	$0, %xmm0, %eax
	popq	%rcx
	.cfi_def_cfa_offset 8
	retq
	
_RNvXs4_NtNtCsaWjkfsaqAJ7_4core3num6bfloatfINtNtB9_7convert4FromNtB5_4f16bE4fromCsdEmYN0yN6GW_4f16b:
	.cfi_startproc
	pushq	%rax
	.cfi_def_cfa_offset 16
	pextrw	$0, %xmm0, %eax
	movw	%ax, %cx
	movw	%cx, %ax
	shll	$16, %eax
	movd	%eax, %xmm0
	movq	__truncsfbf2@GOTPCREL(%rip), %rax
	callq	*%rax
	pextrw	$0, %xmm0, %eax
	movzwl	%ax, %eax
	shll	$16, %eax
	movd	%eax, %xmm0
	popq	%rax
	.cfi_def_cfa_offset 8
	retq

And then somewhere in main there is a __truncsfbf2 emitted too.

Compiling with -Copt-level=3 removes, the above function definitions and the the __truncsfbf2 calls.

I've added a fixme to the test and -Copt-level=3

@tgross35

Copy link
Copy Markdown
Member

Ah it's the issue beetrees mentioned above, llvm/llvm-project#97896. Unfortunately has_reliable_f16b will need to be set to false on x86 until that is fixed.

(The new -Copt-level=3 can be dropped with that done.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributes Area: Attributes (`#[…]`, `#![…]`) A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-test-infra-minicore Area: `minicore` test auxiliary and `//@ add-core-stubs` A-tidy Area: The tidy tool S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-libs Relevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.