Fixed not equal folding The not equal folding logic was wrong. It would end the loop as soon as it found equal components, which was checking if ALL components are not equal, but that's not how not equal works, it should return true if ANY component is not equal. I also refactored it because it was hard to follow, with the boolNodeFlag variable being used upside down of the result. Change-Id: I704f26f2fd31a1cc637f5d7601409de8161c5b80 Reviewed-on: https://swiftshader-review.googlesource.com/5211 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/compiler/Intermediate.cpp b/src/OpenGL/compiler/Intermediate.cpp index 00d3e24..a8c06bf 100644 --- a/src/OpenGL/compiler/Intermediate.cpp +++ b/src/OpenGL/compiler/Intermediate.cpp
@@ -1278,7 +1278,6 @@ ConstantUnion* tempConstArray = 0; TIntermConstantUnion *tempNode; - bool boolNodeFlag = false; switch(op) { case EOpAdd: tempConstArray = new ConstantUnion[objectSize]; @@ -1561,24 +1560,19 @@ returnType = TType(EbtBool, EbpUndefined, EvqConstExpr, objectSize); break; case EOpEqual: - if (getType().getBasicType() == EbtStruct) { - if (!CompareStructure(node->getType(), node->getUnionArrayPointer(), unionArray)) - boolNodeFlag = true; + tempConstArray = new ConstantUnion[1]; + + if(getType().getBasicType() == EbtStruct) { + tempConstArray->setBConst(CompareStructure(node->getType(), node->getUnionArrayPointer(), unionArray)); } else { + bool boolNodeFlag = true; for (size_t i = 0; i < objectSize; i++) { if (unionArray[i] != rightUnionArray[i]) { - boolNodeFlag = true; + boolNodeFlag = false; break; // break out of for loop } } - } - - tempConstArray = new ConstantUnion[1]; - if (!boolNodeFlag) { - tempConstArray->setBConst(true); - } - else { - tempConstArray->setBConst(false); + tempConstArray->setBConst(boolNodeFlag); } tempNode = new TIntermConstantUnion(tempConstArray, TType(EbtBool, EbpUndefined, EvqConstExpr)); @@ -1587,24 +1581,19 @@ return tempNode; case EOpNotEqual: - if (getType().getBasicType() == EbtStruct) { - if (CompareStructure(node->getType(), node->getUnionArrayPointer(), unionArray)) - boolNodeFlag = true; + tempConstArray = new ConstantUnion[1]; + + if(getType().getBasicType() == EbtStruct) { + tempConstArray->setBConst(!CompareStructure(node->getType(), node->getUnionArrayPointer(), unionArray)); } else { + bool boolNodeFlag = false; for (size_t i = 0; i < objectSize; i++) { - if (unionArray[i] == rightUnionArray[i]) { + if (unionArray[i] != rightUnionArray[i]) { boolNodeFlag = true; break; // break out of for loop } } - } - - tempConstArray = new ConstantUnion[1]; - if (!boolNodeFlag) { - tempConstArray->setBConst(true); - } - else { - tempConstArray->setBConst(false); + tempConstArray->setBConst(boolNodeFlag); } tempNode = new TIntermConstantUnion(tempConstArray, TType(EbtBool, EbpUndefined, EvqConstExpr));