diff options
-rw-r--r-- | llvm/lib/IR/Constants.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Transforms/ConstProp/insertvalue.ll | 10 | ||||
-rw-r--r-- | llvm/unittests/IR/ConstantsTest.cpp | 23 |
3 files changed, 34 insertions, 1 deletions
diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp index 509783fff8b..36282c16429 100644 --- a/llvm/lib/IR/Constants.cpp +++ b/llvm/lib/IR/Constants.cpp @@ -2523,7 +2523,7 @@ Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<double> Elts) { /// object. Constant *ConstantDataArray::getFP(LLVMContext &Context, ArrayRef<uint16_t> Elts) { - Type *Ty = VectorType::get(Type::getHalfTy(Context), Elts.size()); + Type *Ty = ArrayType::get(Type::getHalfTy(Context), Elts.size()); const char *Data = reinterpret_cast<const char *>(Elts.data()); return getImpl(StringRef(const_cast<char *>(Data), Elts.size() * 2), Ty); } diff --git a/llvm/test/Transforms/ConstProp/insertvalue.ll b/llvm/test/Transforms/ConstProp/insertvalue.ll index dce2b728b93..606f7ddc679 100644 --- a/llvm/test/Transforms/ConstProp/insertvalue.ll +++ b/llvm/test/Transforms/ConstProp/insertvalue.ll @@ -74,3 +74,13 @@ define i32 @test-float-Nan() { ; CHECK: @test-float-Nan ; CHECK: ret i32 2139171423 } + +define i16 @test-half-Nan() { + %A = bitcast i16 32256 to half + %B = insertvalue [1 x half] undef, half %A, 0 + %C = extractvalue [1 x half] %B, 0 + %D = bitcast half %C to i16 + ret i16 %D +; CHECK: @test-half-Nan +; CHECK: ret i16 32256 +} diff --git a/llvm/unittests/IR/ConstantsTest.cpp b/llvm/unittests/IR/ConstantsTest.cpp index 8c33453d293..0bf98f35b3c 100644 --- a/llvm/unittests/IR/ConstantsTest.cpp +++ b/llvm/unittests/IR/ConstantsTest.cpp @@ -389,6 +389,29 @@ static std::string getNameOfType(Type *T) { return S; } +TEST(ConstantsTest, BuildConstantDataArrays) { + LLVMContext Context; + std::unique_ptr<Module> M(new Module("MyModule", Context)); + + for (Type *T : {Type::getInt8Ty(Context), Type::getInt16Ty(Context), + Type::getInt32Ty(Context), Type::getInt64Ty(Context)}) { + ArrayType *ArrayTy = ArrayType::get(T, 2); + Constant *Vals[] = {ConstantInt::get(T, 0), ConstantInt::get(T, 1)}; + Constant *CDV = ConstantArray::get(ArrayTy, Vals); + ASSERT_TRUE(dyn_cast<ConstantDataArray>(CDV) != nullptr) + << " T = " << getNameOfType(T); + } + + for (Type *T : {Type::getHalfTy(Context), Type::getFloatTy(Context), + Type::getDoubleTy(Context)}) { + ArrayType *ArrayTy = ArrayType::get(T, 2); + Constant *Vals[] = {ConstantFP::get(T, 0), ConstantFP::get(T, 1)}; + Constant *CDV = ConstantArray::get(ArrayTy, Vals); + ASSERT_TRUE(dyn_cast<ConstantDataArray>(CDV) != nullptr) + << " T = " << getNameOfType(T); + } +} + TEST(ConstantsTest, BuildConstantDataVectors) { LLVMContext Context; std::unique_ptr<Module> M(new Module("MyModule", Context)); |