Index: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -14710,63 +14710,6 @@ break; } } - - // We need to be careful here to also search for aliases through the - // value operand of a store, etc. Consider the following situation: - // Token1 = ... - // L1 = load Token1, %52 - // S1 = store Token1, L1, %51 - // L2 = load Token1, %52+8 - // S2 = store Token1, L2, %51+8 - // Token2 = Token(S1, S2) - // L3 = load Token2, %53 - // S3 = store Token2, L3, %52 - // L4 = load Token2, %53+8 - // S4 = store Token2, L4, %52+8 - // If we search for aliases of S3 (which loads address %52), and we look - // only through the chain, then we'll miss the trivial dependence on L1 - // (which also loads from %52). We then might change all loads and - // stores to use Token1 as their chain operand, which could result in - // copying %53 into %52 before copying %52 into %51 (which should - // happen first). - // - // The problem is, however, that searching for such data dependencies - // can become expensive, and the cost is not directly related to the - // chain depth. Instead, we'll rule out such configurations here by - // insisting that we've visited all chain users (except for users - // of the original chain, which is not necessary). When doing this, - // we need to look through nodes we don't care about (otherwise, things - // like register copies will interfere with trivial cases). - - SmallVector Worklist; - for (const SDNode *N : Visited) - if (N != OriginalChain.getNode()) - Worklist.push_back(N); - - while (!Worklist.empty()) { - const SDNode *M = Worklist.pop_back_val(); - - // We have already visited M, and want to make sure we've visited any uses - // of M that we care about. For uses that we've not visisted, and don't - // care about, queue them to the worklist. - - for (SDNode::use_iterator UI = M->use_begin(), - UIE = M->use_end(); UI != UIE; ++UI) - if (UI.getUse().getValueType() == MVT::Other && - Visited.insert(*UI).second) { - if (isa(*UI)) { - // We've not visited this use, and we care about it (it could have an - // ordering dependency with the original node). - Aliases.clear(); - Aliases.push_back(OriginalChain); - return; - } - - // We've not visited this use, but we don't care about it. Mark it as - // visited and enqueue it to the worklist. - Worklist.push_back(*UI); - } - } } /// Walk up chain skipping non-aliasing memory nodes, looking for a better chain Index: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -4394,6 +4394,7 @@ DAG.getMemBasePlusOffset(Src, SrcOff, dl), SrcPtrInfo.getWithOffset(SrcOff), VT, isVol, false, false, MinAlign(SrcAlign, SrcOff)); + OutChains.push_back(Value.getValue(1)); Store = DAG.getTruncStore(Chain, dl, Value, DAG.getMemBasePlusOffset(Dst, DstOff, dl), DstPtrInfo.getWithOffset(DstOff), VT, isVol, Index: llvm/trunk/test/CodeGen/PowerPC/ppc64-align-long-double.ll =================================================================== --- llvm/trunk/test/CodeGen/PowerPC/ppc64-align-long-double.ll +++ llvm/trunk/test/CodeGen/PowerPC/ppc64-align-long-double.ll @@ -18,17 +18,17 @@ ret ppc_fp128 %0 } -; CHECK: std 6, 72(1) -; CHECK: std 5, 64(1) -; CHECK: std 4, 56(1) -; CHECK: std 3, 48(1) +; CHECK-DAG: std 6, 72(1) +; CHECK-DAG: std 5, 64(1) +; CHECK-DAG: std 4, 56(1) +; CHECK-DAG: std 3, 48(1) ; CHECK: lfd 1, 64(1) ; CHECK: lfd 2, 72(1) -; CHECK-VSX: std 6, 72(1) -; CHECK-VSX: std 5, 64(1) -; CHECK-VSX: std 4, 56(1) -; CHECK-VSX: std 3, 48(1) +; CHECK-VSX-DAG: std 6, 72(1) +; CHECK-VSX-DAG: std 5, 64(1) +; CHECK-VSX-DAG: std 4, 56(1) +; CHECK-VSX-DAG: std 3, 48(1) ; CHECK-VSX: li 3, 16 ; CHECK-VSX: addi 4, 1, 48 ; CHECK-VSX: lxsdx 1, 4, 3