Skip to content

Commit

Permalink
[EarlyCSE] Allow forwarding a non-invariant load into an invariant load.
Browse files Browse the repository at this point in the history
Reviewers: sanjoy

Subscribers: mcrosier, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280265 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
geoffberry committed Aug 31, 2016
1 parent 8f1c575 commit 5fc0cc8
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 12 deletions.
10 changes: 5 additions & 5 deletions lib/Transforms/Scalar/EarlyCSE.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -644,13 +644,13 @@ bool EarlyCSE::processNode(DomTreeNode *Node) {
// generation or the load is known to be from an invariant location,
// replace this instruction.
//
// A dominating invariant load implies that the location loaded from is
// unchanging beginning at the point of the invariant load, so the load
// we're CSE'ing _away_ does not need to be invariant, only the available
// load we're CSE'ing _to_ does.
// If either the dominating load or the current load are invariant, then
// we can assume the current load loads the same value as the dominating
// load.
LoadValue InVal = AvailableLoads.lookup(MemInst.getPointerOperand());
if (InVal.DefInst != nullptr &&
(InVal.Generation == CurrentGeneration || InVal.IsInvariant) &&
(InVal.Generation == CurrentGeneration ||
InVal.IsInvariant || MemInst.isInvariantLoad()) &&
InVal.MatchingId == MemInst.getMatchingId() &&
// We don't yet handle removing loads with ordering of any kind.
!MemInst.isVolatile() && MemInst.isUnordered() &&
Expand Down
10 changes: 3 additions & 7 deletions test/Transforms/EarlyCSE/invariant-loads.ll
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@ define void @f_0(i32* %ptr) {
}

define void @f_1(i32* %ptr) {
; We can forward invariant loads to non-invariant loads, since once an
; invariant load has executed, the location loaded from is known to be
; unchanging.
; We can forward invariant loads to non-invariant loads.

; CHECK-LABEL: @f_1(
; CHECK: %val0 = load i32, i32* %ptr, !invariant.load !0
Expand All @@ -37,14 +35,12 @@ define void @f_1(i32* %ptr) {
}

define void @f_2(i32* %ptr) {
; Negative test -- we can't forward a non-invariant load into an
; invariant load.
; We can forward a non-invariant load into an invariant load.

; CHECK-LABEL: @f_2(
; CHECK: %val0 = load i32, i32* %ptr
; CHECK: call void @clobber_and_use(i32 %val0)
; CHECK: %val1 = load i32, i32* %ptr, !invariant.load !0
; CHECK: call void @clobber_and_use(i32 %val1)
; CHECK: call void @clobber_and_use(i32 %val0)

%val0 = load i32, i32* %ptr
call void @clobber_and_use(i32 %val0)
Expand Down

0 comments on commit 5fc0cc8

Please sign in to comment.