| // RUN: %clang_cc1 %s -triple x86_64-unknown-linux-gnu -std=c23 -emit-llvm -o - | FileCheck %s |
| |
| struct Bits { |
| int pad1: 30; |
| bool b: 1; |
| int pad2: 1; |
| }; |
| |
| int main(void) { |
| // CHECK-LABEL: define dso_local i32 @main() #0 { |
| struct Bits x; |
| x.b += __builtin_complex(-1.0f, 0.0f); |
| // CHECK: %bf.load = load i32, ptr %x, align 4 |
| // CHECK-NEXT: %bf.lshr = lshr i32 %bf.load, 30 |
| // CHECK-NEXT: %bf.clear = and i32 %bf.lshr, 1 |
| // CHECK-NEXT: %bf.cast = trunc i32 %bf.clear to i1 |
| // CHECK-NEXT: %conv = uitofp i1 %bf.cast to float |
| |
| // CHECK: %0 = zext i1 %tobool1 to i32 |
| // CHECK-NEXT: %bf.load2 = load i32, ptr %x, align 4 |
| // CHECK-NEXT: %bf.shl = shl i32 %0, 30 |
| // CHECK-NEXT: %bf.clear3 = and i32 %bf.load2, -1073741825 |
| // CHECK-NEXT: %bf.set = or i32 %bf.clear3, %bf.shl |
| // CHECK-NEXT: store i32 %bf.set, ptr %x, align 4 |
| } |