Skip to content

Commit cbdee7a

Browse files
authored
[NFC][SYCL][SYCLLowerIR] Add cl::opt SpecConstantMode for LIT testing (#15821)
This allows testing SpecConstantsPass with different modes.
1 parent 326e54e commit cbdee7a

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

llvm/lib/SYCLLowerIR/SpecConstants.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,21 @@
2929

3030
using namespace llvm;
3131

32+
static cl::opt<SpecConstantsPass::HandlingMode> SpecConstantMode(
33+
"spec-constant-mode", cl::Optional, cl::Hidden,
34+
cl::desc("Specialization constant handling mode"),
35+
cl::init(SpecConstantsPass::HandlingMode::emulation),
36+
cl::values(
37+
clEnumValN(
38+
SpecConstantsPass::HandlingMode::default_values, "default_values",
39+
"Specialization constant uses are replaced by default values"),
40+
clEnumValN(
41+
SpecConstantsPass::HandlingMode::emulation, "emulation",
42+
"Specialization constant intrinsic is replaced by run-time buffer"),
43+
clEnumValN(SpecConstantsPass::HandlingMode::native, "native",
44+
"Specialization constant intrinsic is lowered to SPIR-V "
45+
"intrinsic")));
46+
3247
namespace {
3348

3449
// __sycl* intrinsic names are Itanium ABI-mangled; this is common prefix for
@@ -827,6 +842,9 @@ PreservedAnalyses SpecConstantsPass::run(Module &M,
827842
MapVector<StringRef, MDNode *> SCMetadata;
828843
SmallVector<MDNode *, 4> DefaultsMetadata;
829844

845+
if (SpecConstantMode.getNumOccurrences() > 0)
846+
Mode = SpecConstantMode;
847+
830848
// Iterate through all declarations of instances of function template
831849
// template <typename T> T __sycl_get*SpecConstantValue(const char *ID)
832850
// intrinsic to find its calls and lower them depending on the HandlingMode.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
; RUN: opt -passes=spec-constants -spec-constant-mode=default_values %s -S -o - | FileCheck %s
2+
3+
; This test checks that SpecConstantsPass is able to correctly transform
4+
; SYCL alloca intrinsics in SPIR-V devices when using default values.
5+
6+
%"class.sycl::_V1::specialization_id" = type { i64 }
7+
%"class.sycl::_V1::specialization_id.0" = type { i32 }
8+
%"class.sycl::_V1::specialization_id.1" = type { i16 }
9+
%my_range = type { ptr addrspace(4), ptr addrspace(4) }
10+
11+
@size_i64 = internal addrspace(1) constant %"class.sycl::_V1::specialization_id" { i64 10 }, align 8
12+
@size_i32 = internal addrspace(1) constant %"class.sycl::_V1::specialization_id.0" { i32 120 }, align 4
13+
@size_i16 = internal addrspace(1) constant %"class.sycl::_V1::specialization_id.1" { i16 1 }, align 2
14+
15+
@size_i64_stable_name = private unnamed_addr constant [36 x i8] c"_ZTS14name_generatorIL_Z8size_i64EE\00", align 1
16+
@size_i32_stable_name = private unnamed_addr constant [36 x i8] c"_ZTS14name_generatorIL_Z8size_i32EE\00", align 1
17+
@size_i16_stable_name = private unnamed_addr constant [36 x i8] c"_ZTS14name_generatorIL_Z8size_i16EE\00", align 1
18+
19+
define spir_kernel void @private_alloca() {
20+
; CHECK: alloca double, i32 120, align 8
21+
call ptr @llvm.sycl.alloca.p0.p4.p4.p4.f64(ptr addrspace(4) addrspacecast (ptr @size_i32_stable_name to ptr addrspace(4)), ptr addrspace(4) addrspacecast (ptr addrspace(1) @size_i32 to ptr addrspace(4)), ptr addrspace(4) null, double 0.000000e+00, i64 8)
22+
; CHECK-NEXT: alloca float, i64 10, align 8
23+
call ptr @llvm.sycl.alloca.p0.p4.p4.p4.f32(ptr addrspace(4) addrspacecast (ptr @size_i64_stable_name to ptr addrspace(4)), ptr addrspace(4) addrspacecast (ptr addrspace(1) @size_i64 to ptr addrspace(4)), ptr addrspace(4) null, float 0.000000e+00, i64 8)
24+
; CHECK-NEXT: alloca %my_range, i16 1, align 64
25+
call ptr @llvm.sycl.alloca.p0.p4.p4.p4.s_my_range(ptr addrspace(4) addrspacecast (ptr @size_i16_stable_name to ptr addrspace(4)), ptr addrspace(4) addrspacecast (ptr addrspace(1) @size_i16 to ptr addrspace(4)), ptr addrspace(4) null, %my_range zeroinitializer, i64 64)
26+
ret void
27+
}
28+
29+
declare ptr @llvm.sycl.alloca.p0.p4.p4.p4.f32(ptr addrspace(4), ptr addrspace(4), ptr addrspace(4), float, i64)
30+
declare ptr @llvm.sycl.alloca.p0.p4.p4.p4.f64(ptr addrspace(4), ptr addrspace(4), ptr addrspace(4), double, i64)
31+
declare ptr @llvm.sycl.alloca.p0.p4.p4.p4.s_my_range(ptr addrspace(4), ptr addrspace(4), ptr addrspace(4), %my_range, i64)

0 commit comments

Comments
 (0)