Fix an issue in SimplifySetCC() specific to vector comparisons.

When folding X == X we need to check getBooleanContents() to determine if the
result is a vector of ones or a vector of negative ones. 

I tried creating a test case, but the problem seems to only be exposed on a
much older version of clang (around r144500).
rdar://10923049


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153966 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chad Rosier 2012-04-03 20:11:24 +00:00
parent 1895fc90e0
commit 9dbb018b36

View File

@ -2432,8 +2432,16 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
if (N0 == N1) {
// We can always fold X == X for integer setcc's.
if (N0.getValueType().isInteger())
return DAG.getConstant(ISD::isTrueWhenEqual(Cond), VT);
if (N0.getValueType().isInteger()) {
switch (getBooleanContents(N0.getValueType().isVector())) {
default: llvm_unreachable ("Unknown boolean content.");
case UndefinedBooleanContent:
case ZeroOrOneBooleanContent:
return DAG.getConstant(ISD::isTrueWhenEqual(Cond), VT);
case ZeroOrNegativeOneBooleanContent:
return DAG.getConstant(ISD::isTrueWhenEqual(Cond) ? -1 : 0, VT);
}
}
unsigned UOF = ISD::getUnorderedFlavor(Cond);
if (UOF == 2) // FP operators that are undefined on NaNs.
return DAG.getConstant(ISD::isTrueWhenEqual(Cond), VT);