diff --git a/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp b/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp --- a/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp +++ b/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp @@ -271,8 +271,6 @@ bool identifyNodes(Instruction *RootI); /// Perform the actual replacement of the underlying instruction graph. - /// Returns false if the deinterleaving operation should be cancelled for the - /// current graph. void replaceNodes(); }; @@ -598,8 +596,16 @@ Rotation == ComplexDeinterleavingRotation::Rotation_270) ? CommonOperand : nullptr); - NodePtr CNode = identifyNodeWithImplicitAdd( - cast(CR), cast(CI), PartialMatch); + + auto *CRInst = dyn_cast(CR); + auto *CIInst = dyn_cast(CI); + + if (!CRInst || !CIInst) { + LLVM_DEBUG(dbgs() << " - Common operands are not instructions.\n"); + return nullptr; + } + + NodePtr CNode = identifyNodeWithImplicitAdd(CRInst, CIInst, PartialMatch); if (!CNode) { LLVM_DEBUG(dbgs() << " - No cnode identified\n"); return nullptr; @@ -807,7 +813,10 @@ return identifyAdd(Real, Imag); } - return nullptr; + auto Symmetric = identifySymmetricOperation(Real, Imag); + LLVM_DEBUG(if (Symmetric == nullptr) dbgs() + << " - Not recognised as a valid pattern.\n"); + return Symmetric; } bool ComplexDeinterleavingGraph::identifyNodes(Instruction *RootI) { @@ -832,7 +841,8 @@ // Check all instructions have internal uses for (const auto &Node : CompositeNodes) { if (!Node->hasAllInternalUses(AllInstructions)) { - LLVM_DEBUG(dbgs() << " - Invalid internal uses\n"); + LLVM_DEBUG(dbgs() << " - Invalid internal uses in " << Node.get() + << "\n"); return false; } }