@@ -298,9 +298,10 @@ define void @foo(i32 %v0) {
298
298
299
299
TEST_F (SandboxIRTest, ConstantFP) {
300
300
parseIR (C, R"IR(
301
- define void @foo(float %v0, double %v1) {
301
+ define void @foo(float %v0, double %v1, half %v2 ) {
302
302
%fadd0 = fadd float %v0, 42.0
303
303
%fadd1 = fadd double %v1, 43.0
304
+ %fadd2 = fadd half %v2, 44.0
304
305
ret void
305
306
}
306
307
)IR" );
@@ -312,12 +313,16 @@ define void @foo(float %v0, double %v1) {
312
313
auto It = BB.begin ();
313
314
auto *FAdd0 = cast<sandboxir::BinaryOperator>(&*It++);
314
315
auto *FAdd1 = cast<sandboxir::BinaryOperator>(&*It++);
316
+ auto *FAdd2 = cast<sandboxir::BinaryOperator>(&*It++);
315
317
auto *FortyTwo = cast<sandboxir::ConstantFP>(FAdd0->getOperand (1 ));
316
318
[[maybe_unused]] auto *FortyThree =
317
319
cast<sandboxir::ConstantFP>(FAdd1->getOperand (1 ));
318
320
319
321
auto *FloatTy = sandboxir::Type::getFloatTy (Ctx);
320
322
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);
321
326
auto *LLVMFloatTy = Type::getFloatTy (C);
322
327
auto *LLVMDoubleTy = Type::getDoubleTy (C);
323
328
// Check that creating an identical constant gives us the same object.
@@ -616,6 +621,7 @@ define void @foo() {
616
621
%farray = extractvalue [2 x float] [float 0.0, float 1.0], 0
617
622
%fvector = extractelement <2 x double> <double 0.0, double 1.0>, i32 0
618
623
%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
619
625
ret void
620
626
}
621
627
)IR" );
@@ -630,16 +636,19 @@ define void @foo() {
630
636
auto *I2 = &*It++;
631
637
auto *I3 = &*It++;
632
638
auto *I4 = &*It++;
639
+ auto *I5 = &*It++;
633
640
auto *Array = cast<sandboxir::ConstantDataArray>(I0->getOperand (0 ));
634
641
EXPECT_TRUE (isa<sandboxir::ConstantDataSequential>(Array));
635
642
auto *Vector = cast<sandboxir::ConstantDataVector>(I1->getOperand (0 ));
636
643
EXPECT_TRUE (isa<sandboxir::ConstantDataVector>(Vector));
637
644
auto *FArray = cast<sandboxir::ConstantDataArray>(I2->getOperand (0 ));
638
645
EXPECT_TRUE (isa<sandboxir::ConstantDataSequential>(FArray));
639
- auto *FVector = cast<sandboxir::ConstantDataArray >(I3->getOperand (0 ));
646
+ auto *FVector = cast<sandboxir::ConstantDataVector >(I3->getOperand (0 ));
640
647
EXPECT_TRUE (isa<sandboxir::ConstantDataVector>(FVector));
641
648
auto *String = cast<sandboxir::ConstantDataArray>(I4->getOperand (0 ));
642
649
EXPECT_TRUE (isa<sandboxir::ConstantDataArray>(String));
650
+ auto *StringNoNull = cast<sandboxir::ConstantDataArray>(I5->getOperand (0 ));
651
+ EXPECT_TRUE (isa<sandboxir::ConstantDataArray>(StringNoNull));
643
652
644
653
auto *Zero8 = sandboxir::ConstantInt::get (sandboxir::Type::getInt8Ty (Ctx), 0 );
645
654
auto *One8 = sandboxir::ConstantInt::get (sandboxir::Type::getInt8Ty (Ctx), 1 );
@@ -706,6 +715,44 @@ define void @foo() {
706
715
EXPECT_EQ (String->getAsCString (), " HELLO" );
707
716
// Check getRawDataValues().
708
717
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);
709
756
}
710
757
711
758
TEST_F (SandboxIRTest, ConstantPointerNull) {
0 commit comments