diff options
author | Duncan Sands <baldrick@free.fr> | 2008-12-14 09:43:15 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2008-12-14 09:43:15 +0000 |
commit | b6862bbe34be4a832f709596f8dc971ab9895b06 (patch) | |
tree | 06957d994eabaaa541e918885f30068abf1039ca /lib | |
parent | 3c8da594829cf88817a6a24c92e38a792184d7a8 (diff) | |
download | external_llvm-b6862bbe34be4a832f709596f8dc971ab9895b06.zip external_llvm-b6862bbe34be4a832f709596f8dc971ab9895b06.tar.gz external_llvm-b6862bbe34be4a832f709596f8dc971ab9895b06.tar.bz2 |
Reapply r60997, this time without forgetting that
target constants are allowed to have an illegal
type.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61006 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 17 | ||||
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 4 |
2 files changed, 14 insertions, 7 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 6f4158b..3a99a25 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -51,6 +51,7 @@ namespace { class VISIBILITY_HIDDEN SelectionDAGLegalize { TargetLowering &TLI; SelectionDAG &DAG; + bool TypesNeedLegalizing; // Libcall insertion helpers. @@ -127,7 +128,7 @@ class VISIBILITY_HIDDEN SelectionDAGLegalize { } public: - explicit SelectionDAGLegalize(SelectionDAG &DAG); + explicit SelectionDAGLegalize(SelectionDAG &DAG, bool TypesNeedLegalizing); /// getTypeAction - Return how we should legalize values of this type, either /// it is already legal or we need to expand it into multiple registers of @@ -348,8 +349,8 @@ SDNode *SelectionDAGLegalize::isShuffleLegal(MVT VT, SDValue Mask) const { return TLI.isShuffleMaskLegal(Mask, VT) ? Mask.getNode() : 0; } -SelectionDAGLegalize::SelectionDAGLegalize(SelectionDAG &dag) - : TLI(dag.getTargetLoweringInfo()), DAG(dag), +SelectionDAGLegalize::SelectionDAGLegalize(SelectionDAG &dag, bool types) + : TLI(dag.getTargetLoweringInfo()), DAG(dag), TypesNeedLegalizing(types), ValueTypeActions(TLI.getValueTypeActions()) { assert(MVT::LAST_VALUETYPE <= 32 && "Too many value types for ValueTypeActions to hold!"); @@ -488,6 +489,12 @@ bool SelectionDAGLegalize::LegalizeAllNodesNotLeadingTo(SDNode *N, SDNode *Dest, /// appropriate for its type. void SelectionDAGLegalize::HandleOp(SDValue Op) { MVT VT = Op.getValueType(); + // If the type legalizer was run then we should never see any illegal result + // types here except for target constants (the type legalizer does not touch + // those). + assert((TypesNeedLegalizing || getTypeAction(VT) == Legal || + Op.getOpcode() == ISD::TargetConstant) && + "Illegal type introduced after type legalization?"); switch (getTypeAction(VT)) { default: assert(0 && "Bad type action!"); case Legal: (void)LegalizeOp(Op); break; @@ -8602,9 +8609,9 @@ SDValue SelectionDAGLegalize::StoreWidenVectorOp(StoreSDNode *ST, // SelectionDAG::Legalize - This is the entry point for the file. // -void SelectionDAG::Legalize() { +void SelectionDAG::Legalize(bool TypesNeedLegalizing) { /// run - This is the main entry point to this class. /// - SelectionDAGLegalize(*this).LegalizeDAG(); + SelectionDAGLegalize(*this, TypesNeedLegalizing).LegalizeDAG(); } diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 3d2fb34..c2b7d3f 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -620,9 +620,9 @@ void SelectionDAGISel::CodeGenAndEmitDAG() { if (TimePassesIsEnabled) { NamedRegionTimer T("DAG Legalization", GroupName); - CurDAG->Legalize(); + CurDAG->Legalize(DisableLegalizeTypes); } else { - CurDAG->Legalize(); + CurDAG->Legalize(DisableLegalizeTypes); } DOUT << "Legalized selection DAG:\n"; |