Skip to content

Commit 782f56d

Browse files
authored
[SYCL][Fusion] Make GID remapping instruction order deterministic (#8626)
C++ does not define the evaluation order of function call arguments, which was causing a different output with different compilers. This fixes this issue and fixes lit test reported here: #8504 (comment).
1 parent 23c518d commit 782f56d

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

sycl-fusion/passes/kernel-fusion/Builtins.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -457,17 +457,20 @@ getOrCreateGetGlobalLinearIDFunction(Module *M, const NDRange &FusedNDRange) {
457457
case 1:
458458
// gid = id0
459459
return GetID(0);
460-
case 2:
460+
case 2: {
461461
// gid = id1 + (id0 * r1)
462+
auto *ID1 = GetID(1);
462463
return Builder.CreateAdd(
463-
GetID(1), Builder.CreateMul(GetID(0), Builder.getInt64(GetGS(1))));
464-
case 3:
465-
// gid = id2 + (id1 * r2) + (id0 * r1 * r2)
466-
return Builder.CreateAdd(
467-
GetID(2), Builder.CreateAdd(
468-
Builder.CreateMul(GetID(1), Builder.getInt64(GetGS(2))),
469-
Builder.CreateMul(
470-
GetID(0), Builder.getInt64(GetGS(1) * GetGS(2)))));
464+
ID1, Builder.CreateMul(GetID(0), Builder.getInt64(GetGS(1))));
465+
}
466+
case 3: {
467+
// gid = (id0 * r1 * r2) + (id1 * r2) + id2
468+
auto *C0 =
469+
Builder.CreateMul(GetID(0), Builder.getInt64(GetGS(1) * GetGS(2)));
470+
auto *C1 = Builder.CreateAdd(
471+
Builder.CreateMul(GetID(1), Builder.getInt64(GetGS(2))), C0);
472+
return Builder.CreateAdd(GetID(2), C1);
473+
}
471474
default:
472475
llvm_unreachable("Invalid number of dimensions");
473476
}

0 commit comments

Comments
 (0)