@@ -298,9 +298,10 @@ define void @foo(i32 %v0) {
298298
299299TEST_F (SandboxIRTest, ConstantFP) {
300300 parseIR (C, R"IR(
301- define void @foo(float %v0, double %v1) {
301+ define void @foo(float %v0, double %v1, half %v2 ) {
302302 %fadd0 = fadd float %v0, 42.0
303303 %fadd1 = fadd double %v1, 43.0
304+ %fadd2 = fadd half %v2, 44.0
304305 ret void
305306}
306307)IR" );
@@ -312,12 +313,16 @@ define void @foo(float %v0, double %v1) {
312313 auto It = BB.begin ();
313314 auto *FAdd0 = cast<sandboxir::BinaryOperator>(&*It++);
314315 auto *FAdd1 = cast<sandboxir::BinaryOperator>(&*It++);
316+ auto *FAdd2 = cast<sandboxir::BinaryOperator>(&*It++);
315317 auto *FortyTwo = cast<sandboxir::ConstantFP>(FAdd0->getOperand (1 ));
316318 [[maybe_unused]] auto *FortyThree =
317319 cast<sandboxir::ConstantFP>(FAdd1->getOperand (1 ));
318320
319321 auto *FloatTy = sandboxir::Type::getFloatTy (Ctx);
320322 auto *DoubleTy = sandboxir::Type::getDoubleTy (Ctx);
323+ auto *HalfTy = sandboxir::Type::getHalfTy (Ctx);
324+ EXPECT_EQ (HalfTy, Ctx.getType (llvm::Type::getHalfTy (C)));
325+ EXPECT_EQ (FAdd2->getType (), HalfTy);
321326 auto *LLVMFloatTy = Type::getFloatTy (C);
322327 auto *LLVMDoubleTy = Type::getDoubleTy (C);
323328 // Check that creating an identical constant gives us the same object.
@@ -616,6 +621,7 @@ define void @foo() {
616621 %farray = extractvalue [2 x float] [float 0.0, float 1.0], 0
617622 %fvector = extractelement <2 x double> <double 0.0, double 1.0>, i32 0
618623 %string = extractvalue [6 x i8] [i8 72, i8 69, i8 76, i8 76, i8 79, i8 0], 0
624+ %stringNoNull = extractvalue [5 x i8] [i8 72, i8 69, i8 76, i8 76, i8 79], 0
619625 ret void
620626}
621627)IR" );
@@ -630,16 +636,19 @@ define void @foo() {
630636 auto *I2 = &*It++;
631637 auto *I3 = &*It++;
632638 auto *I4 = &*It++;
639+ auto *I5 = &*It++;
633640 auto *Array = cast<sandboxir::ConstantDataArray>(I0->getOperand (0 ));
634641 EXPECT_TRUE (isa<sandboxir::ConstantDataSequential>(Array));
635642 auto *Vector = cast<sandboxir::ConstantDataVector>(I1->getOperand (0 ));
636643 EXPECT_TRUE (isa<sandboxir::ConstantDataVector>(Vector));
637644 auto *FArray = cast<sandboxir::ConstantDataArray>(I2->getOperand (0 ));
638645 EXPECT_TRUE (isa<sandboxir::ConstantDataSequential>(FArray));
639- auto *FVector = cast<sandboxir::ConstantDataArray >(I3->getOperand (0 ));
646+ auto *FVector = cast<sandboxir::ConstantDataVector >(I3->getOperand (0 ));
640647 EXPECT_TRUE (isa<sandboxir::ConstantDataVector>(FVector));
641648 auto *String = cast<sandboxir::ConstantDataArray>(I4->getOperand (0 ));
642649 EXPECT_TRUE (isa<sandboxir::ConstantDataArray>(String));
650+ auto *StringNoNull = cast<sandboxir::ConstantDataArray>(I5->getOperand (0 ));
651+ EXPECT_TRUE (isa<sandboxir::ConstantDataArray>(StringNoNull));
643652
644653 auto *Zero8 = sandboxir::ConstantInt::get (sandboxir::Type::getInt8Ty (Ctx), 0 );
645654 auto *One8 = sandboxir::ConstantInt::get (sandboxir::Type::getInt8Ty (Ctx), 1 );
@@ -706,6 +715,44 @@ define void @foo() {
706715 EXPECT_EQ (String->getAsCString (), " HELLO" );
707716 // Check getRawDataValues().
708717 EXPECT_EQ (String->getRawDataValues (), HelloWithNull);
718+
719+ // Check ConstantDataArray member functions
720+ // ----------------------------------------
721+ // Check get<ElementTy>().
722+ EXPECT_EQ (sandboxir::ConstantDataArray::get<char >(Ctx, {0 , 1 }), Array);
723+ // Check get<ArrayTy>().
724+ SmallVector<char > Elmts ({0 , 1 });
725+ EXPECT_EQ (sandboxir::ConstantDataArray::get<SmallVector<char >>(Ctx, Elmts),
726+ Array);
727+ // Check getRaw().
728+ EXPECT_EQ (sandboxir::ConstantDataArray::getRaw (StringRef (" HELLO" ), 5 ,
729+ Zero8->getType ()),
730+ StringNoNull);
731+ // Check getFP().
732+ SmallVector<uint16_t > Elts16 ({42 , 43 });
733+ SmallVector<uint32_t > Elts32 ({42 , 43 });
734+ SmallVector<uint64_t > Elts64 ({42 , 43 });
735+ auto *F16Ty = sandboxir::Type::getHalfTy (Ctx);
736+ auto *F32Ty = sandboxir::Type::getFloatTy (Ctx);
737+ auto *F64Ty = sandboxir::Type::getDoubleTy (Ctx);
738+
739+ auto *CDA16 = sandboxir::ConstantDataArray::getFP (F16Ty, Elts16);
740+ EXPECT_EQ (CDA16, cast<sandboxir::ConstantDataArray>(
741+ Ctx.getValue (llvm::ConstantDataArray::getFP (
742+ llvm::Type::getHalfTy (C), Elts16))));
743+ auto *CDA32 = sandboxir::ConstantDataArray::getFP (F32Ty, Elts32);
744+ EXPECT_EQ (CDA32, cast<sandboxir::ConstantDataArray>(
745+ Ctx.getValue (llvm::ConstantDataArray::getFP (
746+ llvm::Type::getFloatTy (C), Elts32))));
747+ auto *CDA64 = sandboxir::ConstantDataArray::getFP (F64Ty, Elts64);
748+ EXPECT_EQ (CDA64, cast<sandboxir::ConstantDataArray>(
749+ Ctx.getValue (llvm::ConstantDataArray::getFP (
750+ llvm::Type::getDoubleTy (C), Elts64))));
751+ // Check getString().
752+ EXPECT_EQ (sandboxir::ConstantDataArray::getString (Ctx, " HELLO" ), String);
753+ EXPECT_EQ (sandboxir::ConstantDataArray::getString (Ctx, " HELLO" ,
754+ /* AddNull=*/ false ),
755+ StringNoNull);
709756}
710757
711758TEST_F (SandboxIRTest, ConstantPointerNull) {
0 commit comments