FIX PR7158. SimplifyVBinOp was asserting when it fails to constant fold (op (build_vector), (build_vector)).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104004 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2010-05-18 00:03:40 +00:00
parent 535af4a320
commit a083988c8a
2 changed files with 25 additions and 7 deletions

View File

@ -6344,13 +6344,14 @@ SDValue DAGCombiner::SimplifyVBinOp(SDNode *N) {
break;
}
Ops.push_back(DAG.getNode(N->getOpcode(), LHS.getDebugLoc(),
EltType, LHSOp, RHSOp));
AddToWorkList(Ops.back().getNode());
assert((Ops.back().getOpcode() == ISD::UNDEF ||
Ops.back().getOpcode() == ISD::Constant ||
Ops.back().getOpcode() == ISD::ConstantFP) &&
"Scalar binop didn't fold!");
SDValue FoldOp = DAG.getNode(N->getOpcode(), LHS.getDebugLoc(), EltType,
LHSOp, RHSOp);
if (FoldOp.getOpcode() != ISD::UNDEF &&
FoldOp.getOpcode() != ISD::Constant &&
FoldOp.getOpcode() != ISD::ConstantFP)
break;
Ops.push_back(FoldOp);
AddToWorkList(FoldOp.getNode());
}
if (Ops.size() == LHS.getNumOperands()) {

View File

@ -0,0 +1,17 @@
; RUN: llc < %s -mtriple=armv7-eabi -mcpu=cortex-a8
; PR7158
define arm_aapcs_vfpcc i32 @main() nounwind {
bb.nph55.bb.nph55.split_crit_edge:
br label %bb3
bb3: ; preds = %bb3, %bb.nph55.bb.nph55.split_crit_edge
br i1 undef, label %bb.i19, label %bb3
bb.i19: ; preds = %bb.i19, %bb3
%0 = insertelement <4 x float> undef, float undef, i32 3 ; <<4 x float>> [#uses=3]
%1 = fmul <4 x float> %0, %0 ; <<4 x float>> [#uses=1]
%2 = bitcast <4 x float> %1 to <2 x double> ; <<2 x double>> [#uses=0]
%3 = fmul <4 x float> %0, undef ; <<4 x float>> [#uses=0]
br label %bb.i19
}