summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2018-11-16 21:04:58 +0000
committerCraig Topper <craig.topper@intel.com>2018-11-16 21:04:58 +0000
commit9e97054211a898b9670979512e9e0b227d72bec3 (patch)
treeeac0960575edec527eb2a059258a543b1e2bcdd2
parent7fff9a9aef4849be8f7b1a8949b12a22905f6c1d (diff)
downloadbcm5719-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.cpp12
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:
OpenPOWER on IntegriCloud