mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-02 08:26:29 +00:00
Patch provide by Tom Roeder!
Reviewed by Joe Abbey and Tobias Grosser Here is a patch that fixes decoding of CE_SELECT in BitcodeReader, along with a simple test case. The problem in the current code is that it generates but doesn't accept bitcode that uses vectors for the first element of a select in this context. llvm-svn: 190634
This commit is contained in:
parent
d3b8515190
commit
6cc6a1b98f
@ -1387,14 +1387,23 @@ bool BitcodeReader::ParseConstants() {
|
||||
bitc::CST_CODE_CE_INBOUNDS_GEP);
|
||||
break;
|
||||
}
|
||||
case bitc::CST_CODE_CE_SELECT: // CE_SELECT: [opval#, opval#, opval#]
|
||||
case bitc::CST_CODE_CE_SELECT: { // CE_SELECT: [opval#, opval#, opval#]
|
||||
if (Record.size() < 3) return Error("Invalid CE_SELECT record");
|
||||
V = ConstantExpr::getSelect(
|
||||
ValueList.getConstantFwdRef(Record[0],
|
||||
Type::getInt1Ty(Context)),
|
||||
ValueList.getConstantFwdRef(Record[1],CurTy),
|
||||
ValueList.getConstantFwdRef(Record[2],CurTy));
|
||||
|
||||
Type *SelectorTy = Type::getInt1Ty(Context);
|
||||
|
||||
// If CurTy is a vector of length n, then Record[0] must be a <n x i1>
|
||||
// vector. Otherwise, it must be a single bit.
|
||||
if (VectorType *VTy = dyn_cast<VectorType>(CurTy))
|
||||
SelectorTy = VectorType::get(Type::getInt1Ty(Context),
|
||||
VTy->getNumElements());
|
||||
|
||||
V = ConstantExpr::getSelect(ValueList.getConstantFwdRef(Record[0],
|
||||
SelectorTy),
|
||||
ValueList.getConstantFwdRef(Record[1],CurTy),
|
||||
ValueList.getConstantFwdRef(Record[2],CurTy));
|
||||
break;
|
||||
}
|
||||
case bitc::CST_CODE_CE_EXTRACTELT: { // CE_EXTRACTELT: [opty, opval, opval]
|
||||
if (Record.size() < 3) return Error("Invalid CE_EXTRACTELT record");
|
||||
VectorType *OpTy =
|
||||
|
9
test/Bitcode/select.ll
Normal file
9
test/Bitcode/select.ll
Normal file
@ -0,0 +1,9 @@
|
||||
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
|
||||
|
||||
define <2 x i32> @main() {
|
||||
ret <2 x i32> select (<2 x i1> <i1 false, i1 undef>, <2 x i32> zeroinitializer, <2 x i32> <i32 0, i32 undef>)
|
||||
}
|
||||
|
||||
; CHECK: define <2 x i32> @main() {
|
||||
; CHECK: ret <2 x i32> select (<2 x i1> <i1 false, i1 undef>, <2 x i32> zeroinitializer, <2 x i32> <i32 0, i32 undef>)
|
||||
; CHECK: }
|
Loading…
Reference in New Issue
Block a user