@@ -606,12 +606,14 @@ TEST(InstructionTest, ConstrainedTrans) {
606606
607607TEST (InstructionsTest, isEliminableCastPair) {
608608 LLVMContext C;
609- DataLayout DL1 (" p1:32:32" );
609+ DataLayout DL1 (" p1:32:32-p2:64:64:64:32 " );
610610
611611 Type *Int16Ty = Type::getInt16Ty (C);
612+ Type *Int32Ty = Type::getInt32Ty (C);
612613 Type *Int64Ty = Type::getInt64Ty (C);
613614 Type *PtrTy64 = PointerType::get (C, 0 );
614615 Type *PtrTy32 = PointerType::get (C, 1 );
616+ Type *PtrTy64_32 = PointerType::get (C, 2 );
615617
616618 // Source and destination pointers have same size -> bitcast.
617619 EXPECT_EQ (CastInst::isEliminableCastPair (CastInst::PtrToInt,
@@ -637,6 +639,42 @@ TEST(InstructionsTest, isEliminableCastPair) {
637639 Int64Ty, &DL1),
638640 0U );
639641
642+ // Destination larger than source. Pointer type same as destination.
643+ EXPECT_EQ (CastInst::isEliminableCastPair (CastInst::IntToPtr,
644+ CastInst::PtrToInt, Int16Ty, PtrTy64,
645+ Int64Ty, &DL1),
646+ CastInst::ZExt);
647+
648+ // Destination larger than source. Pointer type different from destination.
649+ EXPECT_EQ (CastInst::isEliminableCastPair (CastInst::IntToPtr,
650+ CastInst::PtrToInt, Int16Ty, PtrTy32,
651+ Int64Ty, &DL1),
652+ CastInst::ZExt);
653+
654+ // Destination smaller than source. Pointer type same as source.
655+ EXPECT_EQ (CastInst::isEliminableCastPair (CastInst::IntToPtr,
656+ CastInst::PtrToInt, Int64Ty, PtrTy64,
657+ Int16Ty, &DL1),
658+ CastInst::Trunc);
659+
660+ // Destination smaller than source. Pointer type different from source.
661+ EXPECT_EQ (CastInst::isEliminableCastPair (CastInst::IntToPtr,
662+ CastInst::PtrToInt, Int64Ty, PtrTy32,
663+ Int16Ty, &DL1),
664+ CastInst::Trunc);
665+
666+ // ptrtoaddr with address size != pointer size. Truncating case.
667+ EXPECT_EQ (CastInst::isEliminableCastPair (CastInst::IntToPtr,
668+ CastInst::PtrToAddr, Int64Ty,
669+ PtrTy64_32, Int32Ty, &DL1),
670+ CastInst::Trunc);
671+
672+ // ptrtoaddr with address size != pointer size. Non-truncating case.
673+ EXPECT_EQ (CastInst::isEliminableCastPair (CastInst::IntToPtr,
674+ CastInst::PtrToAddr, Int32Ty,
675+ PtrTy64_32, Int32Ty, &DL1),
676+ CastInst::BitCast);
677+
640678 // Test that we don't eliminate bitcasts between different address spaces,
641679 // or if we don't have available pointer size information.
642680 DataLayout DL2 (" e-p:32:32:32-p1:16:16:16-p2:64:64:64-i1:8:8-i8:8:8-i16:16:16"
0 commit comments