[llvm] 81fcdae - [MemCpyOpt] Support opaque pointers

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 28 11:57:03 PDT 2021


If this came from a phab review - please make sure to include that in the
commit message (& in cases where it's missed, could you follow-up with an
email reply to the commit to link to the review).

On Sun, Jun 27, 2021 at 6:53 AM Nikita Popov via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

>
> Author: Nikita Popov
> Date: 2021-06-27T15:52:38+02:00
> New Revision: 81fcdae68c5ff656c30032fd26c6a21af4c51dbb
>
> URL:
> https://github.com/llvm/llvm-project/commit/81fcdae68c5ff656c30032fd26c6a21af4c51dbb
> DIFF:
> https://github.com/llvm/llvm-project/commit/81fcdae68c5ff656c30032fd26c6a21af4c51dbb.diff
>
> LOG: [MemCpyOpt] Support opaque pointers
>
> Added:
>
>
> Modified:
>     llvm/lib/IR/IRBuilder.cpp
>     llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
>     llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll
>
> Removed:
>
>
>
>
> ################################################################################
> diff  --git a/llvm/lib/IR/IRBuilder.cpp b/llvm/lib/IR/IRBuilder.cpp
> index ca6577330c8ee..3c55b7395864a 100644
> --- a/llvm/lib/IR/IRBuilder.cpp
> +++ b/llvm/lib/IR/IRBuilder.cpp
> @@ -62,7 +62,7 @@ Type *IRBuilderBase::getCurrentFunctionReturnType()
> const {
>
>  Value *IRBuilderBase::getCastedInt8PtrValue(Value *Ptr) {
>    auto *PT = cast<PointerType>(Ptr->getType());
> -  if (PT->getElementType()->isIntegerTy(8))
> +  if (PT->isOpaqueOrPointeeTypeMatches(getInt8Ty()))
>      return Ptr;
>
>    // Otherwise, we need to insert a bitcast.
>
> diff  --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
> b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
> index db8d40b2bafaf..6016779ef3cfa 100644
> --- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
> +++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
> @@ -1215,8 +1215,7 @@ bool
> MemCpyOptPass::processMemSetMemCpyDependence(MemCpyInst *MemCpy,
>    Value *MemsetLen = Builder.CreateSelect(
>        Ule, ConstantInt::getNullValue(DestSize->getType()), SizeDiff);
>    Instruction *NewMemSet = Builder.CreateMemSet(
> -      Builder.CreateGEP(Dest->getType()->getPointerElementType(), Dest,
> -                        SrcSize),
> +      Builder.CreateGEP(Builder.getInt8Ty(), Dest, SrcSize),
>        MemSet->getOperand(1), MemsetLen, MaybeAlign(Align));
>
>    if (MSSAU) {
>
> diff  --git
> a/llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll
> b/llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll
> index 10ec8b46dbd27..987321607b3db 100644
> --- a/llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll
> +++ b/llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll
> @@ -291,10 +291,27 @@ define void @test_must_alias_
> diff erent_size(i8* noalias %src, i64 %src_size, i8*
>    ret void
>  }
>
> +define void @test_opaque_ptrs(ptr %src, i64 %src_size, ptr noalias %dst,
> i64 %dst_size, i8 %c) {
> +; CHECK-LABEL: @test_opaque_ptrs(
> +; CHECK-NEXT:    [[TMP1:%.*]] = icmp ule i64 [[DST_SIZE:%.*]],
> [[SRC_SIZE:%.*]]
> +; CHECK-NEXT:    [[TMP2:%.*]] = sub i64 [[DST_SIZE]], [[SRC_SIZE]]
> +; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i64 0, i64 [[TMP2]]
> +; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr i8, ptr [[DST:%.*]], i64
> [[SRC_SIZE]]
> +; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[TMP4]], i8
> [[C:%.*]], i64 [[TMP3]], i1 false)
> +; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[DST]], ptr
> [[SRC:%.*]], i64 [[SRC_SIZE]], i1 false)
> +; CHECK-NEXT:    ret void
> +;
> +  call void @llvm.memset.p0.i64(ptr %dst, i8 %c, i64 %dst_size, i1 false)
> +  call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %src_size, i1
> false)
> +  ret void
> +}
> +
>  declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1)
>  declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture
> readonly, i64, i1)
>  declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i1)
>  declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture
> readonly, i32, i1)
>  declare void @llvm.memset.p0i8.i128(i8* nocapture, i8, i128, i1)
>  declare void @llvm.memcpy.p0i8.p0i8.i128(i8* nocapture, i8* nocapture
> readonly, i128, i1)
> +declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1)
> +declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture
> readonly, i64, i1)
>  declare void @call()
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210628/5e1e7434/attachment.html>


More information about the llvm-commits mailing list