[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