add a simple instcombine xform, simplify another one to use hasAllZeroIndices()

instead of hand rolling a loop.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92403 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-01-01 23:09:08 +00:00
parent 85c1c964dc
commit ec12d05019
2 changed files with 21 additions and 13 deletions

View File

@ -6427,21 +6427,12 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
if (Instruction *LHSI = dyn_cast<Instruction>(Op0))
switch (LHSI->getOpcode()) {
case Instruction::GetElementPtr:
if (RHSC->isNullValue()) {
// icmp pred GEP (P, int 0, int 0, int 0), null -> icmp pred P, null
bool isAllZeros = true;
for (unsigned i = 1, e = LHSI->getNumOperands(); i != e; ++i)
if (!isa<Constant>(LHSI->getOperand(i)) ||
!cast<Constant>(LHSI->getOperand(i))->isNullValue()) {
isAllZeros = false;
break;
}
if (isAllZeros)
return new ICmpInst(I.getPredicate(), LHSI->getOperand(0),
Constant::getNullValue(LHSI->getOperand(0)->getType()));
}
if (RHSC->isNullValue() &&
cast<GetElementPtrInst>(LHSI)->hasAllZeroIndices())
return new ICmpInst(I.getPredicate(), LHSI->getOperand(0),
Constant::getNullValue(LHSI->getOperand(0)->getType()));
break;
case Instruction::PHI:
// Only fold icmp into the PHI if the phi and icmp are in the same
// block. If in the same block, we're encouraging jump threading. If
@ -6506,6 +6497,14 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
}
}
break;
case Instruction::IntToPtr:
// icmp pred inttoptr(X), null -> icmp pred X, 0
if (RHSC->isNullValue() && TD &&
TD->getIntPtrType(RHSC->getContext()) ==
LHSI->getOperand(0)->getType())
return new ICmpInst(I.getPredicate(), LHSI->getOperand(0),
Constant::getNullValue(LHSI->getOperand(0)->getType()));
break;
}
}

View File

@ -36,3 +36,12 @@ define i1 @test3(i8* %a) {
%r = icmp eq i32 %tmpa, ptrtoint (i8* @global to i32)
ret i1 %r
}
define i1 @test4(i32 %A) {
%B = inttoptr i32 %A to i8*
%C = icmp eq i8* %B, null
ret i1 %C
; CHECK: @test4
; CHECK-NEXT: %C = icmp eq i32 %A, 0
; CHECK-NEXT: ret i1 %C
}