[PATCH] D35035: [InstCombine] Prevent memcpy generation for small data size
DIVYA SHANMUGHAN via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 9 13:33:33 PDT 2017
DIVYA updated this revision to Diff 110467.
https://reviews.llvm.org/D35035
Files:
lib/Transforms/InstCombine/InstCombineCalls.cpp
test/DebugInfo/X86/array2.ll
Index: test/DebugInfo/X86/array2.ll
===================================================================
--- test/DebugInfo/X86/array2.ll
+++ test/DebugInfo/X86/array2.ll
@@ -53,7 +53,7 @@
call void @llvm.dbg.declare(metadata i8*** %argv.addr, metadata !25, metadata !DIExpression()), !dbg !24
call void @llvm.dbg.declare(metadata [4 x i32]* %array, metadata !26, metadata !DIExpression()), !dbg !30
%0 = bitcast [4 x i32]* %array to i8*, !dbg !30
- call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast ([4 x i32]* @main.array to i8*), i64 16, i32 16, i1 false), !dbg !30
+ call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast ([4 x i32]* @main.array to i8*), i64 128, i32 16, i1 false), !dbg !30
%arraydecay = getelementptr inbounds [4 x i32], [4 x i32]* %array, i32 0, i32 0, !dbg !31
call void @f(i32* %arraydecay), !dbg !31
%arrayidx = getelementptr inbounds [4 x i32], [4 x i32]* %array, i32 0, i64 0, !dbg !32
Index: lib/Transforms/InstCombine/InstCombineCalls.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -182,8 +182,6 @@
return MI;
}
- // If MemCpyInst length is 1/2/4/8 bytes then replace memcpy with
- // load/store.
ConstantInt *MemOpLength = dyn_cast<ConstantInt>(MI->getArgOperand(2));
if (!MemOpLength) return nullptr;
@@ -194,8 +192,16 @@
uint64_t Size = MemOpLength->getLimitedValue();
assert(Size && "0-sized memory transferring should be removed already.");
- if (Size > 8 || (Size&(Size-1)))
- return nullptr; // If not 1/2/4/8 bytes, exit.
+
+ // Since we don't have perfect knowledge here, make some assumptions: assume
+ // the maximum allowed stores for memcpy operation is the same size as the
+ // largest legal integer size.
+ unsigned LargestInt = DL.getLargestLegalIntTypeSizeInBits();
+ if (LargestInt == 0)
+ LargestInt = 32;
+
+ if (Size > 2*LargestInt/8 || (Size&(Size-1)))
+ return nullptr;
// Use an integer load+store unless we can find something better.
unsigned SrcAddrSp =
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D35035.110467.patch
Type: text/x-patch
Size: 2129 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170809/c5e55dc6/attachment.bin>
More information about the llvm-commits
mailing list