mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[EarlyCSE] Don't DSE across readnone functions that may throw
Summary: Depends on D28740 Reviewers: dberlin, chandlerc, hfinkel, majnemer Subscribers: mcrosier, llvm-commits Differential Revision: https://reviews.llvm.org/D28741 llvm-svn: 292249
This commit is contained in:
parent
ea4bdd6b81
commit
659705e7a7
@ -761,12 +761,13 @@ bool EarlyCSE::processNode(DomTreeNode *Node) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// If this instruction may read from memory, forget LastStore.
|
||||
// Load/store intrinsics will indicate both a read and a write to
|
||||
// memory. The target may override this (e.g. so that a store intrinsic
|
||||
// does not read from memory, and thus will be treated the same as a
|
||||
// regular store for commoning purposes).
|
||||
if (Inst->mayReadFromMemory() &&
|
||||
// If this instruction may read from memory or throw (and potentially read
|
||||
// from memory in the exception handler), forget LastStore. Load/store
|
||||
// intrinsics will indicate both a read and a write to memory. The target
|
||||
// may override this (e.g. so that a store intrinsic does not read from
|
||||
// memory, and thus will be treated the same as a regular store for
|
||||
// commoning purposes).
|
||||
if ((Inst->mayReadFromMemory() || Inst->mayThrow()) &&
|
||||
!(MemInst.isValid() && !MemInst.mayReadFromMemory()))
|
||||
LastStore = nullptr;
|
||||
|
||||
|
15
test/Transforms/EarlyCSE/readnone-mayunwind.ll
Normal file
15
test/Transforms/EarlyCSE/readnone-mayunwind.ll
Normal file
@ -0,0 +1,15 @@
|
||||
; RUN: opt -S -early-cse < %s | FileCheck %s
|
||||
|
||||
declare void @readnone_may_unwind() readnone
|
||||
|
||||
define void @f(i32* %ptr) {
|
||||
; CHECK-LABEL: @f(
|
||||
; CHECK: store i32 100, i32* %ptr
|
||||
; CHECK: call void @readnone_may_unwind()
|
||||
; CHECK: store i32 200, i32* %ptr
|
||||
|
||||
store i32 100, i32* %ptr
|
||||
call void @readnone_may_unwind()
|
||||
store i32 200, i32* %ptr
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user