forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[DeadStoreElimination] Remove dead zero store to calloc initialized m…
…emory This change allows dead store elimination to remove zero and null stores into memory freshly allocated with calloc-like function. Differential Revision: http://reviews.llvm.org/D13021 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@248374 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
1 parent
39a9cdb
commit ebe9301
Showing
2 changed files
with
123 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
; RUN: opt < %s -basicaa -dse -S | FileCheck %s | ||
|
||
declare noalias i8* @calloc(i64, i64) | ||
|
||
define i32* @test1() { | ||
; CHECK-LABEL: test1 | ||
%1 = tail call noalias i8* @calloc(i64 1, i64 4) | ||
%2 = bitcast i8* %1 to i32* | ||
; This store is dead and should be removed | ||
store i32 0, i32* %2, align 4 | ||
; CHECK-NOT: store i32 0, i32* %2, align 4 | ||
ret i32* %2 | ||
} | ||
|
||
define i32* @test2() { | ||
; CHECK-LABEL: test2 | ||
%1 = tail call noalias i8* @calloc(i64 1, i64 4) | ||
%2 = bitcast i8* %1 to i32* | ||
%3 = getelementptr i32, i32* %2, i32 5 | ||
store i32 0, i32* %3, align 4 | ||
; CHECK-NOT: store i32 0, i32* %2, align 4 | ||
ret i32* %2 | ||
} | ||
|
||
define i32* @test3(i32 *%arg) { | ||
; CHECK-LABEL: test3 | ||
store i32 0, i32* %arg, align 4 | ||
; CHECK: store i32 0, i32* %arg, align 4 | ||
ret i32* %arg | ||
} | ||
|
||
declare void @clobber_memory(i8*) | ||
define i8* @test4() { | ||
; CHECK-LABEL: test4 | ||
%1 = tail call noalias i8* @calloc(i64 1, i64 4) | ||
call void @clobber_memory(i8* %1) | ||
store i8 0, i8* %1, align 4 | ||
; CHECK: store i8 0, i8* %1, align 4 | ||
ret i8* %1 | ||
} | ||
|
||
define i32* @test5() { | ||
; CHECK-LABEL: test5 | ||
%1 = tail call noalias i8* @calloc(i64 1, i64 4) | ||
%2 = bitcast i8* %1 to i32* | ||
store volatile i32 0, i32* %2, align 4 | ||
; CHECK: store volatile i32 0, i32* %2, align 4 | ||
ret i32* %2 | ||
} | ||
|
||
define i8* @test6() { | ||
; CHECK-LABEL: test6 | ||
%1 = tail call noalias i8* @calloc(i64 1, i64 4) | ||
store i8 5, i8* %1, align 4 | ||
; CHECK: store i8 5, i8* %1, align 4 | ||
ret i8* %1 | ||
} | ||
|
||
define i8* @test7(i8 %arg) { | ||
; CHECK-LABEL: test7 | ||
%1 = tail call noalias i8* @calloc(i64 1, i64 4) | ||
store i8 %arg, i8* %1, align 4 | ||
; CHECK: store i8 %arg, i8* %1, align 4 | ||
ret i8* %1 | ||
} |