[PATCH] D63095: [GlobalISel] Translate memset/memmove/memcpy from undef ptrs into nothing

Jessica Paquette via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 10 14:36:33 PDT 2019


paquette updated this revision to Diff 203899.
paquette marked an inline comment as done.
paquette added a comment.

Improve test


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D63095/new/

https://reviews.llvm.org/D63095

Files:
  llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
  llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-memfunc-undef.ll


Index: llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-memfunc-undef.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-memfunc-undef.ll
@@ -0,0 +1,41 @@
+; RUN: llc -mtriple=aarch64-unknown-unknown -global-isel -verify-machineinstrs -stop-after=irtranslator %s -o - | FileCheck %s
+
+define void @memset() {
+  ; CHECK-LABEL: name: memset
+  ; CHECK: bb.1.entry:
+  ; CHECK-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0.buf
+  ; CHECK-NEXT:   RET_ReallyLR
+entry:
+  %buf = alloca [512 x i8], align 1
+  %ptr = getelementptr inbounds [512 x i8], [512 x i8]* %buf, i32 0, i32 0
+  call void @llvm.memset.p0i8.i32(i8* %ptr, i8 undef, i32 512, i1 false)
+  ret void
+}
+
+define void @memcpy() {
+  ; CHECK-LABEL: name: memcpy
+  ; CHECK: bb.1.entry:
+  ; CHECK-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0.buf
+  ; CHECK-NEXT:   RET_ReallyLR
+entry:
+  %buf = alloca [512 x i8], align 1
+  %ptr = getelementptr inbounds [512 x i8], [512 x i8]* %buf, i32 0, i32 0
+  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ptr, i8* undef, i32 512, i1 false)
+  ret void
+}
+
+define void @memmove() {
+  ; CHECK-LABEL: name: memmove
+  ; CHECK: bb.1.entry:
+  ; CHECK-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0.buf
+  ; CHECK-NEXT: RET_ReallyLR
+entry:
+  %buf = alloca [512 x i8], align 1
+  %ptr = getelementptr inbounds [512 x i8], [512 x i8]* %buf, i32 0, i32 0
+  call void @llvm.memmove.p0i8.p0i8.i32(i8* %ptr, i8* undef, i32 512, i1 false)
+  ret void
+}
+
+declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
+declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture readonly, i32, i1) nounwind
+declare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i1) nounwind
Index: llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
===================================================================
--- llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -728,6 +728,19 @@
 bool IRTranslator::translateMemfunc(const CallInst &CI,
                                     MachineIRBuilder &MIRBuilder,
                                     unsigned ID) {
+
+  // If the source is undef, then just emit a nop.
+  if (isa<UndefValue>(CI.getArgOperand(1))) {
+    switch (ID) {
+    case Intrinsic::memmove:
+    case Intrinsic::memcpy:
+    case Intrinsic::memset:
+      return true;
+    default:
+      break;
+    }
+  }
+
   LLT SizeTy = getLLTForType(*CI.getArgOperand(2)->getType(), *DL);
   Type *DstTy = CI.getArgOperand(0)->getType();
   if (cast<PointerType>(DstTy)->getAddressSpace() != 0 ||


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63095.203899.patch
Type: text/x-patch
Size: 2724 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190610/7988a9cb/attachment.bin>


More information about the llvm-commits mailing list