// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-cir %s -o %t.cir // RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-llvm %s -o %t-cir.ll // RUN: FileCheck --input-file=%t-cir.ll %s -check-prefix=LLVM // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -emit-llvm %s -o %t.ll // RUN: FileCheck --input-file=%t.ll %s -check-prefix=OGCG // PR5279 - Reduced alignment on typedef. typedef int myint __attribute__((aligned(1))); void test1(myint *p) { *p = 0; } // CIR: cir.func{{.*}} @test1 // CIR: cir.store align(1) // LLVM: @test1 // LLVM: store i32 0, ptr {{.*}}, align 1 // LLVM: ret void // OGCG: @test1 // OGCG: store i32 0, ptr {{.*}}, align 1 // OGCG: ret void typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long long uint64_t; typedef struct { uint16_t i16; uint32_t i32; uint16_t i16_2; uint32_t i32_2; } StructA; void test2(StructA* p) { p->i16 = 1; p->i32 = 2; p->i16_2 = 3; p->i32_2 = 4; } // CIR-LABEL: @test2 // CIR: cir.store align(4) %{{.*}}, %{{.*}} : !u16i, !cir.ptr // CIR: cir.store align(4) %{{.*}}, %{{.*}} : !u32i, !cir.ptr // CIR: cir.store align(4) %{{.*}}, %{{.*}} : !u16i, !cir.ptr // CIR: cir.store align(4) %{{.*}}, %{{.*}} : !u32i, !cir.ptr // LLVM: @test2 // LLVM: store i16 1, ptr {{.*}}, align 4 // LLVM: store i32 2, ptr {{.*}}, align 4 // LLVM: store i16 3, ptr {{.*}}, align 4 // LLVM: store i32 4, ptr {{.*}}, align 4 // OGCG: @test2 // OGCG: store i16 1, ptr {{.*}}, align 4 // OGCG: store i32 2, ptr {{.*}}, align 4 // OGCG: store i16 3, ptr {{.*}}, align 4 // OGCG: store i32 4, ptr {{.*}}, align 4 typedef struct { short a; short b; short c; short d; long e; // Make the struct 8-byte aligned } StructB; void test3(StructB *ptr) { ptr->a = 1; // align 8 ptr->b = 2; // align 2 ptr->c = 3; // align 4 ptr->d = 4; // align 2 } // CIR-LABEL: @test3 // CIR: cir.store align(8) %{{.*}}, %{{.*}} : !s16i, !cir.ptr // CIR: cir.store align(2) %{{.*}}, %{{.*}} : !s16i, !cir.ptr // CIR: cir.store align(4) %{{.*}}, %{{.*}} : !s16i, !cir.ptr // CIR: cir.store align(2) %{{.*}}, %{{.*}} : !s16i, !cir.ptr // LLVM: @test3 // LLVM: store i16 1, ptr {{.*}}, align 8 // LLVM: store i16 2, ptr {{.*}}, align 2 // LLVM: store i16 3, ptr {{.*}}, align 4 // LLVM: store i16 4, ptr {{.*}}, align 2 // OGCG: @test3 // OGCG: store i16 1, ptr {{.*}}, align 8 // OGCG: store i16 2, ptr {{.*}}, align 2 // OGCG: store i16 3, ptr {{.*}}, align 4 // OGCG: store i16 4, ptr {{.*}}, align 2