Index: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -384,6 +384,10 @@ SDValue replaceStoreOfFPConstant(StoreSDNode *ST); SDValue visitSTORE(SDNode *N); + + SDValue ImproveLifetimeNodeChain(SDNode *N); + + SDValue visitLIFETIME_START(SDNode *N); SDValue visitLIFETIME_END(SDNode *N); SDValue visitINSERT_VECTOR_ELT(SDNode *N); SDValue visitEXTRACT_VECTOR_ELT(SDNode *N); @@ -1604,6 +1608,7 @@ case ISD::MLOAD: return visitMLOAD(N); case ISD::MSCATTER: return visitMSCATTER(N); case ISD::MSTORE: return visitMSTORE(N); + case ISD::LIFETIME_START: return visitLIFETIME_START(N); case ISD::LIFETIME_END: return visitLIFETIME_END(N); case ISD::FP_TO_FP16: return visitFP_TO_FP16(N); case ISD::FP16_TO_FP: return visitFP16_TO_FP(N); @@ -15654,7 +15659,32 @@ return ReduceLoadOpStoreWidth(N); } +SDValue DAGCombiner::ImproveLifetimeNodeChain(SDNode *N) { + auto Chain = N->getOperand(0); + auto NewChain = FindBetterChain(N, Chain); + if (NewChain != Chain) { + SDNode *N2 = DAG.UpdateNodeOperands(N, NewChain, N->getOperand(1)); + // Make sure users of new N still depend on Chain + auto TF = DAG.getNode(ISD::TokenFactor, SDLoc(N2), MVT::Other, Chain, + SDValue(N2, 0)); + DAG.ReplaceAllUsesOfValueWith(SDValue(N2, 0), TF); + AddToWorklist(DAG.UpdateNodeOperands(TF.getNode(), Chain, SDValue(N2, 0))); + AddToWorklist(N2); + return SDValue(N, 0); + } + return SDValue(); +} + +SDValue DAGCombiner::visitLIFETIME_START(SDNode *N) { + if (SDValue V = ImproveLifetimeNodeChain(N)) + return V; + return SDValue(); +} + SDValue DAGCombiner::visitLIFETIME_END(SDNode *N) { + if (SDValue V = ImproveLifetimeNodeChain(N)) + return V; + const auto *LifetimeEnd = cast(N); if (!LifetimeEnd->hasOffset()) return SDValue(); Index: llvm/trunk/test/CodeGen/X86/swap.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/swap.ll +++ llvm/trunk/test/CodeGen/X86/swap.ll @@ -94,7 +94,6 @@ ; AA-LABEL: twoallocs: ; AA: # %bb.0: # %entry ; AA-NEXT: vmovups (%rdi), %xmm0 -; AA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) ; AA-NEXT: vmovups %xmm0, (%rsi) ; AA-NEXT: retq entry: @@ -125,7 +124,6 @@ ; AA-LABEL: onealloc_readback_1: ; AA: # %bb.0: # %entry ; AA-NEXT: vmovups (%rsi), %xmm0 -; AA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) ; AA-NEXT: vmovups %xmm0, (%rdi) ; AA-NEXT: retq entry: @@ -155,7 +153,6 @@ ; AA-LABEL: onealloc_readback_2: ; AA: # %bb.0: # %entry ; AA-NEXT: vmovups (%rsi), %xmm0 -; AA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) ; AA-NEXT: vmovups %xmm0, (%rdi) ; AA-NEXT: retq entry: Index: llvm/trunk/test/DebugInfo/COFF/lexicalblock.ll =================================================================== --- llvm/trunk/test/DebugInfo/COFF/lexicalblock.ll +++ llvm/trunk/test/DebugInfo/COFF/lexicalblock.ll @@ -80,19 +80,6 @@ ; CHECK: ScopeEndSym { ; CHECK: Kind: S_END {{.*}} ; CHECK: } -; CHECK: BlockSym { -; CHECK: Kind: S_BLOCK32 {{.*}} -; CHECK: BlockName: -; CHECK: } -; CHECK: ScopeEndSym { -; CHECK: } -; CHECK: BlockSym { -; CHECK: Kind: S_BLOCK32 {{.*}} -; CHECK: BlockName: -; CHECK: } -; CHECK: ScopeEndSym { -; CHECK: Kind: S_END {{.*}} -; CHECK: } ; CHECK: ProcEnd { ; CHECK: } ;