forked from OSchip/llvm-project
[SDAG] Handle LowerOperation returning its input consistently
For almost all node types, if the target requested custom lowering, and LowerOperation returned its input, we'd treat the original node as legal. This did not work, however, for many loads and stores, because they follow slightly different code paths, and we did not account for the possibility of LowerOperation returning its input at those call sites. I think that we now handle this consistently everywhere. At the call sites in LegalizeDAG, we used to assert in this case, so there's no functional change for any existing code there. For the call sites in LegalizeVectorOps, this really only affects whether or not we set Changed = true, but I think makes the semantics clearer. No test case here, but it will be covered by an upcoming PowerPC commit adding QPX support. llvm-svn: 230332
This commit is contained in:
parent
d76df6d0ff
commit
cec70130ac
|
@ -731,7 +731,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
|||
}
|
||||
case TargetLowering::Custom: {
|
||||
SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG);
|
||||
if (Res.getNode())
|
||||
if (Res && Res != SDValue(Node, 0))
|
||||
ReplaceNode(SDValue(Node, 0), Res);
|
||||
return;
|
||||
}
|
||||
|
@ -843,7 +843,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
|||
}
|
||||
case TargetLowering::Custom: {
|
||||
SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG);
|
||||
if (Res.getNode())
|
||||
if (Res && Res != SDValue(Node, 0))
|
||||
ReplaceNode(SDValue(Node, 0), Res);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -207,6 +207,8 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) {
|
|||
return TranslateLegalizeResults(Op, Result);
|
||||
case TargetLowering::Custom:
|
||||
if (SDValue Lowered = TLI.LowerOperation(Result, DAG)) {
|
||||
if (Lowered == Result)
|
||||
return TranslateLegalizeResults(Op, Lowered);
|
||||
Changed = true;
|
||||
if (Lowered->getNumValues() != Op->getNumValues()) {
|
||||
// This expanded to something other than the load. Assume the
|
||||
|
@ -232,9 +234,11 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) {
|
|||
default: llvm_unreachable("This action is not supported yet!");
|
||||
case TargetLowering::Legal:
|
||||
return TranslateLegalizeResults(Op, Result);
|
||||
case TargetLowering::Custom:
|
||||
Changed = true;
|
||||
return TranslateLegalizeResults(Op, TLI.LowerOperation(Result, DAG));
|
||||
case TargetLowering::Custom: {
|
||||
SDValue Lowered = TLI.LowerOperation(Result, DAG);
|
||||
Changed = Lowered != Result;
|
||||
return TranslateLegalizeResults(Op, Lowered);
|
||||
}
|
||||
case TargetLowering::Expand:
|
||||
Changed = true;
|
||||
return LegalizeOp(ExpandStore(Op));
|
||||
|
|
Loading…
Reference in New Issue