diff options
author | Craig Topper <craig.topper@intel.com> | 2018-11-16 21:04:58 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-11-16 21:04:58 +0000 |
commit | 9e97054211a898b9670979512e9e0b227d72bec3 (patch) | |
tree | eac0960575edec527eb2a059258a543b1e2bcdd2 | |
parent | 7fff9a9aef4849be8f7b1a8949b12a22905f6c1d (diff) | |
download | bcm5719-llvm-9e97054211a898b9670979512e9e0b227d72bec3.tar.gz bcm5719-llvm-9e97054211a898b9670979512e9e0b227d72bec3.zip |
[LegalizeVectorOps] After custom legalizing an extending load or a truncating store, make sure the custom code is also legal.
For example, on X86 we emit a sign_extend_vector_inreg from LowerLoad and without sse4.1 this node will need further legalization. Previously this sign_extend_vector_inreg was being custom lowered during DAG legalization instead of vector op legalization.
Unfortunately, this doesn't seem to matter for the output of any existing lit tests.
llvm-svn: 347094
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp index 17f05c3ba97..b4664f49201 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp @@ -244,7 +244,11 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) { if (SDValue Lowered = TLI.LowerOperation(Result, DAG)) { assert(Lowered->getNumValues() == Op->getNumValues() && "Unexpected number of results"); - Changed = Lowered != Result; + if (Lowered != Result) { + // Make sure the new code is also legal. + Lowered = LegalizeOp(Lowered); + Changed = true; + } return TranslateLegalizeResults(Op, Lowered); } LLVM_FALLTHROUGH; @@ -266,7 +270,11 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) { return TranslateLegalizeResults(Op, Result); case TargetLowering::Custom: { SDValue Lowered = TLI.LowerOperation(Result, DAG); - Changed = Lowered != Result; + if (Lowered != Result) { + // Make sure the new code is also legal. + Lowered = LegalizeOp(Lowered); + Changed = true; + } return TranslateLegalizeResults(Op, Lowered); } case TargetLowering::Expand: |