Skip to content

Commit 5250400

Browse files
PawelJurekigcbot
authored andcommitted
Fix for get_global_id calculations
Calculations for functions like get_global_id and get_global_linear_id were done on 32 bit types in some cases. This resulted in overflow when user used a global size greater than UINT_MAX.
1 parent 26987a7 commit 5250400

File tree

1 file changed

+32
-12
lines changed

1 file changed

+32
-12
lines changed

IGC/BiFModule/Implementation/workitem.cl

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ uint __intel_WorkgroupSize()
4040
size_t __intel_EnqueuedWorkgroupSize()
4141
{
4242
size_t totalWorkGroupSize =
43-
__builtin_IB_get_enqueued_local_size(0) *
44-
__builtin_IB_get_enqueued_local_size(1) *
45-
__builtin_IB_get_enqueued_local_size(2);
43+
(size_t) __builtin_IB_get_enqueued_local_size(0) *
44+
(size_t) __builtin_IB_get_enqueued_local_size(1) *
45+
(size_t) __builtin_IB_get_enqueued_local_size(2);
4646

4747
BuiltinAssumeGE0(totalWorkGroupSize);
4848
return totalWorkGroupSize;
@@ -98,8 +98,8 @@ size_t OVERLOADABLE __intel_GlobalInvocationId(uint dim)
9898
return 0;
9999

100100
size_t v =
101-
__builtin_IB_get_group_id(dim) * __builtin_IB_get_enqueued_local_size(dim) +
102-
__intel_LocalInvocationId(dim) + __builtin_IB_get_global_offset(dim);
101+
(size_t) __builtin_IB_get_group_id(dim) * (size_t) __builtin_IB_get_enqueued_local_size(dim) +
102+
(size_t) __intel_LocalInvocationId(dim) + (size_t) __builtin_IB_get_global_offset(dim);
103103

104104
#ifndef NO_ASSUME_SUPPORT
105105
BuiltinAssumeGE0(v);
@@ -252,18 +252,38 @@ size_t SPIRV_OVERLOADABLE SPIRV_BUILTIN_NO_OP(BuiltInGlobalLinearId, , )()
252252
switch (dim) {
253253
default:
254254
case 1:
255-
result = __intel_GlobalInvocationId(0) - __builtin_IB_get_global_offset(0);
255+
{
256+
size_t gid0 = __intel_GlobalInvocationId(0);
257+
size_t globalOffset0 = __builtin_IB_get_global_offset(0);
258+
result = gid0 - globalOffset0;
256259
break;
260+
}
257261
case 2:
258-
result = (__intel_GlobalInvocationId(1) - __builtin_IB_get_global_offset(1))*
259-
__builtin_IB_get_global_size(0) + (__intel_GlobalInvocationId(0) - __builtin_IB_get_global_offset(0));
262+
{
263+
size_t gid0 = __intel_GlobalInvocationId(0);
264+
size_t gid1 = __intel_GlobalInvocationId(1);
265+
size_t globalOffset0 = __builtin_IB_get_global_offset(0);
266+
size_t globalOffset1 = __builtin_IB_get_global_offset(1);
267+
size_t globalSize0 = __builtin_IB_get_global_size(0);
268+
result = (gid1 - globalOffset1) * globalSize0 +
269+
(gid0 - globalOffset0);
260270
break;
271+
}
261272
case 3:
262-
result = ((__intel_GlobalInvocationId(2) - __builtin_IB_get_global_offset(2)) *
263-
__builtin_IB_get_global_size(1) * __builtin_IB_get_global_size(0)) +
264-
((__intel_GlobalInvocationId(1) - __builtin_IB_get_global_offset(1)) * __builtin_IB_get_global_size(0)) +
265-
(__intel_GlobalInvocationId(0) - __builtin_IB_get_global_offset(0));
273+
{
274+
size_t gid0 = __intel_GlobalInvocationId(0);
275+
size_t gid1 = __intel_GlobalInvocationId(1);
276+
size_t gid2 = __intel_GlobalInvocationId(2);
277+
size_t globalOffset0 = __builtin_IB_get_global_offset(0);
278+
size_t globalOffset1 = __builtin_IB_get_global_offset(1);
279+
size_t globalOffset2 = __builtin_IB_get_global_offset(2);
280+
size_t globalSize0 = __builtin_IB_get_global_size(0);
281+
size_t globalSize1 = __builtin_IB_get_global_size(1);
282+
result = ((gid2 - globalOffset2) * globalSize1 * globalSize0) +
283+
((gid1 - globalOffset1) * globalSize0) +
284+
(gid0 - globalOffset0);
266285
break;
286+
}
267287
}
268288

269289
BuiltinAssumeGE0(result);

0 commit comments

Comments
 (0)