[llvm-commits] [llvm] r109519 - in /llvm/trunk: lib/CodeGen/SelectionDAG/DAGCombiner.cpp test/CodeGen/Generic/2010-07-27-DAGCombineCrash.ll
Nate Begeman
natebegeman at mac.com
Tue Jul 27 11:02:19 PDT 2010
Author: sampo
Date: Tue Jul 27 13:02:18 2010
New Revision: 109519
URL: http://llvm.org/viewvc/llvm-project?rev=109519&view=rev
Log:
Fix a crash in the dag combiner caused by ConstantFoldBIT_CONVERTofBUILD_VECTOR calling itself
recursively and returning a SCALAR_TO_VECTOR node, but assuming the input was always a BUILD_VECTOR.
Added:
llvm/trunk/test/CodeGen/Generic/2010-07-27-DAGCombineCrash.ll
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=109519&r1=109518&r2=109519&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Jul 27 13:02:18 2010
@@ -4489,6 +4489,16 @@
// If this is a conversion of N elements of one type to N elements of another
// type, convert each element. This handles FP<->INT cases.
if (SrcBitSize == DstBitSize) {
+ EVT VT = EVT::getVectorVT(*DAG.getContext(), DstEltVT,
+ BV->getValueType(0).getVectorNumElements());
+
+ // Due to the FP element handling below calling this routine recursively,
+ // we can end up with a scalar-to-vector node here.
+ if (BV->getOpcode() == ISD::SCALAR_TO_VECTOR)
+ return DAG.getNode(ISD::SCALAR_TO_VECTOR, BV->getDebugLoc(), VT,
+ DAG.getNode(ISD::BIT_CONVERT, BV->getDebugLoc(),
+ DstEltVT, BV->getOperand(0)));
+
SmallVector<SDValue, 8> Ops;
for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
SDValue Op = BV->getOperand(i);
@@ -4500,8 +4510,6 @@
DstEltVT, Op));
AddToWorkList(Ops.back().getNode());
}
- EVT VT = EVT::getVectorVT(*DAG.getContext(), DstEltVT,
- BV->getValueType(0).getVectorNumElements());
return DAG.getNode(ISD::BUILD_VECTOR, BV->getDebugLoc(), VT,
&Ops[0], Ops.size());
}
Added: llvm/trunk/test/CodeGen/Generic/2010-07-27-DAGCombineCrash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/2010-07-27-DAGCombineCrash.ll?rev=109519&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Generic/2010-07-27-DAGCombineCrash.ll (added)
+++ llvm/trunk/test/CodeGen/Generic/2010-07-27-DAGCombineCrash.ll Tue Jul 27 13:02:18 2010
@@ -0,0 +1,6 @@
+; RUN: llc < %s
+
+define float @test1()
+{
+ ret float extractelement (<2 x float> bitcast (<1 x double> <double 0x3f800000> to <2 x float>), i32 1);
+}
More information about the llvm-commits
mailing list