// #target: macos-x64 module foo; import std::io; struct Test { ushort afff; bitstruct : ushort @overlap { ushort ab : 0..15; char a : 8..15; char b : 0..7; bool c : 7; bool d : 6; bool e : 5; bool f : 4; } } fn void main() { Test test; test.ab = 0xAFBA; io::printfn("%02x %02x -> %04x\n", test.a, test.b, test.ab); io::printfn("%x %x %x %x\n", test.c, test.d, test.e, test.f); } /* #expect: foo.ll define void @foo.main() #0 { entry: %test = alloca %Test, align 2 %varargslots = alloca [3 x %any], align 16 %taddr = alloca i8, align 1 %taddr5 = alloca i8, align 1 %taddr8 = alloca i16, align 2 %retparam = alloca i64, align 8 %varargslots10 = alloca [4 x %any], align 16 %taddr14 = alloca i8, align 1 %taddr18 = alloca i8, align 1 %taddr23 = alloca i8, align 1 %taddr28 = alloca i8, align 1 %retparam30 = alloca i64, align 8 store i16 0, ptr %test, align 2 %ptradd = getelementptr inbounds i8, ptr %test, i64 2 store i16 0, ptr %ptradd, align 2 %ptradd1 = getelementptr inbounds i8, ptr %test, i64 2 %0 = load i16, ptr %ptradd1, align 2 store i16 -20550, ptr %ptradd1, align 2 %ptradd2 = getelementptr inbounds i8, ptr %test, i64 2 %1 = load i16, ptr %ptradd2, align 2 %lshrl = lshr i16 %1, 8 %2 = and i16 255, %lshrl %trunc = trunc i16 %2 to i8 store i8 %trunc, ptr %taddr, align 1 %3 = insertvalue %any undef, ptr %taddr, 0 %4 = insertvalue %any %3, i64 ptrtoint (ptr @"$ct.char" to i64), 1 store %any %4, ptr %varargslots, align 16 %ptradd3 = getelementptr inbounds i8, ptr %test, i64 2 %5 = load i16, ptr %ptradd3, align 2 %6 = and i16 255, %5 %trunc4 = trunc i16 %6 to i8 store i8 %trunc4, ptr %taddr5, align 1 %7 = insertvalue %any undef, ptr %taddr5, 0 %8 = insertvalue %any %7, i64 ptrtoint (ptr @"$ct.char" to i64), 1 %ptradd6 = getelementptr inbounds i8, ptr %varargslots, i64 16 store %any %8, ptr %ptradd6, align 16 %ptradd7 = getelementptr inbounds i8, ptr %test, i64 2 %9 = load i16, ptr %ptradd7, align 2 store i16 %9, ptr %taddr8, align 2 %10 = insertvalue %any undef, ptr %taddr8, 0 %11 = insertvalue %any %10, i64 ptrtoint (ptr @"$ct.ushort" to i64), 1 %ptradd9 = getelementptr inbounds i8, ptr %varargslots, i64 32 store %any %11, ptr %ptradd9, align 16 %12 = call i64 @std.io.printfn(ptr %retparam, ptr @.str, i64 18, ptr %varargslots, i64 3) %ptradd11 = getelementptr inbounds i8, ptr %test, i64 2 %13 = load i16, ptr %ptradd11, align 2 %lshrl12 = lshr i16 %13, 7 %14 = and i16 1, %lshrl12 %trunc13 = trunc i16 %14 to i8 store i8 %trunc13, ptr %taddr14, align 1 %15 = insertvalue %any undef, ptr %taddr14, 0 %16 = insertvalue %any %15, i64 ptrtoint (ptr @"$ct.bool" to i64), 1 store %any %16, ptr %varargslots10, align 16 %ptradd15 = getelementptr inbounds i8, ptr %test, i64 2 %17 = load i16, ptr %ptradd15, align 2 %lshrl16 = lshr i16 %17, 6 %18 = and i16 1, %lshrl16 %trunc17 = trunc i16 %18 to i8 store i8 %trunc17, ptr %taddr18, align 1 %19 = insertvalue %any undef, ptr %taddr18, 0 %20 = insertvalue %any %19, i64 ptrtoint (ptr @"$ct.bool" to i64), 1 %ptradd19 = getelementptr inbounds i8, ptr %varargslots10, i64 16 store %any %20, ptr %ptradd19, align 16 %ptradd20 = getelementptr inbounds i8, ptr %test, i64 2 %21 = load i16, ptr %ptradd20, align 2 %lshrl21 = lshr i16 %21, 5 %22 = and i16 1, %lshrl21 %trunc22 = trunc i16 %22 to i8 store i8 %trunc22, ptr %taddr23, align 1 %23 = insertvalue %any undef, ptr %taddr23, 0 %24 = insertvalue %any %23, i64 ptrtoint (ptr @"$ct.bool" to i64), 1 %ptradd24 = getelementptr inbounds i8, ptr %varargslots10, i64 32 store %any %24, ptr %ptradd24, align 16 %ptradd25 = getelementptr inbounds i8, ptr %test, i64 2 %25 = load i16, ptr %ptradd25, align 2 %lshrl26 = lshr i16 %25, 4 %26 = and i16 1, %lshrl26 %trunc27 = trunc i16 %26 to i8 store i8 %trunc27, ptr %taddr28, align 1 %27 = insertvalue %any undef, ptr %taddr28, 0 %28 = insertvalue %any %27, i64 ptrtoint (ptr @"$ct.bool" to i64), 1 %ptradd29 = getelementptr inbounds i8, ptr %varargslots10, i64 48 store %any %28, ptr %ptradd29, align 16 %29 = call i64 @std.io.printfn(ptr %retparam30, ptr @.str.1, i64 12, ptr %varargslots10, i64 4) ret void }