diff options
author | Joe Abbey <jabbey@arxan.com> | 2013-09-12 22:02:31 +0000 |
---|---|---|
committer | Joe Abbey <jabbey@arxan.com> | 2013-09-12 22:02:31 +0000 |
commit | 405b6503b3568cfb4da9d1347e3f5640583429c9 (patch) | |
tree | af085224929db49071eec6b3016d15009e4462bd /lib/Bitcode | |
parent | e7262388ed59b3ffcd5463884a4dda574e6d4c0d (diff) | |
download | external_llvm-405b6503b3568cfb4da9d1347e3f5640583429c9.zip external_llvm-405b6503b3568cfb4da9d1347e3f5640583429c9.tar.gz external_llvm-405b6503b3568cfb4da9d1347e3f5640583429c9.tar.bz2 |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190634 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bitcode')
-rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 3ac6e03..ca432fd 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -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 = |