diff --git a/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp b/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp index 9b1f7117fa573..3945913040fc6 100644 --- a/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp +++ b/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp @@ -271,8 +271,6 @@ class ComplexDeinterleavingGraph { 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 @@ ComplexDeinterleavingGraph::identifyPartialMul(Instruction *Real, 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; @@ -788,8 +794,10 @@ ComplexDeinterleavingGraph::identifyNode(Instruction *Real, Instruction *Imag) { PlaceholderNode->ReplacementNode = RealShuffle->getOperand(0); return submitCompositeNode(PlaceholderNode); } - if (RealShuffle || ImagShuffle) + if (RealShuffle || ImagShuffle) { + LLVM_DEBUG(dbgs() << " - There's a shuffle where there shouldn't be.\n"); return nullptr; + } auto *VTy = cast(Real->getType()); auto *NewVTy =