This patch fixes bug 23800. There existed a case where the index operand from
extractelement was directly used to create a shufflevector mask. Since the
index can be of any integral type but the mask must only contain 32 bit
integers a 64 bit index operand led to an assertion error later on.
http://reviews.llvm.org/D10838
Files:
lib/CodeGen/CGExprScalar.cpp
Index: lib/CodeGen/CGExprScalar.cpp
===================================================================
--- lib/CodeGen/CGExprScalar.cpp
+++ lib/CodeGen/CGExprScalar.cpp
@@ -1215,7 +1215,13 @@
Value *LHS = nullptr, *RHS = nullptr;
if (CurIdx == 0) {
// insert into undef -> shuffle (src, undef)
- Args.push_back(C);
+ // extractelement index can be any integer type
+ // shufflemask is only allowed to contain 32 bit integers
+ // make sure we can savely convert to 32 bit
+ assert(llvm::ConstantInt::isValueValidForType(CGF.Int32Ty,
+ C->getZExtValue()) &&
+ "Index operand too large for shufflevector mask!");
+ Args.push_back(Builder.getInt32(C->getZExtValue()));
Args.resize(ResElts, llvm::UndefValue::get(CGF.Int32Ty));
LHS = EI->getVectorOperand();
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Index: lib/CodeGen/CGExprScalar.cpp
===================================================================
--- lib/CodeGen/CGExprScalar.cpp
+++ lib/CodeGen/CGExprScalar.cpp
@@ -1215,7 +1215,13 @@
Value *LHS = nullptr, *RHS = nullptr;
if (CurIdx == 0) {
// insert into undef -> shuffle (src, undef)
- Args.push_back(C);
+ // extractelement index can be any integer type
+ // shufflemask is only allowed to contain 32 bit integers
+ // make sure we can savely convert to 32 bit
+ assert(llvm::ConstantInt::isValueValidForType(CGF.Int32Ty,
+ C->getZExtValue()) &&
+ "Index operand too large for shufflevector mask!");
+ Args.push_back(Builder.getInt32(C->getZExtValue()));
Args.resize(ResElts, llvm::UndefValue::get(CGF.Int32Ty));
LHS = EI->getVectorOperand();
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits