From 9259de217e608ae965d12531e06e10805072a212 Mon Sep 17 00:00:00 2001 From: Nirav Dave Date: Fri, 29 Mar 2019 14:09:47 +0000 Subject: [PATCH] [DAGCombine] Improve Lifetime node chains. Improve both start and end lifetime nodes chain dependencies. Reviewers: courbet Reviewed By: courbet Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D59795 llvm-svn: 357256 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 30 +++++++++++++++++++++++++++ llvm/test/CodeGen/X86/swap.ll | 3 --- llvm/test/DebugInfo/COFF/lexicalblock.ll | 13 ------------ 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 5dccaf5..5c4f98e 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -384,6 +384,10 @@ namespace { 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 @@ SDValue DAGCombiner::visit(SDNode *N) { 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 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) { 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(); diff --git a/llvm/test/CodeGen/X86/swap.ll b/llvm/test/CodeGen/X86/swap.ll index 7a8edbb..08166d8 100644 --- a/llvm/test/CodeGen/X86/swap.ll +++ b/llvm/test/CodeGen/X86/swap.ll @@ -94,7 +94,6 @@ define dso_local void @twoallocs(i8* nocapture %a, i8* nocapture %b) local_unnam ; 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 @@ define dso_local void @onealloc_readback_1(i8* nocapture %a, i8* nocapture %b) l ; 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 @@ define dso_local void @onealloc_readback_2(i8* nocapture %a, i8* nocapture %b) l ; 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: diff --git a/llvm/test/DebugInfo/COFF/lexicalblock.ll b/llvm/test/DebugInfo/COFF/lexicalblock.ll index 970aae2..646f13b 100644 --- a/llvm/test/DebugInfo/COFF/lexicalblock.ll +++ b/llvm/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: } ; -- 2.7.4