Add suppport for ConstantExprs of shufflevectors whose result type is not equal to the
type of the vectors being shuffled. llvm-svn: 64401
This commit is contained in:
@@ -933,7 +933,7 @@ bool BitcodeReader::ParseConstants() {
|
||||
case bitc::CST_CODE_CE_SHUFFLEVEC: { // CE_SHUFFLEVEC: [opval, opval, opval]
|
||||
const VectorType *OpTy = dyn_cast<VectorType>(CurTy);
|
||||
if (Record.size() < 3 || OpTy == 0)
|
||||
return Error("Invalid CE_INSERTELT record");
|
||||
return Error("Invalid CE_SHUFFLEVEC record");
|
||||
Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy);
|
||||
Constant *Op1 = ValueList.getConstantFwdRef(Record[1], OpTy);
|
||||
const Type *ShufTy=VectorType::get(Type::Int32Ty, OpTy->getNumElements());
|
||||
@@ -941,6 +941,18 @@ bool BitcodeReader::ParseConstants() {
|
||||
V = ConstantExpr::getShuffleVector(Op0, Op1, Op2);
|
||||
break;
|
||||
}
|
||||
case bitc::CST_CODE_CE_SHUFVEC_EX: { // [opty, opval, opval, opval]
|
||||
const VectorType *RTy = dyn_cast<VectorType>(CurTy);
|
||||
const VectorType *OpTy = dyn_cast<VectorType>(getTypeByID(Record[0]));
|
||||
if (Record.size() < 4 || RTy == 0 || OpTy == 0)
|
||||
return Error("Invalid CE_SHUFVEC_EX record");
|
||||
Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy);
|
||||
Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy);
|
||||
const Type *ShufTy=VectorType::get(Type::Int32Ty, RTy->getNumElements());
|
||||
Constant *Op2 = ValueList.getConstantFwdRef(Record[3], ShufTy);
|
||||
V = ConstantExpr::getShuffleVector(Op0, Op1, Op2);
|
||||
break;
|
||||
}
|
||||
case bitc::CST_CODE_CE_CMP: { // CE_CMP: [opty, opval, opval, pred]
|
||||
if (Record.size() < 4) return Error("Invalid CE_CMP record");
|
||||
const Type *OpTy = getTypeByID(Record[0]);
|
||||
|
||||
@@ -643,7 +643,16 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal,
|
||||
Record.push_back(VE.getValueID(C->getOperand(2)));
|
||||
break;
|
||||
case Instruction::ShuffleVector:
|
||||
Code = bitc::CST_CODE_CE_SHUFFLEVEC;
|
||||
// If the return type and argument types are the same, this is a
|
||||
// standard shufflevector instruction. If the types are different,
|
||||
// then the shuffle is widening or truncating the input vectors, and
|
||||
// the argument type must also be encoded.
|
||||
if (C->getType() == C->getOperand(0)->getType()) {
|
||||
Code = bitc::CST_CODE_CE_SHUFFLEVEC;
|
||||
} else {
|
||||
Code = bitc::CST_CODE_CE_SHUFVEC_EX;
|
||||
Record.push_back(VE.getTypeID(C->getOperand(0)->getType()));
|
||||
}
|
||||
Record.push_back(VE.getValueID(C->getOperand(0)));
|
||||
Record.push_back(VE.getValueID(C->getOperand(1)));
|
||||
Record.push_back(VE.getValueID(C->getOperand(2)));
|
||||
|
||||
Reference in New Issue
Block a user