@@ -49,12 +49,16 @@ class SYCLLowerWGLocalMemoryLegacy : public ModulePass {
49
49
};
50
50
} // namespace
51
51
52
+ static bool usesKernelArgForDynWGLocalMem (const Triple &TT) {
53
+ return TT.isSPIROrSPIRV ();
54
+ }
55
+
52
56
std::vector<std::pair<StringRef, int >>
53
57
sycl::getKernelNamesUsingImplicitLocalMem (const Module &M) {
54
58
std::vector<std::pair<StringRef, int >> SPIRKernelNames;
55
59
Triple TT (M.getTargetTriple ());
56
60
57
- if (TT. isSPIROrSPIRV ( )) {
61
+ if (usesKernelArgForDynWGLocalMem (TT )) {
58
62
auto GetArgumentPos = [&](const Function &F) -> int {
59
63
for (const Argument &Arg : F.args ())
60
64
if (F.getAttributes ().hasParamAttr (Arg.getArgNo (),
@@ -129,7 +133,7 @@ lowerDynamicLocalMemCallDirect(CallInst *CI, Triple TT,
129
133
130
134
Value *GVPtr = [&]() -> Value * {
131
135
IRBuilder<> Builder (CI);
132
- if (TT. isSPIROrSPIRV ( ))
136
+ if (usesKernelArgForDynWGLocalMem (TT ))
133
137
return Builder.CreateLoad (CI->getType (), LocalMemPlaceholder);
134
138
135
139
return Builder.CreatePointerCast (LocalMemPlaceholder, CI->getType ());
@@ -188,32 +192,33 @@ static bool dynamicWGLocalMemory(Module &M) {
188
192
if (!LocalMemArrayGV) {
189
193
assert (DLMFunc->isDeclaration () && " should have declaration only" );
190
194
Type *LocalMemArrayTy =
191
- TT. isSPIROrSPIRV ( )
195
+ usesKernelArgForDynWGLocalMem (TT )
192
196
? static_cast <Type *>(PointerType::get (M.getContext (), LocalAS))
193
197
: static_cast <Type *>(
194
198
ArrayType::get (Type::getInt8Ty (M.getContext ()), 0 ));
195
199
LocalMemArrayGV = new GlobalVariable (
196
200
M, // module
197
201
LocalMemArrayTy, // type
198
202
false , // isConstant
199
- TT.isSPIROrSPIRV () ? GlobalValue::LinkOnceODRLinkage
200
- : GlobalValue::ExternalLinkage, // Linkage
201
- TT.isSPIROrSPIRV () ? UndefValue::get (LocalMemArrayTy)
202
- : nullptr , // Initializer
203
- DYNAMIC_LOCALMEM_GV, // Name prefix
204
- nullptr , // InsertBefore
205
- GlobalVariable::NotThreadLocal, // ThreadLocalMode
206
- LocalAS // AddressSpace
203
+ usesKernelArgForDynWGLocalMem (TT)
204
+ ? GlobalValue::LinkOnceODRLinkage
205
+ : GlobalValue::ExternalLinkage, // Linkage
206
+ usesKernelArgForDynWGLocalMem (TT) ? UndefValue::get (LocalMemArrayTy)
207
+ : nullptr , // Initializer
208
+ DYNAMIC_LOCALMEM_GV, // Name prefix
209
+ nullptr , // InsertBefore
210
+ GlobalVariable::NotThreadLocal, // ThreadLocalMode
211
+ LocalAS // AddressSpace
207
212
);
208
213
LocalMemArrayGV->setUnnamedAddr (GlobalVariable::UnnamedAddr::Local);
209
214
constexpr int DefaultMaxAlignment = 128 ;
210
- if (!TT. isSPIROrSPIRV ( ))
215
+ if (!usesKernelArgForDynWGLocalMem (TT ))
211
216
LocalMemArrayGV->setAlignment (Align{DefaultMaxAlignment});
212
217
}
213
218
lowerLocalMemCall (DLMFunc, [&](CallInst *CI) {
214
219
lowerDynamicLocalMemCallDirect (CI, TT, LocalMemArrayGV);
215
220
});
216
- if (TT. isSPIROrSPIRV ( )) {
221
+ if (usesKernelArgForDynWGLocalMem (TT )) {
217
222
SmallVector<Function *, 4 > Kernels;
218
223
llvm::for_each (M.functions (), [&](Function &F) {
219
224
if (F.getCallingConv () == CallingConv::SPIR_KERNEL &&
0 commit comments