| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals all --include-generated-funcs --version 5 |
| // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \ |
| // RUN: spirv-unknown-vulkan-compute %s -emit-llvm -disable-llvm-passes \ |
| // RUN: -o - | FileCheck %s |
| |
| [[vk::constant_id(1)]] |
| const bool bool_const = true; |
| |
| [[vk::constant_id(1)]] |
| const short short_const = 4; |
| |
| [[vk::constant_id(3)]] |
| const int int_const = 5; |
| |
| [[vk::constant_id(4)]] |
| const long long long_const = 8; |
| |
| [[vk::constant_id(5)]] |
| const unsigned short ushort_const = 10; |
| |
| [[vk::constant_id(6)]] |
| const unsigned int uint_const = 12; |
| |
| [[vk::constant_id(7)]] |
| const unsigned long long ulong_const = 25; |
| |
| [[vk::constant_id(8)]] |
| const half half_const = 40.4; |
| |
| [[vk::constant_id(8)]] |
| const float float_const = 50.5; |
| |
| [[vk::constant_id(9)]] |
| const double double_const = 100.2; |
| |
| enum E { |
| e0 = 10, |
| e1 = 20, |
| e2 = 30 |
| }; |
| |
| [[vk::constant_id(10)]] |
| const E enum_const = e2; |
| |
| [numthreads(1,1,1)] |
| void main() { |
| bool b = bool_const; |
| short s = short_const; |
| int i = int_const; |
| long long l = long_const; |
| unsigned short us = ushort_const; |
| unsigned int ui = uint_const; |
| unsigned long long ul = ulong_const; |
| half h = half_const; |
| float f = float_const; |
| double d = double_const; |
| E e = enum_const; |
| } |
| //. |
| // CHECK: @_ZL10bool_const = internal addrspace(10) global i32 0, align 4 |
| // CHECK: @_ZL11short_const = internal addrspace(10) global i16 0, align 2 |
| // CHECK: @_ZL9int_const = internal addrspace(10) global i32 0, align 4 |
| // CHECK: @_ZL10long_const = internal addrspace(10) global i64 0, align 8 |
| // CHECK: @_ZL12ushort_const = internal addrspace(10) global i16 0, align 2 |
| // CHECK: @_ZL10uint_const = internal addrspace(10) global i32 0, align 4 |
| // CHECK: @_ZL11ulong_const = internal addrspace(10) global i64 0, align 8 |
| // CHECK: @_ZL10half_const = internal addrspace(10) global float 0.000000e+00, align 4 |
| // CHECK: @_ZL11float_const = internal addrspace(10) global float 0.000000e+00, align 4 |
| // CHECK: @_ZL12double_const = internal addrspace(10) global double 0.000000e+00, align 8 |
| // CHECK: @_ZL10enum_const = internal addrspace(10) global i32 0, align 4 |
| //. |
| // CHECK-LABEL: define internal spir_func void @_Z4mainv( |
| // CHECK-SAME: ) #[[ATTR0:[0-9]+]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[S:%.*]] = alloca i16, align 2 |
| // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[L:%.*]] = alloca i64, align 8 |
| // CHECK-NEXT: [[US:%.*]] = alloca i16, align 2 |
| // CHECK-NEXT: [[UI:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[UL:%.*]] = alloca i64, align 8 |
| // CHECK-NEXT: [[H:%.*]] = alloca float, align 4 |
| // CHECK-NEXT: [[F:%.*]] = alloca float, align 4 |
| // CHECK-NEXT: [[D:%.*]] = alloca double, align 8 |
| // CHECK-NEXT: [[E:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(10) @_ZL10bool_const, align 4 |
| // CHECK-NEXT: [[LOADEDV:%.*]] = trunc i32 [[TMP1]] to i1 |
| // CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[LOADEDV]] to i32 |
| // CHECK-NEXT: store i32 [[STOREDV]], ptr [[B]], align 4 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i16, ptr addrspace(10) @_ZL11short_const, align 2 |
| // CHECK-NEXT: store i16 [[TMP2]], ptr [[S]], align 2 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(10) @_ZL9int_const, align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[I]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr addrspace(10) @_ZL10long_const, align 8 |
| // CHECK-NEXT: store i64 [[TMP4]], ptr [[L]], align 8 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i16, ptr addrspace(10) @_ZL12ushort_const, align 2 |
| // CHECK-NEXT: store i16 [[TMP5]], ptr [[US]], align 2 |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr addrspace(10) @_ZL10uint_const, align 4 |
| // CHECK-NEXT: store i32 [[TMP6]], ptr [[UI]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i64, ptr addrspace(10) @_ZL11ulong_const, align 8 |
| // CHECK-NEXT: store i64 [[TMP7]], ptr [[UL]], align 8 |
| // CHECK-NEXT: [[TMP8:%.*]] = load float, ptr addrspace(10) @_ZL10half_const, align 4 |
| // CHECK-NEXT: store float [[TMP8]], ptr [[H]], align 4 |
| // CHECK-NEXT: [[TMP9:%.*]] = load float, ptr addrspace(10) @_ZL11float_const, align 4 |
| // CHECK-NEXT: store float [[TMP9]], ptr [[F]], align 4 |
| // CHECK-NEXT: [[TMP10:%.*]] = load double, ptr addrspace(10) @_ZL12double_const, align 8 |
| // CHECK-NEXT: store double [[TMP10]], ptr [[D]], align 8 |
| // CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr addrspace(10) @_ZL10enum_const, align 4 |
| // CHECK-NEXT: store i32 [[TMP11]], ptr [[E]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // CHECK-LABEL: define internal spir_func void @__cxx_global_var_init( |
| // CHECK-SAME: ) #[[ATTR3:[0-9]+]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[TMP1:%.*]] = call i1 @_Z20__spirv_SpecConstantib(i32 1, i1 true) |
| // CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[TMP1]] to i32 |
| // CHECK-NEXT: store i32 [[STOREDV]], ptr addrspace(10) @_ZL10bool_const, align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.1( |
| // CHECK-SAME: ) #[[ATTR3]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[TMP1:%.*]] = call i16 @_Z20__spirv_SpecConstantis(i32 1, i16 4) |
| // CHECK-NEXT: store i16 [[TMP1]], ptr addrspace(10) @_ZL11short_const, align 2 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.2( |
| // CHECK-SAME: ) #[[ATTR3]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[TMP1:%.*]] = call i32 @_Z20__spirv_SpecConstantii(i32 3, i32 5) |
| // CHECK-NEXT: store i32 [[TMP1]], ptr addrspace(10) @_ZL9int_const, align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.3( |
| // CHECK-SAME: ) #[[ATTR3]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[TMP1:%.*]] = call i64 @_Z20__spirv_SpecConstantix(i32 4, i64 8) |
| // CHECK-NEXT: store i64 [[TMP1]], ptr addrspace(10) @_ZL10long_const, align 8 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.4( |
| // CHECK-SAME: ) #[[ATTR3]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[TMP1:%.*]] = call i16 @_Z20__spirv_SpecConstantit(i32 5, i16 10) |
| // CHECK-NEXT: store i16 [[TMP1]], ptr addrspace(10) @_ZL12ushort_const, align 2 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.5( |
| // CHECK-SAME: ) #[[ATTR3]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[TMP1:%.*]] = call i32 @_Z20__spirv_SpecConstantij(i32 6, i32 12) |
| // CHECK-NEXT: store i32 [[TMP1]], ptr addrspace(10) @_ZL10uint_const, align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.6( |
| // CHECK-SAME: ) #[[ATTR3]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[TMP1:%.*]] = call i64 @_Z20__spirv_SpecConstantiy(i32 7, i64 25) |
| // CHECK-NEXT: store i64 [[TMP1]], ptr addrspace(10) @_ZL11ulong_const, align 8 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.7( |
| // CHECK-SAME: ) #[[ATTR3]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[TMP1:%.*]] = call reassoc nnan ninf nsz arcp afn float @_Z20__spirv_SpecConstantiDh(i32 8, float 0x4044333340000000) |
| // CHECK-NEXT: store float [[TMP1]], ptr addrspace(10) @_ZL10half_const, align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.8( |
| // CHECK-SAME: ) #[[ATTR3]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[TMP1:%.*]] = call reassoc nnan ninf nsz arcp afn float @_Z20__spirv_SpecConstantif(i32 8, float 5.050000e+01) |
| // CHECK-NEXT: store float [[TMP1]], ptr addrspace(10) @_ZL11float_const, align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.9( |
| // CHECK-SAME: ) #[[ATTR3]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[TMP1:%.*]] = call reassoc nnan ninf nsz arcp afn double @_Z20__spirv_SpecConstantid(i32 9, double 0x40590CCCC0000000) |
| // CHECK-NEXT: store double [[TMP1]], ptr addrspace(10) @_ZL12double_const, align 8 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.10( |
| // CHECK-SAME: ) #[[ATTR3]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() |
| // CHECK-NEXT: [[TMP1:%.*]] = call i32 @_Z20__spirv_SpecConstantii(i32 10, i32 30) |
| // CHECK-NEXT: store i32 [[TMP1]], ptr addrspace(10) @_ZL10enum_const, align 4 |
| // CHECK-NEXT: ret void |