Fix constant folding integer modulus

Constant folding % used to generate results from division instead of
results from modulus. Fix this and introduce a test for this and other
integer constant folding, that checks that the right constant values are
found in the IntermNode tree.

BUG=angle:916
TEST=angle_unittests

Change-Id: I75e59b7734eb206378a1b2957af0a5437a90097c
Reviewed-on: https://chromium-review.googlesource.com/249691
Reviewed-by: Gregoire Payen de La Garanderie <Gregory.Payen@imgtec.com>
Tested-by: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Nicolas Capens <capn@chromium.org>
diff --git a/src/compiler/translator/IntermNode.cpp b/src/compiler/translator/IntermNode.cpp
index 825056b..cf22164 100644
--- a/src/compiler/translator/IntermNode.cpp
+++ b/src/compiler/translator/IntermNode.cpp
@@ -810,6 +810,7 @@
                         }
                         else
                         {
+                            ASSERT(op == EOpDiv);
                             tempConstArray[i].setFConst(
                                 unionArray[i].getFConst() /
                                 rightUnionArray[i].getFConst());
@@ -826,9 +827,19 @@
                         }
                         else
                         {
-                            tempConstArray[i].setIConst(
-                                unionArray[i].getIConst() /
-                                rightUnionArray[i].getIConst());
+                            if (op == EOpDiv)
+                            {
+                                tempConstArray[i].setIConst(
+                                    unionArray[i].getIConst() /
+                                    rightUnionArray[i].getIConst());
+                            }
+                            else
+                            {
+                                ASSERT(op == EOpIMod);
+                                tempConstArray[i].setIConst(
+                                    unionArray[i].getIConst() %
+                                    rightUnionArray[i].getIConst());
+                            }
                         }
                         break;
 
@@ -842,9 +853,19 @@
                         }
                         else
                         {
-                            tempConstArray[i].setUConst(
-                                unionArray[i].getUConst() /
-                                rightUnionArray[i].getUConst());
+                            if (op == EOpDiv)
+                            {
+                                tempConstArray[i].setUConst(
+                                    unionArray[i].getUConst() /
+                                    rightUnionArray[i].getUConst());
+                            }
+                            else
+                            {
+                                ASSERT(op == EOpIMod);
+                                tempConstArray[i].setUConst(
+                                    unionArray[i].getUConst() %
+                                    rightUnionArray[i].getUConst());
+                            }
                         }
                         break;