brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.4 KiB · aebacd6 Raw
214 lines · c
1// RUN: %clang_cc1 -std=c23 -triple x86_64-gnu-linux -O3 -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK64,LIN642// RUN: %clang_cc1 -std=c23 -triple x86_64-windows-pc -O3 -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK64,WIN643// RUN: %clang_cc1 -std=c23 -triple i386-gnu-linux -O3 -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,LIN324// RUN: %clang_cc1 -std=c23 -triple i386-windows-pc -O3 -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,WIN325 6// CHECK64: %struct.S1 = type { i32, [4 x i8], [24 x i8] }7// WIN32: %struct.S1 = type { i32, [4 x i8], [24 x i8] }8// LIN32: %struct.S1 = type { i32, [20 x i8] }9// CHECK64: %struct.S2 = type { [40 x i8], i32, [4 x i8] }10// WIN32: %struct.S2 = type { [40 x i8], i32, [4 x i8] }11// LIN32: %struct.S2 = type { [36 x i8], i32 }12// LIN64: %struct.S3 = type { [17 x i8], [7 x i8] }13// WIN64: %struct.S3 = type { [24 x i8] }14 15//GH6220716unsigned _BitInt(1) GlobSize1 = 0;17// CHECK: @GlobSize1 = {{.*}}global i8 018 19// CHECK64: @__const.foo.A = private unnamed_addr constant { i32, [4 x i8], <{ i8, [23 x i8] }> } { i32 1, [4 x i8] zeroinitializer, <{ i8, [23 x i8] }> <{ i8 -86, [23 x i8] zeroinitializer }> }, align 820// @BigGlob = global [40 x i8] c"\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF", align 821// CHECK64: @f.p = internal global <{ i8, i8, [22 x i8] }> <{ i8 16, i8 39, [22 x i8] zeroinitializer }>, align 822 23void GenericTest(_BitInt(3) a, unsigned _BitInt(3) b, _BitInt(4) c) {24  // CHECK: define {{.*}}void @GenericTest25  int which = _Generic(a, _BitInt(3): 1, unsigned _BitInt(3) : 2, _BitInt(4) : 3);26  // CHECK: store i32 127  int which2 = _Generic(b, _BitInt(3): 1, unsigned _BitInt(3) : 2, _BitInt(4) : 3);28  // CHECK: store i32 229  int which3 = _Generic(c, _BitInt(3): 1, unsigned _BitInt(3) : 2, _BitInt(4) : 3);30  // CHECK: store i32 331}32 33void VLATest(_BitInt(3) A, _BitInt(99) B, _BitInt(123) C) {34  // CHECK: define {{.*}}void @VLATest35  int AR1[A];36  // CHECK: %[[A:.+]] = zext i3 %{{.+}} to i[[INDXSIZE:[0-9]+]]37  // CHECK: %[[VLA1:.+]] = alloca i32, i[[INDXSIZE]] %[[A]]38  int AR2[B];39  // CHECK: %[[B:.+]] = trunc i99 %{{.+}} to i[[INDXSIZE]]40  // CHECK: %[[VLA2:.+]] = alloca i32, i[[INDXSIZE]] %[[B]]41  int AR3[C];42  // CHECK: %[[C:.+]] = trunc i123 %{{.+}} to i[[INDXSIZE]]43  // CHECK: %[[VLA3:.+]] = alloca i32, i[[INDXSIZE]] %[[C]]44}45 46struct S {47  _BitInt(17) A;48  _BitInt(128) B;49  _BitInt(17) C;50};51 52void OffsetOfTest(void) {53  // CHECK: define {{.*}}void @OffsetOfTest54  int A = __builtin_offsetof(struct S,A);55  // CHECK: store i32 0, ptr %{{.+}}56  int B = __builtin_offsetof(struct S,B);57  // CHECK64: store i32 8, ptr %{{.+}}58  // LIN32: store i32 4, ptr %{{.+}}59  // WIN32: store i32 8, ptr %{{.+}}60  int C = __builtin_offsetof(struct S,C);61  // CHECK64: store i32 24, ptr %{{.+}}62  // LIN32: store i32 20, ptr %{{.+}}63  // WIN32: store i32 24, ptr %{{.+}}64}65 66void Size1ExtIntParam(unsigned _BitInt(1) A) {67  // CHECK: define {{.*}}void @Size1ExtIntParam(i1{{.*}}  %[[PARAM:.+]])68  // CHECK: %[[PARAM_ADDR:.+]] = alloca i869  // CHECK: %[[B:.+]] = alloca [5 x i8]70  // CHECK: %[[STOREDV:.+]] = zext i1 %[[PARAM]] to i871  // CHECK: store i8 %[[STOREDV]], ptr %[[PARAM_ADDR]]72  unsigned _BitInt(1) B[5];73 74  // CHECK: %[[PARAM_LOAD:.+]] = load i8, ptr %[[PARAM_ADDR]]75  // CHECK: %[[LOADEDV:.+]] = trunc i8 %0 to i176  // CHECK: %[[IDX:.+]] = getelementptr inbounds [5 x i8], ptr %[[B]]77  // CHECK: %[[STOREDV1:.+]] = zext i1 %[[LOADEDV]] to i878  // CHECK: store i8 %[[STOREDV1]], ptr %[[IDX]]79  B[2] = A;80}81 82#if __BITINT_MAXWIDTH__ > 12883struct S1 {84  _BitInt(17) A;85  _BitInt(129) B;86};87 88int foo(int a) {89  // CHECK: %A1 = getelementptr inbounds nuw %struct.S1, ptr %B, i32 0, i32 090  // CHECK: store i32 1, ptr %A191  // CHECK64: %B2 = getelementptr inbounds nuw %struct.S1, ptr %B, i32 0, i32 292  // WIN32: %B2 = getelementptr inbounds nuw %struct.S1, ptr %B, i32 0, i32 293  // LIN32: %B2 = getelementptr inbounds nuw %struct.S1, ptr %B, i32 0, i32 194  // CHECK: %[[V1:.+]] = load i32, ptr %a.addr, align 495  // CHECK: %conv = sext i32 %[[V1]] to i12996  // CHECK64: storedv = sext i129 %conv to i19297  // WIN32: storedv = sext i129 %conv to i19298  // LIN32: storedv = sext i129 %conv to i16099  // CHECK64: store i192 %storedv, ptr %B2, align 8100  // WIN32: store i192 %storedv, ptr %B2, align 8101  // LIN32: store i160 %storedv, ptr %B2, align 4102  // CHECK64: %B3 = getelementptr inbounds nuw %struct.S1, ptr %A, i32 0, i32 2103  // WIN32: %B3 = getelementptr inbounds nuw %struct.S1, ptr %A, i32 0, i32 2104  // LIN32: %B3 = getelementptr inbounds nuw %struct.S1, ptr %A, i32 0, i32 1105  // CHECK64: %[[V2:.+]] = load i192, ptr %B3, align 8106  // WIN32: %[[V2:.+]] = load i192, ptr %B3, align 8107  // LIN32: %[[V2:.+]] = load i160, ptr %B3, align 4108  // CHECK64: %loadedv = trunc i192 %[[V2]] to i129109  // WIN32: %loadedv = trunc i192 %[[V2]] to i129110  // LIN32: %loadedv = trunc i160 %[[V2]] to i129111  // CHECK: %conv4 = trunc i129 %loadedv to i32112  struct S1 A = {1, 170};113  struct S1 B = {1, a};114  return (int)A.B + (int)B.B;115}116 117struct S2 {118  _BitInt(257) A;119  int B;120};121 122_BitInt(257) bar() {123  // CHECK64: define {{.*}}void @bar(ptr {{.*}} sret([40 x i8]) align 8 %[[RET:.+]])124  // CHECK64: %A = alloca %struct.S2, align 8125  // CHECK64: %0 = getelementptr inbounds { <{ i8, [39 x i8] }>, i32, [4 x i8] }, ptr %A, i32 0, i32 0126  // CHECK64: %1 = getelementptr inbounds <{ i8, [39 x i8] }>, ptr %0, i32 0, i32 0127  // CHECK64: store i8 1, ptr %1, align 8128  // CHECK64: %2 = getelementptr inbounds { <{ i8, [39 x i8] }>, i32, [4 x i8] }, ptr %A, i32 0, i32 1129  // CHECK64: store i32 10000, ptr %2, align 8130  // CHECK64: %A1 = getelementptr inbounds nuw %struct.S2, ptr %A, i32 0, i32 0131  // CHECK64: %3 = load i320, ptr %A1, align 8132  // CHECK64: %loadedv = trunc i320 %3 to i257133  // CHECK64: %storedv = sext i257 %loadedv to i320134  // CHECK64: store i320 %storedv, ptr %[[RET]], align 8135  struct S2 A = {1, 10000};136  return A.A;137}138 139void TakesVarargs(int i, ...) {140  // CHECK64: define{{.*}} void @TakesVarargs(i32141__builtin_va_list args;142__builtin_va_start(args, i);143 144_BitInt(160) A = __builtin_va_arg(args, _BitInt(160));145  // CHECK64: %[[ARG:.+]] = load i192146  // CHECK64: %[[TRUNC:.+]] = trunc i192 %[[ARG]] to i160147  // CHECK64: %[[SEXT:.+]] = sext i160 %[[TRUNC]] to i192148  // CHECK64: store i192 %[[SEXT]], ptr %A, align 8149}150 151_BitInt(129) *f1(_BitInt(129) *p) {152  // CHECK64: getelementptr inbounds [24 x i8], {{.*}} i64 1153  return p + 1;154}155 156char *f2(char *p) {157  // CHECK64: getelementptr inbounds nuw i8, {{.*}} i64 24158  return p + sizeof(_BitInt(129));159}160 161auto BigGlob = (_BitInt(257))-1;162// CHECK64: define {{.*}}void @foobar(ptr {{.*}} sret([40 x i8]) align 8 %[[RET1:.+]])163_BitInt(257) foobar() {164  // CHECK64: %A = alloca [40 x i8], align 8165  // CHECK64: %0 = load i320, ptr @BigGlob, align 8166  // CHECK64: %loadedv = trunc i320 %0 to i257167  // CHECK64: %add = add nsw i257 %loadedv, 1168  // CHECK64: %storedv = sext i257 %add to i320169  // CHECK64: store i320 %storedv, ptr %A, align 8170  // CHECK64: %1 = load i320, ptr %A, align 8171  // CHECK64: %loadedv1 = trunc i320 %1 to i257172  // CHECK64: %storedv2 = sext i257 %loadedv1 to i320173  // CHECK64: store i320 %storedv2, ptr %[[RET1]], align 8174  _BitInt(257) A = BigGlob + 1;175  return A;176}177 178void f() {179  static _BitInt(130) p = {10000};180}181 182struct S3 {183  _BitInt (136) A : 129;184};185 186void bitField() {187  struct S3 s = {1};188  struct {189    _BitInt (136) A : 48;190    int a;191  } s1 = {s.A};192  s1.A = 36;193  // LIN64: %s = alloca %struct.S3, align 8194  // LIN64: %s1 = alloca %struct.anon, align 8195  // LIN64: call void @llvm.memcpy.p0.p0.i64(ptr align 8 %s, ptr align 8 @__const.bitField.s, i64 24, i1 false)196  // LIN64: %bf.load = load i136, ptr %s, align 8197  // LIN64: %bf.shl = shl i136 %bf.load, 7198  // LIN64: %bf.ashr = ashr i136 %bf.shl, 7199  // LIN64: %0 = trunc i136 %bf.ashr to i64200  // LIN64: %bf.load1 = load i64, ptr %s1, align 8201  // LIN64: %bf.value = and i64 %0, 281474976710655202  // LIN64: %bf.clear = and i64 %bf.load1, -281474976710656203  // LIN64: %bf.set = or i64 %bf.clear, %bf.value204  // LIN64: store i64 %bf.set, ptr %s1, align 8205  // LIN64: %a = getelementptr inbounds nuw %struct.anon, ptr %s1, i32 0, i32 1206  // LIN64: store i32 0, ptr %a, align 8207  // LIN64: %bf.load2 = load i64, ptr %s1, align 8208  // LIN64: %bf.clear3 = and i64 %bf.load2, -281474976710656209  // LIN64: %bf.set4 = or i64 %bf.clear3, 36210  // LIN64: store i64 %bf.set4, ptr %s1, align 8211}212 213#endif214