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));