@@ -622,6 +622,7 @@ define void @foo() {
622622 %fvector = extractelement <2 x double> <double 0.0, double 1.0>, i32 0
623623 %string = extractvalue [6 x i8] [i8 72, i8 69, i8 76, i8 76, i8 79, i8 0], 0
624624 %stringNoNull = extractvalue [5 x i8] [i8 72, i8 69, i8 76, i8 76, i8 79], 0
625+ %splat = extractelement <4 x i8> <i8 1, i8 1, i8 1, i8 1>, i32 0
625626 ret void
626627}
627628)IR" );
@@ -637,6 +638,7 @@ define void @foo() {
637638 auto *I3 = &*It++;
638639 auto *I4 = &*It++;
639640 auto *I5 = &*It++;
641+ auto *I6 = &*It++;
640642 auto *Array = cast<sandboxir::ConstantDataArray>(I0->getOperand (0 ));
641643 EXPECT_TRUE (isa<sandboxir::ConstantDataSequential>(Array));
642644 auto *Vector = cast<sandboxir::ConstantDataVector>(I1->getOperand (0 ));
@@ -649,6 +651,8 @@ define void @foo() {
649651 EXPECT_TRUE (isa<sandboxir::ConstantDataArray>(String));
650652 auto *StringNoNull = cast<sandboxir::ConstantDataArray>(I5->getOperand (0 ));
651653 EXPECT_TRUE (isa<sandboxir::ConstantDataArray>(StringNoNull));
654+ auto *Splat = cast<sandboxir::ConstantDataVector>(I6->getOperand (0 ));
655+ EXPECT_TRUE (isa<sandboxir::ConstantDataVector>(Splat));
652656
653657 auto *Zero8 = sandboxir::ConstantInt::get (sandboxir::Type::getInt8Ty (Ctx), 0 );
654658 auto *One8 = sandboxir::ConstantInt::get (sandboxir::Type::getInt8Ty (Ctx), 1 );
@@ -750,9 +754,74 @@ define void @foo() {
750754 llvm::Type::getDoubleTy (C), Elts64))));
751755 // Check getString().
752756 EXPECT_EQ (sandboxir::ConstantDataArray::getString (Ctx, " HELLO" ), String);
757+
753758 EXPECT_EQ (sandboxir::ConstantDataArray::getString (Ctx, " HELLO" ,
754759 /* AddNull=*/ false ),
755760 StringNoNull);
761+ EXPECT_EQ (
762+ sandboxir::ConstantDataArray::getString (Ctx, " HELLO" , /* AddNull=*/ false ),
763+ StringNoNull);
764+
765+ {
766+ // Check ConstantDataArray member functions
767+ // ----------------------------------------
768+ // Check get().
769+ SmallVector<uint8_t > Elts8 ({0u , 1u });
770+ SmallVector<uint16_t > Elts16 ({0u , 1u });
771+ SmallVector<uint32_t > Elts32 ({0u , 1u });
772+ SmallVector<uint64_t > Elts64 ({0u , 1u });
773+ SmallVector<float > EltsF32 ({0.0 , 1.0 });
774+ SmallVector<double > EltsF64 ({0.0 , 1.0 });
775+ auto *CDV8 = sandboxir::ConstantDataVector::get (Ctx, Elts8);
776+ EXPECT_EQ (CDV8, cast<sandboxir::ConstantDataVector>(
777+ Ctx.getValue (llvm::ConstantDataVector::get (C, Elts8))));
778+ auto *CDV16 = sandboxir::ConstantDataVector::get (Ctx, Elts16);
779+ EXPECT_EQ (CDV16, cast<sandboxir::ConstantDataVector>(Ctx.getValue (
780+ llvm::ConstantDataVector::get (C, Elts16))));
781+ auto *CDV32 = sandboxir::ConstantDataVector::get (Ctx, Elts32);
782+ EXPECT_EQ (CDV32, cast<sandboxir::ConstantDataVector>(Ctx.getValue (
783+ llvm::ConstantDataVector::get (C, Elts32))));
784+ auto *CDVF32 = sandboxir::ConstantDataVector::get (Ctx, EltsF32);
785+ EXPECT_EQ (CDVF32, cast<sandboxir::ConstantDataVector>(Ctx.getValue (
786+ llvm::ConstantDataVector::get (C, EltsF32))));
787+ auto *CDVF64 = sandboxir::ConstantDataVector::get (Ctx, EltsF64);
788+ EXPECT_EQ (CDVF64, cast<sandboxir::ConstantDataVector>(Ctx.getValue (
789+ llvm::ConstantDataVector::get (C, EltsF64))));
790+ // Check getRaw().
791+ auto *CDVRaw = sandboxir::ConstantDataVector::getRaw (
792+ StringRef (" HELLO" ), 5 , sandboxir::Type::getInt8Ty (Ctx));
793+ EXPECT_EQ (CDVRaw,
794+ cast<sandboxir::ConstantDataVector>(
795+ Ctx.getValue (llvm::ConstantDataVector::getRaw (
796+ StringRef (" HELLO" ), 5 , llvm::Type::getInt8Ty (C)))));
797+ // Check getFP().
798+ auto *CDVFP16 = sandboxir::ConstantDataVector::getFP (F16Ty, Elts16);
799+ EXPECT_EQ (CDVFP16, cast<sandboxir::ConstantDataVector>(
800+ Ctx.getValue (llvm::ConstantDataVector::getFP (
801+ llvm::Type::getHalfTy (C), Elts16))));
802+ auto *CDVFP32 = sandboxir::ConstantDataVector::getFP (F32Ty, Elts32);
803+ EXPECT_EQ (CDVFP32, cast<sandboxir::ConstantDataVector>(
804+ Ctx.getValue (llvm::ConstantDataVector::getFP (
805+ llvm::Type::getFloatTy (C), Elts32))));
806+ auto *CDVFP64 = sandboxir::ConstantDataVector::getFP (F64Ty, Elts64);
807+ EXPECT_EQ (CDVFP64, cast<sandboxir::ConstantDataVector>(
808+ Ctx.getValue (llvm::ConstantDataVector::getFP (
809+ llvm::Type::getDoubleTy (C), Elts64))));
810+ // Check getSplat().
811+ auto *NewSplat = cast<sandboxir::ConstantDataVector>(
812+ sandboxir::ConstantDataVector::getSplat (4 , One8));
813+ EXPECT_EQ (NewSplat, Splat);
814+ // Check isSplat().
815+ EXPECT_TRUE (NewSplat->isSplat ());
816+ EXPECT_FALSE (Vector->isSplat ());
817+ // Check getSplatValue().
818+ EXPECT_EQ (NewSplat->getSplatValue (), One8);
819+ // Check getType().
820+ EXPECT_TRUE (isa<sandboxir::FixedVectorType>(NewSplat->getType ()));
821+ EXPECT_EQ (
822+ cast<sandboxir::FixedVectorType>(NewSplat->getType ())->getNumElements (),
823+ 4u );
824+ }
756825}
757826
758827TEST_F (SandboxIRTest, ConstantPointerNull) {
0 commit comments