// Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "paddle/ir/core/utils.h" namespace ir { std::size_t hash_combine(std::size_t lhs, std::size_t rhs) { return lhs ^= rhs + 0x9e3779b9 + (lhs << 6) + (lhs >> 2); } void *aligned_malloc(size_t size, size_t alignment) { assert(alignment >= sizeof(void *) && (alignment & (alignment - 1)) == 0); size = (size + alignment - 1) / alignment * alignment; #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L void *aligned_mem = nullptr; if (posix_memalign(&aligned_mem, alignment, size) != 0) { aligned_mem = nullptr; } return aligned_mem; #elif defined(_WIN32) return _aligned_malloc(size, alignment); #else void *mem = malloc(size + alignment); if (mem == nullptr) { return nullptr; } size_t adjust = alignment - reinterpret_cast(mem) % alignment; void *aligned_mem = reinterpret_cast(mem) + adjust; *(reinterpret_cast(aligned_mem) - 1) = mem; assert(reinterpret_cast(aligned_mem) % alignment == 0); return aligned_mem; #endif } void aligned_free(void *mem_ptr) { #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L free(mem_ptr); #elif defined(_WIN32) _aligned_free(mem_ptr); #else if (mem_ptr) { free(*(reinterpret_cast(mem_ptr) - 1)); } #endif } } // namespace ir