Skip to content

Commit f43883b

Browse files
baderNaghasan
andauthored
[SYCL] Don't expose vector of booleans as storage format (#1419)
This reverts commit 1b8c008. Revert "[SYCL] Enable ext_vector_type of boolean type for SYCL language." Replaces vector of booleans with vector of integers to store results of logical/relational operations. Similar change is propagated to SPIR-V built-ins declarations. Signed-off-by: Mariya Podchishchaeva <mariya.podchishchaeva@intel.com> Signed-off-by: Alexey Bader <alexey.bader@intel.com> Co-authored-by: Victor Lomuller <victor@codeplay.com>
1 parent cbd8a72 commit f43883b

File tree

6 files changed

+42
-150
lines changed

6 files changed

+42
-150
lines changed

clang/lib/Sema/SPIRVBuiltins.td

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ def IntLongFloatGenType1 : GenericType<"IntLongFloatGenType1", TLIntLongFloats
367367

368368
// GenType definitions for every single base type (e.g. fp32 only).
369369
// Names are like: GenTypeFloatVecAndScalar.
370-
foreach Type = [Bool, Char, UChar, Short, UShort,
370+
foreach Type = [Char, UChar, SChar, Short, UShort,
371371
Int, UInt, Long, ULong,
372372
Float, Double, Half] in {
373373
foreach VecSizes = [VecAndScalar, VecNoScalar] in {
@@ -816,13 +816,17 @@ foreach name = ["Dot"] in {
816816
}
817817

818818
foreach name = ["Any", "All"] in {
819-
def : SPVBuiltin<name, [Bool, GenTypeBoolVecAndScalar], Attr.Const>;
819+
def : SPVBuiltin<name, [Bool, Bool], Attr.Const>;
820+
def : SPVBuiltin<name, [Bool, GenTypeSCharVecNoScalar], Attr.Const>;
820821
}
821822

822823
foreach name = ["IsNan", "IsInf", "IsFinite", "IsNormal", "SignBitSet"] in {
823-
def : SPVBuiltin<name, [GenTypeBoolVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
824-
def : SPVBuiltin<name, [GenTypeBoolVecAndScalar, GenTypeDoubleVecAndScalar], Attr.Const>;
825-
def : SPVBuiltin<name, [GenTypeBoolVecAndScalar, GenTypeHalfVecAndScalar], Attr.Const>;
824+
def : SPVBuiltin<name, [Bool, Float], Attr.Const>;
825+
def : SPVBuiltin<name, [Bool, Double], Attr.Const>;
826+
def : SPVBuiltin<name, [Bool, Half], Attr.Const>;
827+
def : SPVBuiltin<name, [GenTypeSCharVecNoScalar, GenTypeFloatVecNoScalar], Attr.Const>;
828+
def : SPVBuiltin<name, [GenTypeSCharVecNoScalar, GenTypeDoubleVecNoScalar], Attr.Const>;
829+
def : SPVBuiltin<name, [GenTypeSCharVecNoScalar, GenTypeHalfVecNoScalar], Attr.Const>;
826830
}
827831

828832
foreach name = ["LessOrGreater",
@@ -833,9 +837,12 @@ foreach name = ["LessOrGreater",
833837
"FOrdGreaterThan", "FUnordGreaterThan",
834838
"FOrdLessThanEqual", "FUnordLessThanEqual",
835839
"FOrdGreaterThanEqual", "FUnordGreaterThanEqual"] in {
836-
def : SPVBuiltin<name, [GenTypeBoolVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
837-
def : SPVBuiltin<name, [GenTypeBoolVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar], Attr.Const>;
838-
def : SPVBuiltin<name, [GenTypeBoolVecAndScalar, GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar], Attr.Const>;
840+
def : SPVBuiltin<name, [Bool, Float, Float], Attr.Const>;
841+
def : SPVBuiltin<name, [Bool, Double, Double], Attr.Const>;
842+
def : SPVBuiltin<name, [Bool, Half, Half], Attr.Const>;
843+
def : SPVBuiltin<name, [GenTypeSCharVecNoScalar, GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar], Attr.Const>;
844+
def : SPVBuiltin<name, [GenTypeSCharVecNoScalar, GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar], Attr.Const>;
845+
def : SPVBuiltin<name, [GenTypeSCharVecNoScalar, GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar], Attr.Const>;
839846
}
840847

841848
foreach name = ["BitCount"] in {

clang/lib/Sema/SemaType.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2491,7 +2491,7 @@ QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize,
24912491
// of bool aren't allowed.
24922492
if ((!T->isDependentType() && !T->isIntegerType() &&
24932493
!T->isRealFloatingType()) ||
2494-
(!Context.getLangOpts().SYCLIsDevice && T->isBooleanType())) {
2494+
T->isBooleanType()) {
24952495
Diag(AttrLoc, diag::err_attribute_invalid_vector_type) << T;
24962496
return QualType();
24972497
}

clang/test/CodeGenSYCL/bool-vectors.cpp

Lines changed: 0 additions & 75 deletions
This file was deleted.

clang/test/SemaSYCL/bool-vectors.cpp

Lines changed: 0 additions & 27 deletions
This file was deleted.

sycl/include/CL/sycl/detail/boolean.hpp

Lines changed: 24 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ template <int Num> struct Assigner {
2828
static void init(R &r, const T x) {
2929
Assigner<Num - 1>::template init<R, T, ET>(r, x);
3030
ET v = x.template swizzle<Num>();
31-
r.value[Num] = msbIsSet(v);
31+
r.value[Num] = msbIsSet(v) * (-1);
3232
}
3333
};
3434

@@ -39,15 +39,15 @@ template <> struct Assigner<0> {
3939
template <typename R, typename T, typename ET>
4040
static void init(R &r, const T x) {
4141
ET v = x.template swizzle<0>();
42-
r.value[0] = msbIsSet(v);
42+
r.value[0] = msbIsSet(v) * (-1);
4343
}
4444
};
4545

4646
template <int N> struct Boolean {
4747
static_assert(((N == 2) || (N == 3) || (N == 4) || (N == 8) || (N == 16)),
4848
"Invalid size");
4949

50-
using element_type = bool;
50+
using element_type = int8_t;
5151

5252
#ifdef __SYCL_DEVICE_ONLY__
5353
using DataType = element_type __attribute__((ext_vector_type(N)));
@@ -56,11 +56,11 @@ template <int N> struct Boolean {
5656
using DataType = element_type[N];
5757
#endif
5858

59-
Boolean() : value{false} {}
59+
Boolean() : value{0} {}
6060

6161
Boolean(std::initializer_list<element_type> l) {
6262
for (size_t I = 0; I < N; ++I) {
63-
value[I] = *(l.begin() + I);
63+
value[I] = *(l.begin() + I) ? -1 : 0;
6464
}
6565
}
6666

@@ -70,6 +70,12 @@ template <int N> struct Boolean {
7070
}
7171
}
7272

73+
template <typename T> Boolean(const T rhs) {
74+
static_assert(is_vgeninteger<T>::value, "Invalid constructor");
75+
Assigner<N - 1>::template init<Boolean<N>, T, typename T::element_type>(
76+
*this, rhs);
77+
}
78+
7379
#ifdef __SYCL_DEVICE_ONLY__
7480
// TODO change this to the vectors assignment when the assignment will be
7581
// fixed on Intel GPU NEO OpenCL runtime
@@ -78,64 +84,45 @@ template <int N> struct Boolean {
7884
value[I] = rhs[I];
7985
}
8086
}
81-
#endif
82-
83-
template <typename T> Boolean(const T rhs) {
84-
static_assert(is_vgeninteger<T>::value, "Invalid constructor");
85-
Assigner<N - 1>::template init<Boolean<N>, T, typename T::element_type>(
86-
*this, rhs);
87-
}
8887

89-
#ifdef __SYCL_DEVICE_ONLY__
9088
operator vector_t() const { return value; }
9189
#endif
9290

9391
template <typename T> operator T() const {
9492
static_assert(is_vgeninteger<T>::value, "Invalid conversion");
9593
T r;
9694
Assigner<N - 1>::assign(r, *this);
97-
return r * -1;
95+
return r;
9896
}
9997

10098
private:
10199
template <int Num> friend struct Assigner;
102-
alignas(detail::vector_alignment<bool, N>::value) DataType value;
100+
alignas(detail::vector_alignment<element_type, N>::value) DataType value;
103101
};
104102

105103
template <> struct Boolean<1> {
104+
Boolean() = default;
106105

107-
using element_type = bool;
108-
109-
#ifdef __SYCL_DEVICE_ONLY__
110-
using DataType = element_type;
111-
using vector_t = DataType;
112-
#else
113-
using DataType = element_type;
114-
#endif
115-
116-
Boolean() : value(false) {}
117-
118-
Boolean(const Boolean &rhs) : value(rhs.value) {}
119-
120-
#ifdef __SYCL_DEVICE_ONLY__
121-
Boolean(const vector_t rhs) : value(rhs) {}
122-
#endif
123-
106+
// Build from a signed interger type
124107
template <typename T> Boolean(T val) : value(val) {
125108
static_assert(is_sgeninteger<T>::value, "Invalid constructor");
126109
}
127110

128-
#ifdef __SYCL_DEVICE_ONLY__
129-
operator vector_t() const { return value; }
130-
#endif
131-
111+
// Cast to a signed interger type
132112
template <typename T> operator T() const {
133113
static_assert(is_sgeninteger<T>::value, "Invalid conversion");
134114
return value;
135115
}
136116

117+
#ifdef __SYCL_DEVICE_ONLY__
118+
// Build from a boolean type
119+
Boolean(bool f) : value(f) {}
120+
// Cast to a boolean type
121+
operator bool() const { return value; }
122+
#endif
123+
137124
private:
138-
alignas(1) DataType value;
125+
alignas(1) bool value = false;
139126
};
140127

141128
} // namespace detail

sycl/include/CL/sycl/detail/generic_type_traits.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ convertDataToType(FROM t) {
480480
return TryToGetPointer(t);
481481
}
482482

483-
// Used for all,any and select relational built-in functions
483+
// Used for all, any and select relational built-in functions
484484
template <typename T> inline constexpr T msbMask(T) {
485485
using UT = make_unsigned_t<T>;
486486
return T(UT(1) << (sizeof(T) * 8 - 1));
@@ -559,7 +559,7 @@ struct RelConverter<
559559
#ifdef __SYCL_DEVICE_ONLY__
560560
typename ret_t::vector_t result(0);
561561
for (size_t I = 0; I < N; ++I) {
562-
result[I] = 0 - value[I];
562+
result[I] = value[I];
563563
}
564564
return result;
565565
#else

0 commit comments

Comments
 (0)