summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/IR/Constants.cpp2
-rw-r--r--llvm/test/Transforms/ConstProp/insertvalue.ll10
-rw-r--r--llvm/unittests/IR/ConstantsTest.cpp23
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));
OpenPOWER on IntegriCloud