Commit f6af8ffd authored by Pawel Wodnicki's avatar Pawel Wodnicki
Browse files

Merging r167912: into the 3.2 release branch.

Handle DAG CSE adding new uses during ReplaceAllUsesWith. Fixes PR14333.

llvm-svn: 168596
parent 3fbacb3b
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
; 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