summaryrefslogtreecommitdiff
path: root/openmp/libomptarget/src/omptarget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'openmp/libomptarget/src/omptarget.cpp')
-rw-r--r--openmp/libomptarget/src/omptarget.cpp5
1 files changed, 3 insertions, 2 deletions
diff --git a/openmp/libomptarget/src/omptarget.cpp b/openmp/libomptarget/src/omptarget.cpp
index 3094e899d0de..04201e8d7a60 100644
--- a/openmp/libomptarget/src/omptarget.cpp
+++ b/openmp/libomptarget/src/omptarget.cpp
@@ -108,8 +108,9 @@ static const int64_t MaxAlignment = 16;
/// Return the alignment requirement of partially mapped structs, see
/// MaxAlignment above.
static uint64_t getPartialStructRequiredAlignment(void *HstPtrBase) {
- auto BaseAlignment = reinterpret_cast<uintptr_t>(HstPtrBase) % MaxAlignment;
- return BaseAlignment == 0 ? MaxAlignment : BaseAlignment;
+ int LowestOneBit = __builtin_ffsl(reinterpret_cast<uintptr_t>(HstPtrBase));
+ uint64_t BaseAlignment = 1 << (LowestOneBit - 1);
+ return MaxAlignment < BaseAlignment ? MaxAlignment : BaseAlignment;
}
/// Map global data and execute pending ctors