[llvm] r323129 - [SystemZ] Fix bootstrap failure due to invalid DAG loop
Ulrich Weigand via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 22 07:41:49 PST 2018
Author: uweigand
Date: Mon Jan 22 07:41:49 2018
New Revision: 323129
URL: http://llvm.org/viewvc/llvm-project?rev=323129&view=rev
Log:
[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.
Modified:
llvm/trunk/lib/Target/SystemZ/SystemZISelLowering.cpp
Modified: llvm/trunk/lib/Target/SystemZ/SystemZISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/SystemZ/SystemZISelLowering.cpp?rev=323129&r1=323128&r2=323129&view=diff
==============================================================================
--- llvm/trunk/lib/Target/SystemZ/SystemZISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/SystemZ/SystemZISelLowering.cpp Mon Jan 22 07:41:49 2018
@@ -5484,6 +5484,23 @@ static bool combineCCMask(SDValue &Glue,
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
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);
More information about the llvm-commits
mailing list