Skip to content

Commit f53cb84

Browse files
authored
[OpenMP] Use __builtin_bit_cast instead of UB type punning (llvm#122325)
Summary: Use a normal bitcast, remove from the shared utils since it's not available in GCC 7.4
1 parent b57c0ba commit f53cb84

File tree

4 files changed

+25
-25
lines changed

4 files changed

+25
-25
lines changed

offload/DeviceRTL/include/DeviceUtils.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ struct remove_addrspace<T [[clang::address_space(N)]]> : type_identity<T> {};
6060
template <class T>
6161
using remove_addrspace_t = typename remove_addrspace<T>::type;
6262

63+
template <typename To, typename From> inline To bitCast(From V) {
64+
static_assert(sizeof(To) == sizeof(From), "Bad conversion");
65+
return __builtin_bit_cast(To, V);
66+
}
67+
6368
/// Return the value \p Var from thread Id \p SrcLane in the warp if the thread
6469
/// is identified by \p Mask.
6570
int32_t shuffle(uint64_t Mask, int32_t Var, int32_t SrcLane, int32_t Width);

offload/DeviceRTL/include/Synchronization.h

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -98,20 +98,20 @@ template <typename Ty, typename V = utils::remove_addrspace_t<Ty>>
9898
utils::enable_if_t<utils::is_same_v<V, float>, V>
9999
max(Ty *Address, V Val, atomic::OrderingTy Ordering) {
100100
if (Val >= 0)
101-
return utils::convertViaPun<float>(
102-
max((int32_t *)Address, utils::convertViaPun<int32_t>(Val), Ordering));
103-
return utils::convertViaPun<float>(
104-
min((uint32_t *)Address, utils::convertViaPun<uint32_t>(Val), Ordering));
101+
return utils::bitCast<float>(
102+
max((int32_t *)Address, utils::bitCast<int32_t>(Val), Ordering));
103+
return utils::bitCast<float>(
104+
min((uint32_t *)Address, utils::bitCast<uint32_t>(Val), Ordering));
105105
}
106106

107107
template <typename Ty, typename V = utils::remove_addrspace_t<Ty>>
108108
utils::enable_if_t<utils::is_same_v<V, double>, V>
109109
max(Ty *Address, V Val, atomic::OrderingTy Ordering) {
110110
if (Val >= 0)
111-
return utils::convertViaPun<double>(
112-
max((int64_t *)Address, utils::convertViaPun<int64_t>(Val), Ordering));
113-
return utils::convertViaPun<double>(
114-
min((uint64_t *)Address, utils::convertViaPun<uint64_t>(Val), Ordering));
111+
return utils::bitCast<double>(
112+
max((int64_t *)Address, utils::bitCast<int64_t>(Val), Ordering));
113+
return utils::bitCast<double>(
114+
min((uint64_t *)Address, utils::bitCast<uint64_t>(Val), Ordering));
115115
}
116116

117117
template <typename Ty, typename V = utils::remove_addrspace_t<Ty>>
@@ -126,10 +126,10 @@ template <typename Ty, typename V = utils::remove_addrspace_t<Ty>>
126126
utils::enable_if_t<utils::is_same_v<V, float>, V>
127127
min(Ty *Address, V Val, atomic::OrderingTy Ordering) {
128128
if (Val >= 0)
129-
return utils::convertViaPun<float>(
130-
min((int32_t *)Address, utils::convertViaPun<int32_t>(Val), Ordering));
131-
return utils::convertViaPun<float>(
132-
max((uint32_t *)Address, utils::convertViaPun<uint32_t>(Val), Ordering));
129+
return utils::bitCast<float>(
130+
min((int32_t *)Address, utils::bitCast<int32_t>(Val), Ordering));
131+
return utils::bitCast<float>(
132+
max((uint32_t *)Address, utils::bitCast<uint32_t>(Val), Ordering));
133133
}
134134

135135
// TODO: Implement this with __atomic_fetch_max and remove the duplication.
@@ -138,10 +138,10 @@ utils::enable_if_t<utils::is_same_v<V, double>, V>
138138
min(Ty *Address, utils::remove_addrspace_t<Ty> Val,
139139
atomic::OrderingTy Ordering) {
140140
if (Val >= 0)
141-
return utils::convertViaPun<double>(
142-
min((int64_t *)Address, utils::convertViaPun<int64_t>(Val), Ordering));
143-
return utils::convertViaPun<double>(
144-
max((uint64_t *)Address, utils::convertViaPun<uint64_t>(Val), Ordering));
141+
return utils::bitCast<double>(
142+
min((int64_t *)Address, utils::bitCast<int64_t>(Val), Ordering));
143+
return utils::bitCast<double>(
144+
max((uint64_t *)Address, utils::bitCast<uint64_t>(Val), Ordering));
145145
}
146146

147147
template <typename Ty, typename V = utils::remove_addrspace_t<Ty>>

offload/DeviceRTL/src/Mapping.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,8 @@ int ompx_shfl_down_sync_i(uint64_t mask, int var, unsigned delta, int width) {
371371

372372
float ompx_shfl_down_sync_f(uint64_t mask, float var, unsigned delta,
373373
int width) {
374-
return utils::convertViaPun<float>(utils::shuffleDown(
375-
mask, utils::convertViaPun<int32_t>(var), delta, width));
374+
return utils::bitCast<float>(
375+
utils::shuffleDown(mask, utils::bitCast<int32_t>(var), delta, width));
376376
}
377377

378378
long ompx_shfl_down_sync_l(uint64_t mask, long var, unsigned delta, int width) {
@@ -381,8 +381,8 @@ long ompx_shfl_down_sync_l(uint64_t mask, long var, unsigned delta, int width) {
381381

382382
double ompx_shfl_down_sync_d(uint64_t mask, double var, unsigned delta,
383383
int width) {
384-
return utils::convertViaPun<double>(utils::shuffleDown(
385-
mask, utils::convertViaPun<int64_t>(var), delta, width));
384+
return utils::bitCast<double>(
385+
utils::shuffleDown(mask, utils::bitCast<int64_t>(var), delta, width));
386386
}
387387
}
388388

offload/include/Shared/Utils.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,6 @@ inline uint32_t popc(uint64_t V) {
6868
return __builtin_popcountl(V);
6969
}
7070

71-
template <typename DstTy, typename SrcTy> inline DstTy convertViaPun(SrcTy V) {
72-
static_assert(sizeof(DstTy) == sizeof(SrcTy), "Bad conversion");
73-
return *((DstTy *)(&V));
74-
}
75-
7671
} // namespace utils
7772

7873
#endif // OMPTARGET_SHARED_UTILS_H

0 commit comments

Comments
 (0)