// #target: macos-x64 module foo; bitstruct BitFieldCross : char[3] { uint d : 0..4; int a : 5..22; uint c : 23..23; } bitstruct BitFieldCrossU : char[3] { uint d : 0..4; uint a : 5..22; uint c : 23..23; } extern fn void printf(char*, ...); fn void main() { BitFieldCross xx = { 0, -17, 0 }; printf("%d\n", xx.a); xx = { 0x1f, -17, 1 }; printf("%d\n", xx.a); BitFieldCrossU xxu = { 0x1f, 0x15678, 1 }; printf("%x\n", xxu.a); } /* #expect: foo.ll define void @foo_main() #0 { entry: %xx = alloca [3 x i8], align 1 %xxu = alloca [3 x i8], align 1 store [3 x i8] c"\E0\FD\7F", [3 x i8]* %xx, align 1 %0 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %1 = load i8, i8* %0, align 1 %zext = zext i8 %1 to i32 %lshrl = lshr i32 %zext, 5 %2 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %3 = load i8, i8* %2, align 1 %zext1 = zext i8 %3 to i32 %shl = shl i32 %zext1, 3 %4 = or i32 %shl, %lshrl %5 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 %6 = load i8, i8* %5, align 1 %zext2 = zext i8 %6 to i32 %shl3 = shl i32 %zext2, 11 %7 = or i32 %shl3, %4 %shl4 = shl i32 %7, 14 %ashr = ashr i32 %shl4, 14 call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %ashr) store [3 x i8] c"\FF\FD\FF", [3 x i8]* %xx, align 1 %8 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %9 = load i8, i8* %8, align 1 %zext5 = zext i8 %9 to i32 %lshrl6 = lshr i32 %zext5, 5 %10 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %11 = load i8, i8* %10, align 1 %zext7 = zext i8 %11 to i32 %shl8 = shl i32 %zext7, 3 %12 = or i32 %shl8, %lshrl6 %13 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 %14 = load i8, i8* %13, align 1 %zext9 = zext i8 %14 to i32 %shl10 = shl i32 %zext9, 11 %15 = or i32 %shl10, %12 %shl11 = shl i32 %15, 14 %ashr12 = ashr i32 %shl11, 14 call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %ashr12) store [3 x i8] c"\1F\CF\AA", [3 x i8]* %xxu, align 1 %16 = getelementptr inbounds [3 x i8], [3 x i8]* %xxu, i64 0, i64 0 %17 = load i8, i8* %16, align 1 %zext13 = zext i8 %17 to i32 %lshrl14 = lshr i32 %zext13, 5 %18 = getelementptr inbounds [3 x i8], [3 x i8]* %xxu, i64 0, i64 1 %19 = load i8, i8* %18, align 1 %zext15 = zext i8 %19 to i32 %shl16 = shl i32 %zext15, 3 %20 = or i32 %shl16, %lshrl14 %21 = getelementptr inbounds [3 x i8], [3 x i8]* %xxu, i64 0, i64 2 %22 = load i8, i8* %21, align 1 %zext17 = zext i8 %22 to i32 %shl18 = shl i32 %zext17, 11 %23 = or i32 %shl18, %20 %24 = and i32 262143, %23 call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %24) ret void }