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 20 namespace llvm { 21 22 class AtomicMemCpyInst; 23 class ConstantInt; 24 class Instruction; 25 class MemCpyInst; 26 class MemMoveInst; 27 class MemSetInst; 28 class ScalarEvolution; 29 class TargetTransformInfo; 30 class Value; 31 struct 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. 35 void 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. 43 void 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. 50 void 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. 55 bool expandMemMoveAsLoop(MemMoveInst *MemMove, const TargetTransformInfo &TTI); 56 57 /// Expand \p MemSet as a loop. \p MemSet is not deleted. 58 void expandMemSetAsLoop(MemSetInst *MemSet); 59 60 /// Expand \p AtomicMemCpy as a loop. \p AtomicMemCpy is not deleted. 61 void expandAtomicMemCpyAsLoop(AtomicMemCpyInst *AtomicMemCpy, 62 const TargetTransformInfo &TTI, 63 ScalarEvolution *SE); 64 65 } // End llvm namespace 66 67 #endif 68