brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · 7a0b458 Raw
118 lines · plain
1// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-compute -fnative-half-type -fnative-int16-type -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s2 3// Capture the anonymous struct types for check lines below.4// CHECK: [[ANON_1:%.*]] = type <{ float, target("dx.Padding", 12), <4 x i32> }>5// CHECK: [[ANON_2:%.*]] = type <{ <2 x i32>, target("dx.Padding", 8), <{ [3 x <{ %ArrayAndScalar, target("dx.Padding", 12) }>], %ArrayAndScalar }>6 7template <typename T> void use(T);8 9cbuffer CBArrays : register(b2) {10  float c1[30];11  double3 c2[20];12  float16_t c3[10][20];13  uint64_t c4[30];14  int4 c5[20][30][40];15  uint16_t c6[10];16  int64_t c7[20];17  bool c8[40];18}19 20// CHECK-LABEL: define hidden void @_Z8cbarraysv()21void cbarrays() {22  // CHECK: load float, ptr addrspace(2) @c1, align 1623  use(c1[0]);24  // CHECK: load float, ptr addrspace(2) getelementptr (<{ float, target("dx.Padding", 12) }>, ptr addrspace(2) @c1, i32 7, i32 0), align 1625  use(c1[7]);26  // CHECK: load float, ptr addrspace(2) getelementptr (<{ float, target("dx.Padding", 12) }>, ptr addrspace(2) @c1, i32 29, i32 0), align 1627  use(c1[29]);28 29  // CHECK: load <3 x double>, ptr addrspace(2) getelementptr (<{ <3 x double>, target("dx.Padding", 8) }>, ptr addrspace(2) @c2, i32 8, i32 0), align 3230  use(c2[8]);31  // CHECK: load half, ptr addrspace(2) getelementptr (<{ half, target("dx.Padding", 14) }>, ptr addrspace(2) getelementptr (<{ <{ [19 x <{ half, target("dx.Padding", 14) }>], half }>, target("dx.Padding", 14) }>, ptr addrspace(2) @c3, i32 9, i32 0), i32 5, i32 0), align 1632  use(c3[9][5]);33  // CHECK: load i64, ptr addrspace(2) getelementptr (<{ i64, target("dx.Padding", 8) }>, ptr addrspace(2) @c4, i32 6, i32 0), align 1634  use(c4[6]);35  // CHECK:  load <4 x i32>, ptr addrspace(2) getelementptr inbounds ([40 x <4 x i32>], ptr addrspace(2) getelementptr inbounds ([30 x [40 x <4 x i32>]], ptr addrspace(2) getelementptr inbounds ([20 x [30 x [40 x <4 x i32>]]], ptr addrspace(2) @c5, i32 0, i32 1), i32 0, i32 12), i32 0, i32 15), align 1636  use(c5[1][12][15]);37  // CHECK: load i16, ptr addrspace(2) getelementptr (<{ i16, target("dx.Padding", 14) }>, ptr addrspace(2) @c6, i32 4, i32 0), align 1638  use(c6[4]);39  // CHECK: load i64, ptr addrspace(2) getelementptr (<{ i64, target("dx.Padding", 8) }>, ptr addrspace(2) @c7, i32 17, i32 0), align 1640  use(c7[17]);41  // CHECK: load i32, ptr addrspace(2) getelementptr (<{ i32, target("dx.Padding", 12) }>, ptr addrspace(2) @c8, i32 30, i32 0), align 1642  use(c8[30]);43}44 45struct A {46  float2 a1;47};48 49struct B : A {50  uint16_t3 b1;51};52 53struct C {54  int c1;55  A c2;56};57 58struct D {59  B d1[4][6];60};61 62cbuffer CBStructs {63  A s1;64  B s2;65  C s3;66  A s4[5];67  D s5;68};69 70// CHECK-LABEL: define hidden void @_Z9cbstructsv()71void cbstructs() {72  // CHECK: load <2 x float>, ptr addrspace(2) @s1, align 873  use(s1.a1);74  // CHECK: load <3 x i16>, ptr addrspace(2) getelementptr inbounds nuw (%B, ptr addrspace(2) @s2, i32 0, i32 1), align 275  use(s2.b1);76  // CHECK: load <2 x float>, ptr addrspace(2) getelementptr inbounds nuw (%C, ptr addrspace(2) @s3, i32 0, i32 1), align 877  use(s3.c2.a1);78  // CHECK: load <2 x float>, ptr addrspace(2) getelementptr (<{ %A, target("dx.Padding", 8) }>, ptr addrspace(2) @s4, i32 2, i32 0), align 879  use(s4[2].a1);80  // CHECK: load <3 x i16>, ptr addrspace(2) getelementptr inbounds nuw (%B, ptr addrspace(2) getelementptr (<{ %B, target("dx.Padding", 2) }>, ptr addrspace(2) getelementptr (<{ <{ [5 x <{ %B, target("dx.Padding", 2) }>], %B }>, target("dx.Padding", 2) }>, ptr addrspace(2) @s5, i32 3, i32 0), i32 5, i32 0), i32 0, i32 1), align 281  use(s5.d1[3][5].b1);82}83 84struct Scalars {85  float a, b;86};87 88struct ArrayAndScalar {89  uint4 x[5];90  float y;91};92 93cbuffer CBMix {94  Scalars m1[3];95  float m2;96  ArrayAndScalar m3;97  float2 m4[5][4];98  struct { float c; uint4 d; } m5;99  struct { int2 i; ArrayAndScalar j[4]; } m6;100  vector<double, 1> m7;101};102 103// CHECK-LABEL: define hidden void @_Z5cbmixv()104void cbmix() {105  // CHECK: load float, ptr addrspace(2) getelementptr inbounds nuw (%Scalars, ptr addrspace(2) getelementptr (<{ %Scalars, target("dx.Padding", 8) }>, ptr addrspace(2) @m1, i32 2, i32 0), i32 0, i32 1), align 4106  use(m1[2].b);107  // CHECK: load float, ptr addrspace(2) getelementptr inbounds nuw (%ArrayAndScalar, ptr addrspace(2) @m3, i32 0, i32 1), align 4108  use(m3.y);109  // CHECK: load <2 x float>, ptr addrspace(2) getelementptr (<{ <2 x float>, target("dx.Padding", 8) }>, ptr addrspace(2) getelementptr (<{ <{ [3 x <{ <2 x float>, target("dx.Padding", 8) }>], <2 x float> }>, target("dx.Padding", 8) }>, ptr addrspace(2) @m4, i32 2, i32 0), i32 3, i32 0), align 16110  use(m4[2][3]);111  // CHECK: load <4 x i32>, ptr addrspace(2) getelementptr inbounds nuw ([[ANON_1]], ptr addrspace(2) @m5, i32 0, i32 1), align 16112  use(m5.d);113  // CHECK: load <4 x i32>, ptr addrspace(2) getelementptr inbounds ([5 x <4 x i32>], ptr addrspace(2) getelementptr (<{ %ArrayAndScalar, target("dx.Padding", 12) }>, ptr addrspace(2) getelementptr inbounds nuw ([[ANON_2]], ptr addrspace(2) @m6, i32 0, i32 1), i32 2, i32 0), i32 0, i32 2), align 16114  use(m6.j[2].x[2]);115  // CHECK: load <1 x double>, ptr addrspace(2) @m7, align 8116  use(m7);117}118