From: Ulrich Weigand Date: Mon, 22 Jan 2018 15:41:49 +0000 (+0000) Subject: [SystemZ] Fix bootstrap failure due to invalid DAG loop X-Git-Tag: llvmorg-7.0.0-rc1~14681 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=145d63f1ada934f82af0c0796d3ba21461270e47;p=platform%2Fupstream%2Fllvm.git [SystemZ] Fix bootstrap failure due to invalid DAG loop The change in r322988 caused a failure in the bootstrap build bot. The problem was that directly gluing a BR_CCMASK node to a compare-and-swap could lead to issues if other nodes were chained in between. There is then no way to create a topological sort that respects both the chain sequence and the glue property. Fixed for now by rejecting the optimization in this case. As a future enhancement, we may be able to handle additional cases by swapping chain links around. llvm-svn: 323129 --- diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp index f7fc061..0d29676 100644 --- a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp @@ -5484,6 +5484,23 @@ static bool combineCCMask(SDValue &Glue, int &CCValid, int &CCMask) { return true; } +static bool combineMergeChains(SDValue &Chain, SDValue Glue) { + // We are about to glue an instruction with input chain Chain to the + // instruction Glue. Verify that this would not create an invalid + // topological sort due to intervening chain nodes. + + SDNode *Node = Glue.getNode(); + for (int ResNo = Node->getNumValues() - 1; ResNo >= 0; --ResNo) + if (Node->getValueType(ResNo) == MVT::Other) { + SDValue OutChain = SDValue(Node, ResNo); + // FIXME: We should be able to at least handle an intervening + // TokenFactor node by swapping chains around a bit ... + return Chain == OutChain; + } + + return true; +} + SDValue SystemZTargetLowering::combineBR_CCMASK( SDNode *N, DAGCombinerInfo &DCI) const { SelectionDAG &DAG = DCI.DAG; @@ -5496,11 +5513,13 @@ SDValue SystemZTargetLowering::combineBR_CCMASK( int CCValidVal = CCValid->getZExtValue(); int CCMaskVal = CCMask->getZExtValue(); + SDValue Chain = N->getOperand(0); SDValue Glue = N->getOperand(4); - if (combineCCMask(Glue, CCValidVal, CCMaskVal)) + if (combineCCMask(Glue, CCValidVal, CCMaskVal) + && combineMergeChains(Chain, Glue)) return DAG.getNode(SystemZISD::BR_CCMASK, SDLoc(N), N->getValueType(0), - N->getOperand(0), + Chain, DAG.getConstant(CCValidVal, SDLoc(N), MVT::i32), DAG.getConstant(CCMaskVal, SDLoc(N), MVT::i32), N->getOperand(3), Glue);