Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.
  54. void expandMemMoveAsLoop(MemMoveInst *MemMove);
  55.  
  56. /// Expand \p MemSet as a loop. \p MemSet is not deleted.
  57. void expandMemSetAsLoop(MemSetInst *MemSet);
  58.  
  59. /// Expand \p AtomicMemCpy as a loop. \p AtomicMemCpy is not deleted.
  60. void expandAtomicMemCpyAsLoop(AtomicMemCpyInst *AtomicMemCpy,
  61.                               const TargetTransformInfo &TTI,
  62.                               ScalarEvolution *SE);
  63.  
  64. } // End llvm namespace
  65.  
  66. #endif
  67.