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