InstCombine: Harden code to work with vectors of pointers and simplify it a bit.

Found by running instcombine on a fabricated test case for the constant folder.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174430 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer 2013-02-05 19:21:56 +00:00
parent 1d3d2c57f5
commit 1018fa256d
2 changed files with 22 additions and 11 deletions

View File

@ -1395,17 +1395,13 @@ Instruction *InstCombiner::visitPtrToInt(PtrToIntInst &CI) {
// If the destination integer type is not the intptr_t type for this target,
// do a ptrtoint to intptr_t then do a trunc or zext. This allows the cast
// to be exposed to other transforms.
if (TD) {
if (CI.getType()->getScalarSizeInBits() < TD->getPointerSizeInBits()) {
Value *P = Builder->CreatePtrToInt(CI.getOperand(0),
TD->getIntPtrType(CI.getContext()));
return new TruncInst(P, CI.getType());
}
if (CI.getType()->getScalarSizeInBits() > TD->getPointerSizeInBits()) {
Value *P = Builder->CreatePtrToInt(CI.getOperand(0),
TD->getIntPtrType(CI.getContext()));
return new ZExtInst(P, CI.getType());
}
if (TD && CI.getType()->getScalarSizeInBits() != TD->getPointerSizeInBits()) {
Type *Ty = TD->getIntPtrType(CI.getContext());
if (CI.getType()->isVectorTy()) // Handle vectors of pointers.
Ty = VectorType::get(Ty, CI.getType()->getVectorNumElements());
Value *P = Builder->CreatePtrToInt(CI.getOperand(0), Ty);
return CastInst::CreateIntegerCast(P, CI.getType(), /*isSigned=*/false);
}
return commonPointerCastTransforms(CI);

View File

@ -27,3 +27,18 @@ define i64 @f0(i32 %a0) nounwind {
ret i64 %t1
}
define <4 x i32> @test4(<4 x i8*> %arg) nounwind {
; CHECK: @test4
; CHECK: ptrtoint <4 x i8*> %arg to <4 x i64>
; CHECK: trunc <4 x i64> %1 to <4 x i32>
%p1 = ptrtoint <4 x i8*> %arg to <4 x i32>
ret <4 x i32> %p1
}
define <4 x i128> @test5(<4 x i8*> %arg) nounwind {
; CHECK: @test5
; CHECK: ptrtoint <4 x i8*> %arg to <4 x i64>
; CHECK: zext <4 x i64> %1 to <4 x i128>
%p1 = ptrtoint <4 x i8*> %arg to <4 x i128>
ret <4 x i128> %p1
}