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 | |
parent | e7262388ed59b3ffcd5463884a4dda574e6d4c0d (diff) | |
download | external_llvm-405b6503b3568cfb4da9d1347e3f5640583429c9.tar.gz external_llvm-405b6503b3568cfb4da9d1347e3f5640583429c9.tar.bz2 external_llvm-405b6503b3568cfb4da9d1347e3f5640583429c9.zip |
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
-rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 21 | ||||
-rw-r--r-- | test/Bitcode/select.ll | 9 |
2 files changed, 24 insertions, 6 deletions
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 3ac6e038fd..ca432fd590 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 = diff --git a/test/Bitcode/select.ll b/test/Bitcode/select.ll new file mode 100644 index 0000000000..71e669a90c --- /dev/null +++ b/test/Bitcode/select.ll @@ -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: } |