summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2019-06-25 10:51:15 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2019-06-25 10:51:15 +0000
commit49b3778e32c95175a82ea488f943c1ff9f128851 (patch)
treef98082f944dc52a18f9c893e1edc4c2929b2e3fd /llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
parent47b7d13459a7c47126dca8f8788367890a249128 (diff)
downloadbcm5719-llvm-49b3778e32c95175a82ea488f943c1ff9f128851.tar.gz
bcm5719-llvm-49b3778e32c95175a82ea488f943c1ff9f128851.zip
[TargetLowering] SimplifyDemandedBits - legal checks for SIGN/ZERO_EXTEND -> ZERO/ANY_EXTEND
As part of the fix for rL364264 + rL364272 - limit the *_EXTEND conversion to !TLO.LegalOperations || isOperationLegal cases. We'll improve X86 legality in future commits. llvm-svn: 364290
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp21
1 files changed, 15 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 64fc3b894a5..2608d06ff90 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -1390,8 +1390,11 @@ bool TargetLowering::SimplifyDemandedBits(
TLO.DAG.getDataLayout().isLittleEndian())
return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
- if (!IsVecInReg)
- return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT, Src));
+ if (!IsVecInReg) {
+ unsigned Opc = ISD::ANY_EXTEND;
+ if (!TLO.LegalOperations() || isOperationLegal(Opc, VT))
+ return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src));
+ }
}
APInt InDemandedBits = DemandedBits.trunc(InBits);
@@ -1414,8 +1417,11 @@ bool TargetLowering::SimplifyDemandedBits(
// If none of the top bits are demanded, convert this into an any_extend.
// TODO: Add SIGN_EXTEND_VECTOR_INREG - ANY_EXTEND_VECTOR_INREG fold.
- if (DemandedBits.getActiveBits() <= InBits && !IsVecInReg)
- return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT, Src));
+ if (DemandedBits.getActiveBits() <= InBits && !IsVecInReg) {
+ unsigned Opc = ISD::ANY_EXTEND;
+ if (!TLO.LegalOperations() || isOperationLegal(Opc, VT))
+ return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src));
+ }
APInt InDemandedBits = DemandedBits.trunc(InBits);
APInt InDemandedElts = DemandedElts.zextOrSelf(InElts);
@@ -1435,8 +1441,11 @@ bool TargetLowering::SimplifyDemandedBits(
// If the sign bit is known zero, convert this to a zero extend.
// TODO: Add SIGN_EXTEND_VECTOR_INREG - ZERO_EXTEND_VECTOR_INREG fold.
- if (Known.isNonNegative() && !IsVecInReg)
- return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Src));
+ if (Known.isNonNegative() && !IsVecInReg) {
+ unsigned Opc = ISD::ZERO_EXTEND;
+ if (!TLO.LegalOperations() || isOperationLegal(Opc, VT))
+ return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src));
+ }
break;
}
case ISD::ANY_EXTEND: {
OpenPOWER on IntegriCloud