From: Chris Lattner Date: Mon, 10 Oct 2005 23:00:08 +0000 (+0000) Subject: clean up some corner cases X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=04ecf6d65fb5c8703eff8a3dcd5a8208e91318fe;p=oota-llvm.git clean up some corner cases git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23692 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index b58b8cace2e..efeee071f0b 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -1583,14 +1583,18 @@ SDOperand DAGCombiner::visitSTORE(SDNode *N) { SDOperand SrcValue = N->getOperand(3); // If this is a store that kills a previous store, remove the previous store. - if (Chain.getOpcode() == ISD::STORE && Chain.getOperand(2) == Ptr) { + if (Chain.getOpcode() == ISD::STORE && Chain.getOperand(2) == Ptr && + Chain.Val->hasOneUse() /* Avoid introducing DAG cycles */) { // Create a new store of Value that replaces both stores. SDNode *PrevStore = Chain.Val; + if (PrevStore->getOperand(1) == Value) // Same value multiply stored. + return Chain; SDOperand NewStore = DAG.getNode(ISD::STORE, MVT::Other, PrevStore->getOperand(0), Value, Ptr, SrcValue); + CombineTo(N, NewStore); // Nuke this store. CombineTo(PrevStore, NewStore); // Nuke the previous store. - return NewStore; // Replace this store with NewStore. + return SDOperand(N, 0); } return SDOperand();