brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.0 KiB · df53d19 Raw
182 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals all --version 52// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=gnu11 -verify -emit-llvm %s -o - | FileCheck %s3// expected-no-diagnostics4 5union U1 {6  int x;7  char y[5];8};9 10struct S1 {11  int x;12  long long y;13};14 15struct S2 {16  unsigned char b1 : 3; // 1st 3 bits (in 1st byte) are b117  unsigned char    : 2; // next 2 bits (in 1st byte) are blocked out as unused18  unsigned char b2 : 6; // 6 bits for b2 - doesn't fit into the 1st byte => starts a 2nd19  unsigned char b3 : 2; // 2 bits for b3 - next (and final) bits in the 2nd byte20  int i;21};22 23struct S3 {24  int x;25} __attribute__((__aligned__(8)));26 27struct S4 {28  int a;29  union U1 b;30};31 32struct S5 {33  char x;34  unsigned char y : 4;35  unsigned char z : 7;36} __attribute__((packed));37 38// Test non-const initializer for union with padding.39// CHECK-LABEL: define dso_local void @test1(40// CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0:[0-9]+]] {41// CHECK-NEXT:  [[ENTRY:.*:]]42// CHECK-NEXT:    [[X_ADDR:%.*]] = alloca i32, align 443// CHECK-NEXT:    [[A:%.*]] = alloca [[UNION_U1:%.*]], align 444// CHECK-NEXT:    store i32 [[X]], ptr [[X_ADDR]], align 445// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 446// CHECK-NEXT:    store i32 [[TMP0]], ptr [[A]], align 447// CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i8, ptr [[A]], i64 448// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP1]], i8 0, i64 4, i1 false)49// CHECK-NEXT:    ret void50//51void test1(int x) {52  union U1 a = {x};53}54 55// Test non-const initializer for struct with padding.56// CHECK-LABEL: define dso_local void @test2(57// CHECK-SAME: i64 noundef [[Y:%.*]]) #[[ATTR0]] {58// CHECK-NEXT:  [[ENTRY:.*:]]59// CHECK-NEXT:    [[Y_ADDR:%.*]] = alloca i64, align 860// CHECK-NEXT:    [[S:%.*]] = alloca [[STRUCT_S1:%.*]], align 861// CHECK-NEXT:    store i64 [[Y]], ptr [[Y_ADDR]], align 862// CHECK-NEXT:    [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_S1]], ptr [[S]], i32 0, i32 063// CHECK-NEXT:    store i32 0, ptr [[X]], align 864// CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i8, ptr [[S]], i64 465// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 4, i1 false)66// CHECK-NEXT:    [[Y1:%.*]] = getelementptr inbounds nuw [[STRUCT_S1]], ptr [[S]], i32 0, i32 167// CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr [[Y_ADDR]], align 868// CHECK-NEXT:    store i64 [[TMP1]], ptr [[Y1]], align 869// CHECK-NEXT:    ret void70//71void test2(long long y) {72  struct S1 s = {.y = y};73}74 75// Test non-const initializer for struct with padding and bit fields.76// CHECK-LABEL: define dso_local void @test3(77// CHECK-SAME: i8 noundef zeroext [[B:%.*]]) #[[ATTR0]] {78// CHECK-NEXT:  [[ENTRY:.*:]]79// CHECK-NEXT:    [[B_ADDR:%.*]] = alloca i8, align 180// CHECK-NEXT:    [[S:%.*]] = alloca [[STRUCT_S2:%.*]], align 481// CHECK-NEXT:    store i8 [[B]], ptr [[B_ADDR]], align 182// CHECK-NEXT:    store i16 0, ptr [[S]], align 483// CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[B_ADDR]], align 184// CHECK-NEXT:    [[TMP1:%.*]] = zext i8 [[TMP0]] to i1685// CHECK-NEXT:    [[BF_LOAD:%.*]] = load i16, ptr [[S]], align 486// CHECK-NEXT:    [[BF_VALUE:%.*]] = and i16 [[TMP1]], 787// CHECK-NEXT:    [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -888// CHECK-NEXT:    [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], [[BF_VALUE]]89// CHECK-NEXT:    store i16 [[BF_SET]], ptr [[S]], align 490// CHECK-NEXT:    [[BF_LOAD1:%.*]] = load i16, ptr [[S]], align 491// CHECK-NEXT:    [[BF_CLEAR2:%.*]] = and i16 [[BF_LOAD1]], -1612992// CHECK-NEXT:    [[BF_SET3:%.*]] = or i16 [[BF_CLEAR2]], 093// CHECK-NEXT:    store i16 [[BF_SET3]], ptr [[S]], align 494// CHECK-NEXT:    [[BF_LOAD4:%.*]] = load i16, ptr [[S]], align 495// CHECK-NEXT:    [[BF_CLEAR5:%.*]] = and i16 [[BF_LOAD4]], 1638396// CHECK-NEXT:    [[BF_SET6:%.*]] = or i16 [[BF_CLEAR5]], 097// CHECK-NEXT:    store i16 [[BF_SET6]], ptr [[S]], align 498// CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i8, ptr [[S]], i64 299// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 2 [[TMP2]], i8 0, i64 2, i1 false)100// CHECK-NEXT:    [[I:%.*]] = getelementptr inbounds nuw [[STRUCT_S2]], ptr [[S]], i32 0, i32 1101// CHECK-NEXT:    store i32 0, ptr [[I]], align 4102// CHECK-NEXT:    ret void103//104void test3(unsigned char b) {105  struct S2 s = {.b1 = b};106}107 108// Test non-const initializer for struct with padding at the end of the struct.109// CHECK-LABEL: define dso_local void @test4(110// CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] {111// CHECK-NEXT:  [[ENTRY:.*:]]112// CHECK-NEXT:    [[X_ADDR:%.*]] = alloca i32, align 4113// CHECK-NEXT:    [[S:%.*]] = alloca [[STRUCT_S3:%.*]], align 8114// CHECK-NEXT:    store i32 [[X]], ptr [[X_ADDR]], align 4115// CHECK-NEXT:    [[X1:%.*]] = getelementptr inbounds nuw [[STRUCT_S3]], ptr [[S]], i32 0, i32 0116// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4117// CHECK-NEXT:    store i32 [[TMP0]], ptr [[X1]], align 8118// CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i8, ptr [[S]], i64 4119// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP1]], i8 0, i64 4, i1 false)120// CHECK-NEXT:    ret void121//122void test4(int x) {123  struct S3 s = {x};124}125 126// Test non-const initializer for union in struct.127// CHECK-LABEL: define dso_local void @test5(128// CHECK-SAME: i32 noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {129// CHECK-NEXT:  [[ENTRY:.*:]]130// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4131// CHECK-NEXT:    [[B_ADDR:%.*]] = alloca i32, align 4132// CHECK-NEXT:    [[S:%.*]] = alloca [[STRUCT_S4:%.*]], align 4133// CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4134// CHECK-NEXT:    store i32 [[B]], ptr [[B_ADDR]], align 4135// CHECK-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_S4]], ptr [[S]], i32 0, i32 0136// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4137// CHECK-NEXT:    store i32 [[TMP0]], ptr [[A1]], align 4138// CHECK-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_S4]], ptr [[S]], i32 0, i32 1139// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[B_ADDR]], align 4140// CHECK-NEXT:    store i32 [[TMP1]], ptr [[B2]], align 4141// CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i8, ptr [[B2]], i64 4142// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP2]], i8 0, i64 4, i1 false)143// CHECK-NEXT:    ret void144//145void test5(int a, int b) {146  struct S4 s = {a, {b}};147}148 149// CHECK-LABEL: define dso_local void @test6(150// CHECK-SAME: i8 noundef signext [[X:%.*]]) #[[ATTR0]] {151// CHECK-NEXT:  [[ENTRY:.*:]]152// CHECK-NEXT:    [[X_ADDR:%.*]] = alloca i8, align 1153// CHECK-NEXT:    [[S:%.*]] = alloca [[STRUCT_S5:%.*]], align 1154// CHECK-NEXT:    store i8 [[X]], ptr [[X_ADDR]], align 1155// CHECK-NEXT:    [[X1:%.*]] = getelementptr inbounds nuw [[STRUCT_S5]], ptr [[S]], i32 0, i32 0156// CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[X_ADDR]], align 1157// CHECK-NEXT:    store i8 [[TMP0]], ptr [[X1]], align 1158// CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i8, ptr [[S]], i64 1159// CHECK-NEXT:    store i16 0, ptr [[TMP1]], align 1160// CHECK-NEXT:    [[Y:%.*]] = getelementptr inbounds nuw [[STRUCT_S5]], ptr [[S]], i32 0, i32 1161// CHECK-NEXT:    [[BF_LOAD:%.*]] = load i16, ptr [[Y]], align 1162// CHECK-NEXT:    [[BF_CLEAR:%.*]] = and i16 [[BF_LOAD]], -16163// CHECK-NEXT:    [[BF_SET:%.*]] = or i16 [[BF_CLEAR]], 0164// CHECK-NEXT:    store i16 [[BF_SET]], ptr [[Y]], align 1165// CHECK-NEXT:    [[Z:%.*]] = getelementptr inbounds nuw [[STRUCT_S5]], ptr [[S]], i32 0, i32 1166// CHECK-NEXT:    [[BF_LOAD2:%.*]] = load i16, ptr [[Z]], align 1167// CHECK-NEXT:    [[BF_CLEAR3:%.*]] = and i16 [[BF_LOAD2]], -2033168// CHECK-NEXT:    [[BF_SET4:%.*]] = or i16 [[BF_CLEAR3]], 0169// CHECK-NEXT:    store i16 [[BF_SET4]], ptr [[Z]], align 1170// CHECK-NEXT:    ret void171//172void test6(char x) {173  struct S5 s = {.x = x};174}175//.176// CHECK: attributes #[[ATTR0]] = { noinline nounwind optnone "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }177// CHECK: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) }178//.179// CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}180// CHECK: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}181//.182