|
1 |
| -// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s |
| 1 | +// RUN: %clang_cc1 -finclude-default-header -fnative-half-type -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s |
2 | 2 |
|
3 | 3 | struct S {
|
4 | 4 | int X;
|
@@ -245,3 +245,68 @@ export void call12() {
|
245 | 245 | int4 I = {1,2,3,4};
|
246 | 246 | Empty E = (Empty)I;
|
247 | 247 | }
|
| 248 | + |
| 249 | +struct MoreBFields { |
| 250 | + int A; |
| 251 | + uint64_t B: 60; |
| 252 | + float C; |
| 253 | + uint16_t D: 10; |
| 254 | + uint16_t E: 6; |
| 255 | + int : 32; |
| 256 | + double F; |
| 257 | + int : 8; |
| 258 | + uint G; |
| 259 | +}; |
| 260 | + |
| 261 | +// more complicated bitfield case |
| 262 | +// CHECK-LABEL: call13 |
| 263 | +// CHECK: [[AA:%.*]] = alloca i32, align 4 |
| 264 | +// CHECK-NEXT: [[MBF:%.*]] = alloca %struct.MoreBFields, align 1 |
| 265 | +// CHECK-NEXT: store i32 %A, ptr [[AA]], align 4 |
| 266 | +// CHECK-NEXT: [[Z:%.*]] = load i32, ptr [[AA]], align 4 |
| 267 | +// get the gep for the struct. |
| 268 | +// CHECK-NEXT: [[Gep:%.*]] = getelementptr inbounds %struct.MoreBFields, ptr [[MBF]], i32 0 |
| 269 | +// CHECK-NEXT: [[FieldB:%.*]] = getelementptr inbounds nuw %struct.MoreBFields, ptr [[Gep]], i32 0, i32 1 |
| 270 | +// D and E share the same field index |
| 271 | +// CHECK-NEXT: [[FieldD:%.*]] = getelementptr inbounds nuw %struct.MoreBFields, ptr [[Gep]], i32 0, i32 3 |
| 272 | +// CHECK-NEXT: [[FieldE:%.*]] = getelementptr inbounds nuw %struct.MoreBFields, ptr [[Gep]], i32 0, i32 3 |
| 273 | +// CHECK-NEXT: [[FieldA:%.*]] = getelementptr inbounds %struct.MoreBFields, ptr [[MBF]], i32 0, i32 0 |
| 274 | +// CHECK-NEXT: [[FieldC:%.*]] = getelementptr inbounds %struct.MoreBFields, ptr [[MBF]], i32 0, i32 2 |
| 275 | +// CHECK-NEXT: [[FieldF:%.*]] = getelementptr inbounds %struct.MoreBFields, ptr [[MBF]], i32 0, i32 5 |
| 276 | +// CHECK-NEXT: [[FieldG:%.*]] = getelementptr inbounds %struct.MoreBFields, ptr [[MBF]], i32 0, i32 7 |
| 277 | +// store int A into field A |
| 278 | +// CHECK-NEXT: store i32 [[Z]], ptr [[FieldA]], align 4 |
| 279 | +// store int A in bitField B, do necessary conversions |
| 280 | +// CHECK-NEXT: [[Conv:%.*]] = sext i32 [[Z]] to i64 |
| 281 | +// CHECK-NEXT: [[BFL:%.*]] = load i64, ptr [[FieldB]], align 1 |
| 282 | +// CHECK-NEXT: [[BFV:%.*]] = and i64 [[Conv]], 1152921504606846975 |
| 283 | +// CHECK-NEXT: [[BFC:%.*]] = and i64 [[BFL]], -1152921504606846976 |
| 284 | +// CHECK-NEXT: [[BFS:%.*]] = or i64 [[BFC]], [[BFV]] |
| 285 | +// CHECK-NEXT: store i64 [[BFS]], ptr [[FieldB]], align 1 |
| 286 | +// store int A into field C |
| 287 | +// CHECK-NEXT: [[Conv5:%.*]] = sitofp i32 [[Z]] to float |
| 288 | +// CHECK-NEXT: store float [[Conv5]], ptr [[FieldC]], align 4 |
| 289 | +// store int A into bitfield D |
| 290 | +// CHECK-NEXT: [[Conv6:%.*]] = trunc i32 [[Z]] to i16 |
| 291 | +// CHECK-NEXT: [[FDL:%.*]] = load i16, ptr [[FieldD]], align 1 |
| 292 | +// CHECK-NEXT: [[FDV:%.*]] = and i16 [[Conv6]], 1023 |
| 293 | +// CHECK-NEXT: [[FDC:%.*]] = and i16 [[FDL]], -1024 |
| 294 | +// CHECK-NEXT: [[FDS:%.*]] = or i16 [[FDC]], [[FDV]] |
| 295 | +// CHECK-NEXT: store i16 [[FDS]], ptr [[FieldD]], align 1 |
| 296 | +// store int A into bitfield E; |
| 297 | +// CHECK-NEXT: [[Conv11:%.*]] = trunc i32 [[Z]] to i16 |
| 298 | +// CHECK-NEXT: [[FEL:%.*]] = load i16, ptr [[FieldE]], align 1 |
| 299 | +// CHECK-NEXT: [[FEV:%.*]] = and i16 [[Conv11]], 63 |
| 300 | +// CHECK-NEXT: [[FESHL:%.*]] = shl i16 [[FEV]], 10 |
| 301 | +// CHECK-NEXT: [[FEC:%.*]] = and i16 [[FEL]], 1023 |
| 302 | +// CHECK-NEXT: [[FES:%.*]] = or i16 [[FEC]], [[FESHL]] |
| 303 | +// CHECK-NEXT: store i16 [[FES]], ptr [[FieldE]], align 1 |
| 304 | +// store int A into field F |
| 305 | +// CHECK-NEXT: [[Conv16:%.*]] = sitofp i32 [[Z]] to double |
| 306 | +// CHECK-NEXT: store double [[Conv16]], ptr [[FieldF]], align 8 |
| 307 | +// store int A into field G |
| 308 | +// CHECK-NEXT: store i32 [[Z]], ptr [[FieldG]], align 4 |
| 309 | +// CHECK-NEXT: ret void |
| 310 | +export void call13(int A) { |
| 311 | + MoreBFields MBF = (MoreBFields)A; |
| 312 | +} |
0 commit comments