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

source code of llvm/include/llvm/Transforms/Utils/LowerMemIntrinsics.h