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 17namespace llvm { 18 19class ConstantInt; 20class Instruction; 21class MemCpyInst; 22class MemMoveInst; 23class MemSetInst; 24class TargetTransformInfo; 25class Value; 26 27/// Emit a loop implementing the semantics of llvm.memcpy where the size is not 28/// a compile-time constant. Loop will be insterted at \p InsertBefore. 29void createMemCpyLoopUnknownSize(Instruction *InsertBefore, Value *SrcAddr, 30 Value *DstAddr, Value *CopyLen, 31 unsigned SrcAlign, unsigned DestAlign, 32 bool SrcIsVolatile, bool DstIsVolatile, 33 const TargetTransformInfo &TTI); 34 35/// Emit a loop implementing the semantics of an llvm.memcpy whose size is a 36/// compile time constant. Loop is inserted at \p InsertBefore. 37void createMemCpyLoopKnownSize(Instruction *InsertBefore, Value *SrcAddr, 38 Value *DstAddr, ConstantInt *CopyLen, 39 unsigned SrcAlign, unsigned DestAlign, 40 bool SrcIsVolatile, bool DstIsVolatile, 41 const TargetTransformInfo &TTI); 42 43 44/// Expand \p MemCpy as a loop. \p MemCpy is not deleted. 45void expandMemCpyAsLoop(MemCpyInst *MemCpy, const TargetTransformInfo &TTI); 46 47/// Expand \p MemMove as a loop. \p MemMove is not deleted. 48void expandMemMoveAsLoop(MemMoveInst *MemMove); 49 50/// Expand \p MemSet as a loop. \p MemSet is not deleted. 51void expandMemSetAsLoop(MemSetInst *MemSet); 52 53} // End llvm namespace 54 55#endif 56