llvm/test/Transforms/DeadStoreElimination/invariant.start.ll
Anna Thomas 9cd4907159 [AliasAnalysis] Treat invariant.start as read-memory
Summary:
We teach alias analysis that invariant.start is readonly.
This helps with GVN and memcopy optimizations that currently treat.
invariant.start as a clobber.
We need to treat this as readonly, so that DSE does not incorrectly
remove stores prior to the invariant.start

Reviewers: sanjoy, reames, majnemer, dberlin

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D23214

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278138 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-09 17:18:05 +00:00

35 lines
1.2 KiB
LLVM

; Test to make sure llvm.invariant.start calls are not treated as clobbers.
; RUN: opt < %s -basicaa -dse -S | FileCheck %s
declare {}* @llvm.invariant.start.p0i8(i64, i8* nocapture) nounwind readonly
; We cannot remove the store 1 to %p.
; FIXME: By the semantics of invariant.start, the store 3 to p is unreachable.
define void @test(i8 *%p) {
store i8 1, i8* %p, align 4
%i = call {}* @llvm.invariant.start.p0i8(i64 1, i8* %p)
store i8 3, i8* %p, align 4
ret void
; CHECK-LABEL: @test(
; CHECK-NEXT: store i8 1, i8* %p, align 4
; CHECK-NEXT: %i = call {}* @llvm.invariant.start.p0i8(i64 1, i8* %p)
; CHECK-NEXT: store i8 3, i8* %p, align 4
; CHECK-NEXT: ret void
}
; FIXME: We should be able to remove the first store to p, even though p and q
; may alias.
define void @test2(i8* %p, i8* %q) {
store i8 1, i8* %p, align 4
store i8 2, i8* %q, align 4
%i = call {}* @llvm.invariant.start.p0i8(i64 1, i8* %q)
store i8 3, i8* %p, align 4
ret void
; CHECK-LABEL: @test2(
; CHECK-NEXT: store i8 1, i8* %p, align 4
; CHECK-NEXT: store i8 2, i8* %q, align 4
; CHECK-NEXT: %i = call {}* @llvm.invariant.start.p0i8(i64 1, i8* %q)
; CHECK-NEXT: store i8 3, i8* %p, align 4
; CHECK-NEXT: ret void
}