1//===- llvm/Transforms/Utils/LowerMemIntrinsics.h ---------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// Lower memset, memcpy, memmov intrinsics to loops (e.g. for targets without 10// library support). 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_TRANSFORMS_UTILS_LOWERMEMINTRINSICS_H 15#define LLVM_TRANSFORMS_UTILS_LOWERMEMINTRINSICS_H 16 17#include <cstdint> 18#include <optional> 19 20namespace llvm { 21 22class AtomicMemCpyInst; 23class ConstantInt; 24class Instruction; 25class MemCpyInst; 26class MemMoveInst; 27class MemSetInst; 28class ScalarEvolution; 29class TargetTransformInfo; 30class Value; 31struct Align; 32 33/// Emit a loop implementing the semantics of llvm.memcpy where the size is not 34/// a compile-time constant. Loop will be insterted at \p InsertBefore. 35void createMemCpyLoopUnknownSize( 36 Instruction *InsertBefore, Value *SrcAddr, Value *DstAddr, Value *CopyLen, 37 Align SrcAlign, Align DestAlign, bool SrcIsVolatile, bool DstIsVolatile, 38 bool CanOverlap, const TargetTransformInfo &TTI, 39 std::optional<unsigned> AtomicSize = std::nullopt); 40 41/// Emit a loop implementing the semantics of an llvm.memcpy whose size is a 42/// compile time constant. Loop is inserted at \p InsertBefore. 43void createMemCpyLoopKnownSize( 44 Instruction *InsertBefore, Value *SrcAddr, Value *DstAddr, 45 ConstantInt *CopyLen, Align SrcAlign, Align DestAlign, bool SrcIsVolatile, 46 bool DstIsVolatile, bool CanOverlap, const TargetTransformInfo &TTI, 47 std::optional<uint32_t> AtomicCpySize = std::nullopt); 48 49/// Expand \p MemCpy as a loop. \p MemCpy is not deleted. 50void expandMemCpyAsLoop(MemCpyInst *MemCpy, const TargetTransformInfo &TTI, 51 ScalarEvolution *SE = nullptr); 52 53/// Expand \p MemMove as a loop. \p MemMove is not deleted. Returns true if the 54/// memmove was lowered. 55bool expandMemMoveAsLoop(MemMoveInst *MemMove, const TargetTransformInfo &TTI); 56 57/// Expand \p MemSet as a loop. \p MemSet is not deleted. 58void expandMemSetAsLoop(MemSetInst *MemSet); 59 60/// Expand \p AtomicMemCpy as a loop. \p AtomicMemCpy is not deleted. 61void expandAtomicMemCpyAsLoop(AtomicMemCpyInst *AtomicMemCpy, 62 const TargetTransformInfo &TTI, 63 ScalarEvolution *SE); 64 65} // End llvm namespace 66 67#endif 68