summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Paulsson <paulsson@linux.vnet.ibm.com>2017-04-05 13:45:37 +0000
committerJonas Paulsson <paulsson@linux.vnet.ibm.com>2017-04-05 13:45:37 +0000
commit38a2da92bccb3c8aec76d5cb70ec6750805a6bc2 (patch)
tree986aac1aa0d87148590a640d2ec2ab725b11f2ee
parent8090e6f00450afce056760371d3cc46a4176fcfb (diff)
downloadbcm5719-llvm-38a2da92bccb3c8aec76d5cb70ec6750805a6bc2.tar.gz
bcm5719-llvm-38a2da92bccb3c8aec76d5cb70ec6750805a6bc2.zip
[DAGCombiner] Don't make a BUILD_VECTOR with operands of illegal type.
When DAGCombiner visits a SIGN_EXTEND_INREG of a BUILD_VECTOR with constant operands, a new BUILD_VECTOR node will be created transformed constants. Llvm-stress found a case where the new BUILD_VECTOR had constant operands of an illegal type, because the (legal) element type is in fact not a legal scalar type. This patch changes this so that the new BUILD_VECTOR has the same operand type as the old one. Review: Eli Friedman, Nirav Dave https://bugs.llvm.org//show_bug.cgi?id=32422 llvm-svn: 299540
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp12
-rw-r--r--llvm/test/CodeGen/SystemZ/DAGCombiner_illegal_BUILD_VECTOR.ll26
2 files changed, 32 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 87cd8dfe312..163458096fd 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -4188,29 +4188,29 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
assert(EVT.bitsLE(VT) && "Not extending!");
if (EVT == VT) return N1; // Not actually extending
- auto SignExtendInReg = [&](APInt Val) {
+ auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
unsigned FromBits = EVT.getScalarSizeInBits();
Val <<= Val.getBitWidth() - FromBits;
Val = Val.ashr(Val.getBitWidth() - FromBits);
- return getConstant(Val, DL, VT.getScalarType());
+ return getConstant(Val, DL, ConstantVT);
};
if (N1C) {
const APInt &Val = N1C->getAPIntValue();
- return SignExtendInReg(Val);
+ return SignExtendInReg(Val, VT);
}
if (ISD::isBuildVectorOfConstantSDNodes(N1.getNode())) {
SmallVector<SDValue, 8> Ops;
+ llvm::EVT OpVT = N1.getOperand(0).getValueType();
for (int i = 0, e = VT.getVectorNumElements(); i != e; ++i) {
SDValue Op = N1.getOperand(i);
if (Op.isUndef()) {
- Ops.push_back(getUNDEF(VT.getScalarType()));
+ Ops.push_back(getUNDEF(OpVT));
continue;
}
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
APInt Val = C->getAPIntValue();
- Val = Val.zextOrTrunc(VT.getScalarSizeInBits());
- Ops.push_back(SignExtendInReg(Val));
+ Ops.push_back(SignExtendInReg(Val, OpVT));
continue;
}
break;
diff --git a/llvm/test/CodeGen/SystemZ/DAGCombiner_illegal_BUILD_VECTOR.ll b/llvm/test/CodeGen/SystemZ/DAGCombiner_illegal_BUILD_VECTOR.ll
new file mode 100644
index 00000000000..3e5757c902c
--- /dev/null
+++ b/llvm/test/CodeGen/SystemZ/DAGCombiner_illegal_BUILD_VECTOR.ll
@@ -0,0 +1,26 @@
+; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
+;
+; Check that DAGCombiner does not crash after producing an illegal
+; BUILD_VECTOR node.
+
+
+define void @pr32422() {
+; CHECK: cdbr %f0, %f0
+; CHECK: jo .LBB0_1
+
+BB:
+ %I = insertelement <8 x i8> zeroinitializer, i8 -95, i32 3
+ %I8 = insertelement <8 x i8> zeroinitializer, i8 -119, i32 2
+ %FC = uitofp <8 x i8> %I8 to <8 x float>
+ %Cmp18 = fcmp uno <8 x float> zeroinitializer, %FC
+ %I22 = insertelement <8 x i1> %Cmp18, i1 true, i32 5
+ br label %CF
+
+CF: ; preds = %CF, %BB
+ %Cmp40 = fcmp uno double 0xC663C682E9619F00, undef
+ br i1 %Cmp40, label %CF, label %CF353
+
+CF353: ; preds = %CF
+ %E195 = extractelement <8 x i1> %I22, i32 4
+ ret void
+}
OpenPOWER on IntegriCloud