Skip to content

Commit

Permalink
MemCpyOpt: When merging memsets also merge the trivial case of two me…
Browse files Browse the repository at this point in the history
…msets with the same destination.

The testcase is from PR19092, but I think the bug described there is actually a clang issue.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203489 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
d0k committed Mar 10, 2014
1 parent d89b0f2 commit 8da0b73
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 0 deletions.
7 changes: 7 additions & 0 deletions lib/Transforms/Scalar/MemCpyOptimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,13 @@ static bool IsPointerOffset(Value *Ptr1, Value *Ptr2, int64_t &Offset,
const DataLayout &TD) {
Ptr1 = Ptr1->stripPointerCasts();
Ptr2 = Ptr2->stripPointerCasts();

// Handle the trivial case first.
if (Ptr1 == Ptr2) {
Offset = 0;
return true;
}

GEPOperator *GEP1 = dyn_cast<GEPOperator>(Ptr1);
GEPOperator *GEP2 = dyn_cast<GEPOperator>(Ptr2);

Expand Down
12 changes: 12 additions & 0 deletions test/Transforms/MemCpyOpt/form-memset.ll
Original file line number Diff line number Diff line change
Expand Up @@ -272,3 +272,15 @@ define void @test9() nounwind {
; CHECK-LABEL: @test9(
; CHECK: call void @llvm.memset.p0i8.i64(i8* bitcast ([16 x i64]* @test9buf to i8*), i8 -1, i64 16, i32 16, i1 false)
}

; PR19092
define void @test10(i8* nocapture %P) nounwind {
tail call void @llvm.memset.p0i8.i64(i8* %P, i8 0, i64 42, i32 1, i1 false)
tail call void @llvm.memset.p0i8.i64(i8* %P, i8 0, i64 23, i32 1, i1 false)
ret void
; CHECK-LABEL: @test10(
; CHECK-NOT: memset
; CHECK: call void @llvm.memset.p0i8.i64(i8* %P, i8 0, i64 42, i32 1, i1 false)
; CHECK-NOT: memset
; CHECK: ret void
}

0 comments on commit 8da0b73

Please sign in to comment.