[llvm-commits] CVS: llvm-test/SingleSource/UnitTests/SignlessTypes/rem.c Makefile
Reid Spencer
rspencer at reidspencer.com
Fri Oct 27 09:15:51 PDT 2006
Is something wrong with one constant seed per day?
Reid.
On Fri, 2006-10-27 at 09:04 -0700, Chris Lattner wrote:
> Please change this to set the seed to a constant in main().
>
> -Chris
>
> On Oct 27, 2006, at 8:45 AM, Reid Spencer wrote:
>
> >
> >
> > Changes in directory llvm-test/SingleSource/UnitTests/SignlessTypes:
> >
> > rem.c added (r1.1)
> > Makefile updated: 1.2 -> 1.3
> > ---
> > Log message:
> >
> > Add a test for remainder testing. Also, in the Makefile, compute a
> > seed
> > for the random number generator based on julian date so that rem isn't
> > always running the same test but it runs the same on any given day.
> >
> > Thanks to Domagoj Babic for writing this!
> >
> >
> > ---
> > Diffs of the changes: (+160 -1)
> >
> > Makefile | 3 -
> > rem.c | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++
> > ++++++++++++
> > 2 files changed, 160 insertions(+), 1 deletion(-)
> >
> >
> > Index: llvm-test/SingleSource/UnitTests/SignlessTypes/rem.c
> > diff -c /dev/null llvm-test/SingleSource/UnitTests/SignlessTypes/
> > rem.c:1.1
> > *** /dev/null Fri Oct 27 10:45:35 2006
> > --- llvm-test/SingleSource/UnitTests/SignlessTypes/rem.c Fri Oct 27
> > 10:45:24 2006
> > ***************
> > *** 0 ****
> > --- 1,158 ----
> > + #include <stdio.h>
> > + #include <stdlib.h>
> > +
> > + // Simple REM test case. Tests some basic properties of remainder
> > + // operation.
> > +
> > + // All macros must evaluate to true. x,y can be signed/unsigned, m
> > + // should be unsigned.
> > +
> > + // Returns true if multiplication will overflow.
> > + #define MultOverflow(x,y) ((((x) * (y)) / (y)) != (x))
> > +
> > + // x == y => (x mod m) == (y mod m)
> > + #define CongruenceTest(x,y,m) \
> > + (((x) != (y)) || (((x) % (m)) == ((y) % (m))))
> > +
> > +
> > + /******************************************************************
> > + * These three tests can be done only for unsigned case because they
> > + * contain add/sub. If you're eager to get this working with signed
> > + * numbers, take care of overflows.
> > + ******************************************************************/
> > +
> > + // Return true if add/sub will cause overflow.
> > + #define UnsignedAddOverflow(x,y) (((x) + (y)) < (x))
> > + #define UnsignedSubUnderflow(x,y) (((x) - (y)) > (x))
> > +
> > + // ((x % m) + (y % m)) % m = (x + y) % m
> > + #define AdditionOfCongruences(x,y,m) \
> > + (UnsignedAddOverflow((x)%(m),(y)%(m)) || \
> > + UnsignedAddOverflow((x),(y)) || \
> > + (((((x) % (m)) + ((y) % (m))) % m) == (((x) + (y)) % (m))))
> > +
> > + // ((x % m) == ((y + z) % m)) == (((x - z) % m) == (y % m))
> > + #define SimpleCongruenceEquation(x,y,z,m) \
> > + (UnsignedAddOverflow((y),(z)) || \
> > + UnsignedSubUnderflow((x),(z)) || \
> > + ((((x) % (m)) == (((y) + (z)) % (m))) % m) == \
> > + ((((x) - (z)) % (m)) == ((y) % (m))))
> > +
> > + // If y*m does not overflow: (x % m) == (x + y*m) % m
> > + #define AdditionOfMultipleOfModIsNOP(x,y,m) \
> > + (MultOverflow(y,m) || \
> > + UnsignedAddOverflow((x),(y)*(m)) || \
> > + (((x) % (m)) == (((x) + ((y)*(m))) % (m))))
> > +
> > + /******************************************************************/
> > +
> > + // Greatest common divisor
> > + long gcd(long a, long b) {
> > + long c;
> > + while(1) {
> > + c = a % b;
> > + if(c == 0) return b;
> > + a = b;
> > + b = c;
> > + }
> > + }
> > +
> > + // If gcd(z,m)==1: ((x == y) % m) == ((x / z == y / z) % m). This
> > holds
> > + // only if both sides are actually divisble by z.
> > + #define BothSidesCanBeDividedWithDivisorMutuallyPrimeWithMod
> > (x,y,z,m) \
> > + ((gcd((z),(m)) != 1) || ((z) == 0) || \
> > + (gcd((x),(z)) != (z)) || ((gcd((y),(z)) != (z))) || \
> > + (((x) % (m)) == ((y) % (m))) == (((((x) / (z)) % m) ==
> > (((y) / (z))) % m)))
> > +
> > + // If z divides x,y,m: ((x % m) == (y % m)) == (((x/z) % (m/z))
> > == ((y/z) % (m/z)))
> > + #define DivideBothSidesAndModulus(x,y,z,m) \
> > + (((z) == 0) || (gcd((x),(z)) != (z)) || \
> > + (gcd((y),(z)) != (z)) || \
> > + (gcd((m),(z)) != (z)) || \
> > + (((x)%(m)) == ((y)%(m))) == \
> > + ((((x)/(z)) % ((m)/(z))) == (((y)/(z)) % ((m)/(z)))))
> > +
> > + // If z divides m, than: ((x % m) == (y % m)) == ((x % z) == (y %
> > z))
> > + // z should be unsigned.
> > + #define SubModulusTest(x,y,z,m) \
> > + (((z) == 0) || (gcd((m),(z)) != (z)) || \
> > + ((((x)%(m)) == ((y)%(m))) == (((x)%(z)) == ((y)%(z)))))
> > +
> > + // Runs the test c under number t.
> > + #define test(t,c) \
> > + if (!c) { \
> > + printf("Test #%u, failed in iteration #: %u\n", t, idx); \
> > + printf("Failing test vector:\n"); \
> > + printf("m=%u, x_u=%u, y_u=%u, z_u=%u, x_s=%d, y_s=%d, z_s=%d\n", \
> > + m, x_u, y_u, z_u, x_s, y_s, z_s); \
> > + return 1; \
> > + }
> > +
> > + // The higher the number the better the testing.
> > + #define ITERATIONS 100
> > +
> > + int main(int argc, char **argv) {
> > + // Since the test vectors are printed out anyways, I suggest
> > leaving
> > + // the test nondeterministic. Many people run tests on various
> > + // machines, so REM-related code will be covered with a much
> > better
> > + // coverage... If you really don't like the idea of having
> > better
> > + // coverage, uncomment the srand line:
> > +
> > + if (argc > 1) {
> > + int seed = atoi(argv[1]);
> > + srand(seed);
> > + }
> > +
> > + unsigned idx = 0;
> > + for (; idx < ITERATIONS; ++idx) {
> > + unsigned m = (unsigned)rand();
> > +
> > + if (m == 0) { // Repeat again
> > + idx--; continue;
> > + }
> > +
> > + unsigned x_u = (unsigned)rand();
> > + unsigned y_u = (unsigned)rand();
> > + unsigned z_u = (unsigned)rand();
> > +
> > + int x_s = (rand() % 2) ? rand() : -rand();
> > + int y_s = (rand() % 2) ? rand() : -rand();
> > + int z_s = (rand() % 2) ? rand() : -rand();
> > +
> > + test(1, CongruenceTest(x_s, y_s, m));
> > + test(2, CongruenceTest(x_s, y_u, m));
> > + test(3, CongruenceTest(x_u, y_s, m));
> > + test(4, CongruenceTest(x_u, y_u, m));
> > +
> > + test(5, AdditionOfCongruences(x_u, y_u, m));
> > +
> > + test(6, SimpleCongruenceEquation(x_u, y_u, z_u, m));
> > +
> > + test(7, AdditionOfMultipleOfModIsNOP(x_u, y_u, m));
> > +
> > + test(8,
> > BothSidesCanBeDividedWithDivisorMutuallyPrimeWithMod(x_s, y_s, z_s,
> > m));
> > + test(9,
> > BothSidesCanBeDividedWithDivisorMutuallyPrimeWithMod(x_s, y_s, z_u,
> > m));
> > + test(10,
> > BothSidesCanBeDividedWithDivisorMutuallyPrimeWithMod(x_s, y_u, z_s,
> > m));
> > + test(11,
> > BothSidesCanBeDividedWithDivisorMutuallyPrimeWithMod(x_s, y_u, z_u,
> > m));
> > + test(12,
> > BothSidesCanBeDividedWithDivisorMutuallyPrimeWithMod(x_u, y_s, z_s,
> > m));
> > + test(13,
> > BothSidesCanBeDividedWithDivisorMutuallyPrimeWithMod(x_u, y_s, z_u,
> > m));
> > + test(14,
> > BothSidesCanBeDividedWithDivisorMutuallyPrimeWithMod(x_u, y_u, z_s,
> > m));
> > + test(15,
> > BothSidesCanBeDividedWithDivisorMutuallyPrimeWithMod(x_u, y_u, z_u,
> > m));
> > +
> > + test(16, DivideBothSidesAndModulus(x_s, y_s, z_s, m));
> > + test(17, DivideBothSidesAndModulus(x_s, y_s, z_u, m));
> > + test(18, DivideBothSidesAndModulus(x_s, y_u, z_s, m));
> > + test(19, DivideBothSidesAndModulus(x_s, y_u, z_u, m));
> > + test(20, DivideBothSidesAndModulus(x_u, y_s, z_s, m));
> > + test(21, DivideBothSidesAndModulus(x_u, y_s, z_u, m));
> > + test(22, DivideBothSidesAndModulus(x_u, y_u, z_s, m));
> > + test(23, DivideBothSidesAndModulus(x_u, y_u, z_u, m));
> > +
> > + test(25, SubModulusTest(x_s, y_s, z_u, m));
> > + test(27, SubModulusTest(x_s, y_u, z_u, m));
> > + test(29, SubModulusTest(x_u, y_s, z_u, m));
> > + test(31, SubModulusTest(x_u, y_u, z_u, m));
> > + }
> > + printf("\n *** REM test done! ***\n");
> > + return 0;
> > + }
> >
> >
> > Index: llvm-test/SingleSource/UnitTests/SignlessTypes/Makefile
> > diff -u llvm-test/SingleSource/UnitTests/SignlessTypes/Makefile:1.2
> > llvm-test/SingleSource/UnitTests/SignlessTypes/Makefile:1.3
> > --- llvm-test/SingleSource/UnitTests/SignlessTypes/Makefile:1.2 Tue
> > Oct 24 19:59:01 2006
> > +++ llvm-test/SingleSource/UnitTests/SignlessTypes/Makefile Fri Oct
> > 27 10:45:24 2006
> > @@ -1,5 +1,6 @@
> > # SingleSource/UnitTests/Vector/Makefile
> > LEVEL = ../../..
> > -PROG=div
> > +SEED := $(shell date +%j)
> > +RUN_OPTIONS := $(SEED)
> > include $(LEVEL)/Makefile.config
> > include $(LEVEL)/SingleSource/Makefile.singlesrc
> >
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list