@@ -607,6 +607,107 @@ define void @foo(ptr %ptr, {i32, i8} %v1, <2 x i8> %v2) {
607607 EXPECT_EQ (NewVectorCAZ->getElementCount (), ElementCount::getFixed (4 ));
608608}
609609
610+ // Tests ConstantDataSequential, ConstantDataArray and ConstantDataVector.
611+ TEST_F (SandboxIRTest, ConstantDataSequential) {
612+ parseIR (C, R"IR(
613+ define void @foo() {
614+ %array = extractvalue [2 x i8] [i8 0, i8 1], 0
615+ %vector = extractelement <2 x i8> <i8 0, i8 1>, i32 0
616+ %farray = extractvalue [2 x float] [float 0.0, float 1.0], 0
617+ %fvector = extractelement <2 x double> <double 0.0, double 1.0>, i32 0
618+ %string = extractvalue [6 x i8] [i8 72, i8 69, i8 76, i8 76, i8 79, i8 0], 0
619+ ret void
620+ }
621+ )IR" );
622+ Function &LLVMF = *M->getFunction (" foo" );
623+ sandboxir::Context Ctx (C);
624+
625+ auto &F = *Ctx.createFunction (&LLVMF);
626+ auto &BB = *F.begin ();
627+ auto It = BB.begin ();
628+ auto *I0 = &*It++;
629+ auto *I1 = &*It++;
630+ auto *I2 = &*It++;
631+ auto *I3 = &*It++;
632+ auto *I4 = &*It++;
633+ auto *Array = cast<sandboxir::ConstantDataArray>(I0->getOperand (0 ));
634+ EXPECT_TRUE (isa<sandboxir::ConstantDataSequential>(Array));
635+ auto *Vector = cast<sandboxir::ConstantDataVector>(I1->getOperand (0 ));
636+ EXPECT_TRUE (isa<sandboxir::ConstantDataVector>(Vector));
637+ auto *FArray = cast<sandboxir::ConstantDataArray>(I2->getOperand (0 ));
638+ EXPECT_TRUE (isa<sandboxir::ConstantDataSequential>(FArray));
639+ auto *FVector = cast<sandboxir::ConstantDataArray>(I3->getOperand (0 ));
640+ EXPECT_TRUE (isa<sandboxir::ConstantDataVector>(FVector));
641+ auto *String = cast<sandboxir::ConstantDataArray>(I4->getOperand (0 ));
642+ EXPECT_TRUE (isa<sandboxir::ConstantDataArray>(String));
643+
644+ auto *Zero8 = sandboxir::ConstantInt::get (sandboxir::Type::getInt8Ty (Ctx), 0 );
645+ auto *One8 = sandboxir::ConstantInt::get (sandboxir::Type::getInt8Ty (Ctx), 1 );
646+
647+ // Check isElementTypeCompatible().
648+ for (llvm::Type *LLVMTy :
649+ {llvm::Type::getIntNTy (C, 42 ), llvm::Type::getInt8Ty (C)})
650+ EXPECT_EQ (llvm::ConstantDataSequential::isElementTypeCompatible (LLVMTy),
651+ sandboxir::ConstantDataSequential::isElementTypeCompatible (
652+ Ctx.getType (LLVMTy)));
653+ // Check getElementAsInteger().
654+ EXPECT_EQ (Array->getElementAsInteger (0 ), 0u );
655+ EXPECT_EQ (Array->getElementAsInteger (1 ), 1u );
656+ EXPECT_EQ (Vector->getElementAsInteger (0 ), 0u );
657+ EXPECT_EQ (Vector->getElementAsInteger (1 ), 1u );
658+ // Check getElementAsAPInt().
659+ EXPECT_EQ (Array->getElementAsAPInt (0 ), 0u );
660+ EXPECT_EQ (Array->getElementAsAPInt (1 ), 1u );
661+ EXPECT_EQ (Vector->getElementAsAPInt (0 ), 0u );
662+ EXPECT_EQ (Vector->getElementAsAPInt (1 ), 1u );
663+ // Check geteElementAsFloat().
664+ EXPECT_EQ (FArray->getElementAsFloat (0 ), 0.0 );
665+ EXPECT_EQ (FArray->getElementAsFloat (1 ), 1.0 );
666+ // Check getElementAsDouble().
667+ EXPECT_EQ (FVector->getElementAsDouble (0 ), 0.0 );
668+ EXPECT_EQ (FVector->getElementAsDouble (1 ), 1.0 );
669+ // Check getElementAsConstant().
670+ EXPECT_EQ (Array->getElementAsConstant (0 ), Zero8);
671+ EXPECT_EQ (Array->getElementAsConstant (1 ), One8);
672+ EXPECT_EQ (Vector->getElementAsConstant (0 ), Zero8);
673+ EXPECT_EQ (Vector->getElementAsConstant (1 ), One8);
674+ // Check getElementType().
675+ EXPECT_EQ (Array->getElementType (), sandboxir::Type::getInt8Ty (Ctx));
676+ EXPECT_EQ (Vector->getElementType (), sandboxir::Type::getInt8Ty (Ctx));
677+ EXPECT_EQ (FArray->getElementType (), sandboxir::Type::getFloatTy (Ctx));
678+ EXPECT_EQ (FVector->getElementType (), sandboxir::Type::getDoubleTy (Ctx));
679+ // Check getNumElements(),
680+ EXPECT_EQ (Array->getNumElements (), 2u );
681+ EXPECT_EQ (Vector->getNumElements (), 2u );
682+ EXPECT_EQ (FArray->getNumElements (), 2u );
683+ EXPECT_EQ (FVector->getNumElements (), 2u );
684+ // Check getElementByteSize().
685+ EXPECT_EQ (Array->getElementByteSize (), 1u );
686+ EXPECT_EQ (Vector->getElementByteSize (), 1u );
687+ EXPECT_EQ (FArray->getElementByteSize (), 4u );
688+ EXPECT_EQ (FVector->getElementByteSize (), 8u );
689+ // Check isString().
690+ EXPECT_EQ (Array->isString (), true );
691+ EXPECT_EQ (Vector->isString (), false );
692+ EXPECT_EQ (FArray->isString (), false );
693+ EXPECT_EQ (FVector->isString (), false );
694+ EXPECT_EQ (String->isString (), true );
695+ // Check isCString().
696+ EXPECT_EQ (Array->isCString (), false );
697+ EXPECT_EQ (Vector->isCString (), false );
698+ EXPECT_EQ (FArray->isCString (), false );
699+ EXPECT_EQ (FVector->isCString (), false );
700+ EXPECT_EQ (String->isCString (), true );
701+ // Check getAsString().
702+ char Data[] = {' H' , ' E' , ' L' , ' L' , ' O' , ' \0 ' };
703+ StringRef HelloWithNull (Data, 6 );
704+ EXPECT_EQ (String->getAsString (), HelloWithNull);
705+ // Check getAsCString().
706+ EXPECT_EQ (String->getAsCString (), " HELLO" );
707+ // Check getRawDataValues().
708+ EXPECT_EQ (String->getRawDataValues (), HelloWithNull);
709+ }
710+
610711TEST_F (SandboxIRTest, ConstantPointerNull) {
611712 parseIR (C, R"IR(
612713define ptr @foo() {
0 commit comments