| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 6 |
| // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -disable-llvm-passes -emit-llvm -finclude-default-header -o - %s | FileCheck %s |
| |
| // CHECK-LABEL: define hidden noundef nofpclass(nan inf) <6 x float> @_Z5case1v( |
| // CHECK-SAME: ) #[[ATTR0:[0-9]+]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: ret <6 x float> <float 0.000000e+00, float 2.000000e+00, float 4.000000e+00, float 1.000000e+00, float 3.000000e+00, float 5.000000e+00> |
| // |
| float3x2 case1() { |
| // vec[0] = 0 |
| // vec[1] = 2 |
| // vec[2] = 4 |
| // vec[3] = 1 |
| // vec[4] = 3 |
| // vec[5] = 5 |
| return float3x2(0, 1, |
| 2, 3, |
| 4, 5); |
| } |
| |
| |
| RWStructuredBuffer<float> In; |
| |
| // CHECK-LABEL: define hidden noundef nofpclass(nan inf) <6 x float> @_Z5case2v( |
| // CHECK-SAME: ) #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 0) #[[ATTR3:[0-9]+]] |
| // CHECK-NEXT: [[CALL1:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 1) #[[ATTR3]] |
| // CHECK-NEXT: [[CALL2:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 2) #[[ATTR3]] |
| // CHECK-NEXT: [[CALL3:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 3) #[[ATTR3]] |
| // CHECK-NEXT: [[CALL4:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 4) #[[ATTR3]] |
| // CHECK-NEXT: [[CALL5:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr noundef nonnull align 4 dereferenceable(8) @_ZL2In, i32 noundef 5) #[[ATTR3]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[CALL]], align 4 |
| // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <6 x float> poison, float [[TMP0]], i32 0 |
| // CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[CALL2]], align 4 |
| // CHECK-NEXT: [[VECINIT6:%.*]] = insertelement <6 x float> [[VECINIT]], float [[TMP1]], i32 1 |
| // CHECK-NEXT: [[TMP2:%.*]] = load float, ptr [[CALL4]], align 4 |
| // CHECK-NEXT: [[VECINIT7:%.*]] = insertelement <6 x float> [[VECINIT6]], float [[TMP2]], i32 2 |
| // CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[CALL1]], align 4 |
| // CHECK-NEXT: [[VECINIT8:%.*]] = insertelement <6 x float> [[VECINIT7]], float [[TMP3]], i32 3 |
| // CHECK-NEXT: [[TMP4:%.*]] = load float, ptr [[CALL3]], align 4 |
| // CHECK-NEXT: [[VECINIT9:%.*]] = insertelement <6 x float> [[VECINIT8]], float [[TMP4]], i32 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load float, ptr [[CALL5]], align 4 |
| // CHECK-NEXT: [[VECINIT10:%.*]] = insertelement <6 x float> [[VECINIT9]], float [[TMP5]], i32 5 |
| // CHECK-NEXT: ret <6 x float> [[VECINIT10]] |
| // |
| float3x2 case2() { |
| // vec[0] = Call |
| // vec[1] = Call2 |
| // vec[2] = Call4 |
| // vec[3] = Call1 |
| // vec[4] = Call3 |
| // vec[5] = Call5 |
| return float3x2(In[0], In[1], |
| In[2], In[3], |
| In[4], In[5]); |
| } |
| |
| |
| // CHECK-LABEL: define hidden noundef nofpclass(nan inf) <6 x float> @_Z5case3Dv3_fS_( |
| // CHECK-SAME: <3 x float> noundef nofpclass(nan inf) [[A:%.*]], <3 x float> noundef nofpclass(nan inf) [[B:%.*]]) #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[A_ADDR:%.*]] = alloca <3 x float>, align 16 |
| // CHECK-NEXT: [[B_ADDR:%.*]] = alloca <3 x float>, align 16 |
| // CHECK-NEXT: store <3 x float> [[A]], ptr [[A_ADDR]], align 16 |
| // CHECK-NEXT: store <3 x float> [[B]], ptr [[B_ADDR]], align 16 |
| // CHECK-NEXT: [[TMP0:%.*]] = load <3 x float>, ptr [[A_ADDR]], align 16 |
| // CHECK-NEXT: [[VECEXT:%.*]] = extractelement <3 x float> [[TMP0]], i64 0 |
| // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <6 x float> poison, float [[VECEXT]], i32 0 |
| // CHECK-NEXT: [[TMP1:%.*]] = load <3 x float>, ptr [[A_ADDR]], align 16 |
| // CHECK-NEXT: [[VECEXT1:%.*]] = extractelement <3 x float> [[TMP1]], i64 2 |
| // CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <6 x float> [[VECINIT]], float [[VECEXT1]], i32 1 |
| // CHECK-NEXT: [[TMP2:%.*]] = load <3 x float>, ptr [[B_ADDR]], align 16 |
| // CHECK-NEXT: [[VECEXT3:%.*]] = extractelement <3 x float> [[TMP2]], i64 1 |
| // CHECK-NEXT: [[VECINIT4:%.*]] = insertelement <6 x float> [[VECINIT2]], float [[VECEXT3]], i32 2 |
| // CHECK-NEXT: [[TMP3:%.*]] = load <3 x float>, ptr [[A_ADDR]], align 16 |
| // CHECK-NEXT: [[VECEXT5:%.*]] = extractelement <3 x float> [[TMP3]], i64 1 |
| // CHECK-NEXT: [[VECINIT6:%.*]] = insertelement <6 x float> [[VECINIT4]], float [[VECEXT5]], i32 3 |
| // CHECK-NEXT: [[TMP4:%.*]] = load <3 x float>, ptr [[B_ADDR]], align 16 |
| // CHECK-NEXT: [[VECEXT7:%.*]] = extractelement <3 x float> [[TMP4]], i64 0 |
| // CHECK-NEXT: [[VECINIT8:%.*]] = insertelement <6 x float> [[VECINIT6]], float [[VECEXT7]], i32 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load <3 x float>, ptr [[B_ADDR]], align 16 |
| // CHECK-NEXT: [[VECEXT9:%.*]] = extractelement <3 x float> [[TMP5]], i64 2 |
| // CHECK-NEXT: [[VECINIT10:%.*]] = insertelement <6 x float> [[VECINIT8]], float [[VECEXT9]], i32 5 |
| // CHECK-NEXT: ret <6 x float> [[VECINIT10]] |
| // |
| float3x2 case3(float3 a, float3 b) { |
| // vec[0] = A[0] |
| // vec[1] = A[2] |
| // vec[2] = B[1] |
| // vec[3] = A[1] |
| // vec[4] = B[0] |
| // vec[5] = B[2] |
| return float3x2(a,b); |
| } |