Fix PR9579: when simplifying a compare to "true" or "false", and it was

a vector compare, generate a vector result rather than i1 (and crashing).

llvm-svn: 130706
This commit is contained in:
Duncan Sands 2011-05-02 18:51:41 +00:00
parent 6b699f863f
commit f91c5ab341
2 changed files with 37 additions and 18 deletions

View File

@ -913,8 +913,6 @@ static Value *SimplifyRem(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1,
}
}
bool isSigned = Opcode == Instruction::SRem;
// X % undef -> undef
if (match(Op1, m_Undef()))
return Op1;
@ -1460,46 +1458,48 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
default:
assert(false && "Unknown ICmp predicate!");
case ICmpInst::ICMP_ULT:
return ConstantInt::getFalse(LHS->getContext());
// getNullValue also works for vectors, unlike getFalse.
return Constant::getNullValue(ITy);
case ICmpInst::ICMP_UGE:
return ConstantInt::getTrue(LHS->getContext());
// getAllOnesValue also works for vectors, unlike getTrue.
return ConstantInt::getAllOnesValue(ITy);
case ICmpInst::ICMP_EQ:
case ICmpInst::ICMP_ULE:
if (isKnownNonZero(LHS, TD))
return ConstantInt::getFalse(LHS->getContext());
return Constant::getNullValue(ITy);
break;
case ICmpInst::ICMP_NE:
case ICmpInst::ICMP_UGT:
if (isKnownNonZero(LHS, TD))
return ConstantInt::getTrue(LHS->getContext());
return ConstantInt::getAllOnesValue(ITy);
break;
case ICmpInst::ICMP_SLT:
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, TD);
if (LHSKnownNegative)
return ConstantInt::getTrue(LHS->getContext());
return ConstantInt::getAllOnesValue(ITy);
if (LHSKnownNonNegative)
return ConstantInt::getFalse(LHS->getContext());
return Constant::getNullValue(ITy);
break;
case ICmpInst::ICMP_SLE:
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, TD);
if (LHSKnownNegative)
return ConstantInt::getTrue(LHS->getContext());
return ConstantInt::getAllOnesValue(ITy);
if (LHSKnownNonNegative && isKnownNonZero(LHS, TD))
return ConstantInt::getFalse(LHS->getContext());
return Constant::getNullValue(ITy);
break;
case ICmpInst::ICMP_SGE:
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, TD);
if (LHSKnownNegative)
return ConstantInt::getFalse(LHS->getContext());
return Constant::getNullValue(ITy);
if (LHSKnownNonNegative)
return ConstantInt::getTrue(LHS->getContext());
return ConstantInt::getAllOnesValue(ITy);
break;
case ICmpInst::ICMP_SGT:
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, TD);
if (LHSKnownNegative)
return ConstantInt::getFalse(LHS->getContext());
return Constant::getNullValue(ITy);
if (LHSKnownNonNegative && isKnownNonZero(LHS, TD))
return ConstantInt::getTrue(LHS->getContext());
return ConstantInt::getAllOnesValue(ITy);
break;
}
}
@ -1791,7 +1791,8 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
case ICmpInst::ICMP_EQ:
case ICmpInst::ICMP_UGT:
case ICmpInst::ICMP_UGE:
return ConstantInt::getFalse(RHS->getContext());
// getNullValue also works for vectors, unlike getFalse.
return Constant::getNullValue(ITy);
case ICmpInst::ICMP_SLT:
case ICmpInst::ICMP_SLE:
ComputeSignBit(LHS, KnownNonNegative, KnownNegative, TD);
@ -1801,7 +1802,8 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
case ICmpInst::ICMP_NE:
case ICmpInst::ICMP_ULT:
case ICmpInst::ICMP_ULE:
return ConstantInt::getTrue(RHS->getContext());
// getAllOnesValue also works for vectors, unlike getTrue.
return Constant::getAllOnesValue(ITy);
}
}
if (RBO && match(RBO, m_URem(m_Value(), m_Specific(LHS)))) {
@ -1818,7 +1820,8 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
case ICmpInst::ICMP_NE:
case ICmpInst::ICMP_UGT:
case ICmpInst::ICMP_UGE:
return ConstantInt::getTrue(RHS->getContext());
// getAllOnesValue also works for vectors, unlike getTrue.
return Constant::getAllOnesValue(ITy);
case ICmpInst::ICMP_SLT:
case ICmpInst::ICMP_SLE:
ComputeSignBit(RHS, KnownNonNegative, KnownNegative, TD);
@ -1828,7 +1831,8 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
case ICmpInst::ICMP_EQ:
case ICmpInst::ICMP_ULT:
case ICmpInst::ICMP_ULE:
return ConstantInt::getFalse(RHS->getContext());
// getNullValue also works for vectors, unlike getFalse.
return Constant::getNullValue(ITy);
}
}

View File

@ -0,0 +1,15 @@
; RUN: opt < %s -instcombine
; PR9579
define <2 x i16> @entry(<2 x i16> %a) nounwind {
entry:
%a.addr = alloca <2 x i16>, align 4
%.compoundliteral = alloca <2 x i16>, align 4
store <2 x i16> %a, <2 x i16>* %a.addr, align 4
%tmp = load <2 x i16>* %a.addr, align 4
store <2 x i16> zeroinitializer, <2 x i16>* %.compoundliteral
%tmp1 = load <2 x i16>* %.compoundliteral
%cmp = icmp uge <2 x i16> %tmp, %tmp1
%sext = sext <2 x i1> %cmp to <2 x i16>
ret <2 x i16> %sext
}