mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-28 14:10:55 +00:00
Handle DAG CSE adding new uses during ReplaceAllUsesWith. Fixes PR14333.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167912 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c35ce700fe
commit
8e2b8ae3b1
@ -7728,7 +7728,18 @@ bool DAGCombiner::MergeConsecutiveStores(StoreSDNode* St) {
|
||||
if (StoreNodes[i].MemNode == EarliestOp)
|
||||
continue;
|
||||
StoreSDNode *St = cast<StoreSDNode>(StoreNodes[i].MemNode);
|
||||
DAG.ReplaceAllUsesOfValueWith(SDValue(St, 0), St->getChain());
|
||||
// ReplaceAllUsesWith will replace all uses that existed when it was
|
||||
// called, but graph optimizations may cause new ones to appear. For
|
||||
// example, the case in pr14333 looks like
|
||||
//
|
||||
// St's chain -> St -> another store -> X
|
||||
//
|
||||
// And the only difference from St to the other store is the chain.
|
||||
// When we change it's chain to be St's chain they become identical,
|
||||
// get CSEed and the net result is that X is now a use of St.
|
||||
// Since we know that St is redundant, just iterate.
|
||||
while (!St->use_empty())
|
||||
DAG.ReplaceAllUsesWith(SDValue(St, 0), St->getChain());
|
||||
removeFromWorkList(St);
|
||||
DAG.DeleteNode(St);
|
||||
}
|
||||
|
12
test/CodeGen/X86/pr14333.ll
Normal file
12
test/CodeGen/X86/pr14333.ll
Normal file
@ -0,0 +1,12 @@
|
||||
; RUN: llc -mtriple=x86_64-unknown-unknown < %s
|
||||
%foo = type { i64, i64 }
|
||||
define void @bar(%foo* %zed) {
|
||||
%tmp = getelementptr inbounds %foo* %zed, i64 0, i32 0
|
||||
store i64 0, i64* %tmp, align 8
|
||||
%tmp2 = getelementptr inbounds %foo* %zed, i64 0, i32 1
|
||||
store i64 0, i64* %tmp2, align 8
|
||||
%tmp3 = bitcast %foo* %zed to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* %tmp3, i8 0, i64 16, i32 8, i1 false)
|
||||
ret void
|
||||
}
|
||||
declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
|
Loading…
Reference in New Issue
Block a user