mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 23:31:37 +00:00
[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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230332 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
41ecf2b99e
commit
cccfe54933
@ -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…
x
Reference in New Issue
Block a user