simplify skvm tests using allow_jit

We can of course use allow_jit to test with and without JIT!

This testing was the only reason Program::dropJIT() was public.  Given
how tricky its implementation is, I'd rather keep it a private detail
than exposed API, in case one day we find need to make it impossible.

Change-Id: Ifa256355309d9baf1bae506d75951381dce9b53c
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/367896
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
diff --git a/tests/SkVMTest.cpp b/tests/SkVMTest.cpp
index 2828e07..5344073 100644
--- a/tests/SkVMTest.cpp
+++ b/tests/SkVMTest.cpp
@@ -13,12 +13,12 @@
 #include "tests/Test.h"
 
 template <typename Fn>
-static void test_jit_and_interpreter(skvm::Program&& program, Fn&& test) {
-    if (program.hasJIT()) {
-        test((const skvm::Program&) program);
-        program.dropJIT();
+static void test_jit_and_interpreter(const skvm::Builder& b, Fn&& test) {
+    skvm::Program p = b.done();
+    test(p);
+    if (p.hasJIT()) {
+        test(b.done(/*debug_name=*/nullptr, /*allow_jit=*/false));
     }
-    test((const skvm::Program&) program);
 }
 
 DEF_TEST(SkVM_eliminate_dead_code, r) {
@@ -46,7 +46,7 @@
               b.splat(4.0f));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         for (int N = 0; N < 64; N++) {
             program.eval(N);
         }
@@ -61,7 +61,7 @@
     skvm::Builder b;
     b.store32(b.varying<int>(), b.splat(42));
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& p) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& p) {
         int buf[18];
         buf[17] = 47;
 
@@ -81,7 +81,7 @@
         b.store32(dst, b.load32(src));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& p) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& p) {
         int src[] = {1,2,3,4,5,6,7,8,9},
             dst[] = {0,0,0,0,0,0,0,0,0};
 
@@ -117,7 +117,7 @@
               b.add(b.splat(1),
                     b.load32(arg)));
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         int buf[64];
         for (int N = 0; N <= (int)SK_ARRAY_COUNT(buf); N++) {
             for (int i = 0; i < (int)SK_ARRAY_COUNT(buf); i++) {
@@ -144,7 +144,7 @@
         b.store32(buf, b.gather32(uniforms,0, b.bit_and(x, b.splat(7))));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         const int img[] = {12,34,56,78, 90,98,76,54};
 
         int buf[20];
@@ -198,7 +198,7 @@
         b.store8 (buf8 , b.gather8 (uniforms,0, b.bit_and(x, b.splat(31))));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         const int img[] = {12,34,56,78, 90,98,76,54};
 
         constexpr int N = 20;
@@ -256,7 +256,7 @@
         b.store8 (buf8 , b.gather8 (uniforms,0, x));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         uint8_t img[256];
         for (int i = 0; i < 256; i++) {
             img[i] = i;
@@ -309,7 +309,7 @@
         b.store32(ptr, x);
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         int x = 0x42;
         program.eval(1, &x);
         REPORTER_ASSERT(r, x == 0x7fff'ffff);
@@ -335,7 +335,7 @@
     REPORTER_ASSERT(r, program[2].op == skvm::Op::bit_clear);
     REPORTER_ASSERT(r, program[3].op == skvm::Op::store32);
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         // ±NaN, ±0, ±1, ±inf
         uint32_t src[] = {0x7f80'0001, 0xff80'0001, 0x0000'0000, 0x8000'0000,
                           0x3f80'0000, 0xbf80'0000, 0x7f80'0000, 0xff80'0000};
@@ -360,7 +360,7 @@
         b.storeF(arg, w);
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         float buf[] = { 1,2,3,4,5,6,7,8,9 };
         program.eval(SK_ARRAY_COUNT(buf), buf);
         for (float v : buf) {
@@ -388,7 +388,7 @@
 
         b.store32(b.varying<int>(), m);
     }
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         int in[] = { 0,1,2,3,4,5,6,7,8,9 };
         int out[SK_ARRAY_COUNT(in)];
 
@@ -425,7 +425,7 @@
         b.store32(b.varying<int>(), m);
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         float in[] = { 0,1,2,3,4,5,6,7,8,9 };
         int out[SK_ARRAY_COUNT(in)];
 
@@ -446,7 +446,7 @@
     skvm::Builder b;
     b.store32(b.varying<int>(), b.index());
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         int buf[23];
         program.eval(SK_ARRAY_COUNT(buf), buf);
         for (int i = 0; i < (int)SK_ARRAY_COUNT(buf); i++) {
@@ -471,7 +471,7 @@
         b.store32(arg, b.trunc(v));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         int x = 2;
         program.eval(1, &x);
         // x = 2
@@ -495,7 +495,7 @@
         b.store32(arg, b.trunc(v));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         int buf[] = {0,1,2,3,4,5,6,7,8,9,10};
         program.eval((int)SK_ARRAY_COUNT(buf), &buf);
 
@@ -517,7 +517,7 @@
         b.store32(arg, b.trunc(v));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         int buf[] = {0,1,2,3,4,5,6,7,8,9,10};
         program.eval((int)SK_ARRAY_COUNT(buf), &buf);
 
@@ -539,7 +539,7 @@
         b.storeF(arg, w);
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         float x = 2.0f;
         // y = 2*2 + 2 = 6
         // z = 6*2 + 6 = 18
@@ -556,7 +556,7 @@
         b.storeF(arg, b.floor(b.loadF(arg)));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         float buf[]  = { -2.0f, -1.5f, -1.0f, 0.0f, 1.0f, 1.5f, 2.0f };
         float want[] = { -2.0f, -2.0f, -1.0f, 0.0f, 1.0f, 1.0f, 2.0f };
         program.eval(SK_ARRAY_COUNT(buf), buf);
@@ -576,7 +576,7 @@
 
     // The test cases on exact 0.5f boundaries assume the current rounding mode is nearest even.
     // We haven't explicitly guaranteed that here... it just probably is.
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         float buf[]  = { -1.5f, -0.5f, 0.0f, 0.5f, 0.2f, 0.6f, 1.0f, 1.4f, 1.5f, 2.0f };
         int want[] =   { -2   ,  0   , 0   , 0   , 0   , 1   , 1   , 1   , 2   , 2    };
         int dst[SK_ARRAY_COUNT(buf)];
@@ -598,7 +598,7 @@
         b.storeF(dst, b.min(b.loadF(src1), b.loadF(src2)));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         float s1[]  =  { 0.0f, 1.0f, 4.0f, -1.0f, -1.0f};
         float s2[]  =  { 0.0f, 2.0f, 3.0f,  1.0f, -2.0f};
         float want[] = { 0.0f, 1.0f, 3.0f, -1.0f, -2.0f};
@@ -620,7 +620,7 @@
         b.storeF(dst, b.max(b.loadF(src1), b.loadF(src2)));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         float s1[]  =  { 0.0f, 1.0f, 4.0f, -1.0f, -1.0f};
         float s2[]  =  { 0.0f, 2.0f, 3.0f,  1.0f, -2.0f};
         float want[] = { 0.0f, 2.0f, 4.0f,  1.0f, -1.0f};
@@ -645,7 +645,7 @@
         b.store32(arg, x);
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         int x = 4;
         program.eval(1, &x);
         // x += 0 + 1 + 2 + 3 + ... + 30 + 31
@@ -666,7 +666,7 @@
         b.store32(buf, x);
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         int buf[] = { 0,1,2,3,4,5,6,7,8 };
         program.eval(SK_ARRAY_COUNT(buf), buf);
         for (int i = 0; i < (int)SK_ARRAY_COUNT(buf); i++) {
@@ -699,7 +699,7 @@
         b.store32(Y, x);
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         int b1[] = { 0,1,2,3 };
         int b2[] = { 4,5,6,7 };
         program.eval(SK_ARRAY_COUNT(b1), b1, b2);
@@ -734,7 +734,7 @@
         b.store16(buf, x);
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         const int N = 31;
         int16_t buf[N];
         for (int i = 0; i < N; i++) {
@@ -774,7 +774,7 @@
     auto buf = b.varying<int>();
     b.storeF(buf, b.sqrt(b.loadF(buf)));
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         constexpr int K = 17;
         float buf[K];
         for (int i = 0; i < K; i++) {
@@ -797,7 +797,7 @@
     skvm::Builder b;
     b.store32(b.varying<int>(), b.splat(42));
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         constexpr int K = 17;
         int buf[K];                 // Intentionally uninitialized.
         program.eval(K, buf);
@@ -813,7 +813,7 @@
     b.assert_true(b.lt(b.load32(b.varying<int>()),
                        b.splat(42)));
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program) {
+    test_jit_and_interpreter(b, [&](const skvm::Program& program) {
         int buf[] = { 0,1,2,3,4,5,6,7,8,9 };
         program.eval(SK_ARRAY_COUNT(buf), buf);
     });
@@ -2108,7 +2108,7 @@
             b.storeF(mx, b.max(x,y));
         }
 
-        test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+        test_jit_and_interpreter(b, [&](const skvm::Program& program){
             float mn[8], mx[8];
             for (int i = 0; i < 8; i++) {
                 // min() and max() everything with f[i].
@@ -2137,7 +2137,7 @@
             b.storeF(mx, b.max(x,y));
         }
 
-        test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+        test_jit_and_interpreter(b, [&](const skvm::Program& program){
             float mn[8], mx[8];
             program.eval(8, f,mn,mx);
             for (int j = 0; j < 8; j++) {
@@ -2162,7 +2162,7 @@
             b.storeF(mx, b.max(x,y));
         }
 
-        test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+        test_jit_and_interpreter(b, [&](const skvm::Program& program){
             float mn[8], mx[8];
             program.eval(8, f,mn,mx);
             for (int j = 0; j < 8; j++) {
@@ -2184,7 +2184,7 @@
                   dst = b.varying<float>();
         b.storeF(dst, b.from_fp16(b.load16(src)));
 
-        test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+        test_jit_and_interpreter(b, [&](const skvm::Program& program){
             float dst[8];
             program.eval(8, hs, dst);
             for (int i = 0; i < 8; i++) {
@@ -2198,7 +2198,7 @@
                   dst = b.varying<uint16_t>();
         b.store16(dst, b.to_fp16(b.loadF(src)));
 
-        test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+        test_jit_and_interpreter(b, [&](const skvm::Program& program){
             uint16_t dst[8];
             program.eval(8, fs, dst);
             for (int i = 0; i < 8; i++) {
@@ -2228,7 +2228,7 @@
             b.store32(lo, b.load64(wide, 0));
             b.store32(hi, b.load64(wide, 1));
         }
-        test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+        test_jit_and_interpreter(b, [&](const skvm::Program& program){
             uint32_t l[65], h[65];
             program.eval(65, wide,l,h);
             for (int i = 0; i < 65; i++) {
@@ -2246,7 +2246,7 @@
                         hi = b.varying<int>();
             b.store64(wide, b.load32(lo), b.load32(hi));
         }
-        test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+        test_jit_and_interpreter(b, [&](const skvm::Program& program){
             uint64_t w[65];
             program.eval(65, w,lo,hi);
             for (int i = 0; i < 65; i++) {
@@ -2276,7 +2276,7 @@
             skvm::Color c = b.load(rgba_ffff, src);
             b.store(rgba_8888, dst, c);
         }
-        test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+        test_jit_and_interpreter(b, [&](const skvm::Program& program){
             memset(packed, 0, sizeof(packed));
             program.eval(63, packed, floats);
             for (int i = 0; i < 4*63; i++) {
@@ -2295,7 +2295,7 @@
             skvm::Color c = b.load(rgba_8888, src);
             b.store(rgba_ffff, dst, c);
         }
-        test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+        test_jit_and_interpreter(b, [&](const skvm::Program& program){
             memset(floats, 0, sizeof(floats));
             program.eval(63, floats, packed);
             for (int i = 0; i < 4*63; i++) {
@@ -2315,7 +2315,7 @@
         b.store32(nan, is_NaN   (b.loadF(src)));
         b.store32(fin, is_finite(b.loadF(src)));
     }
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+    test_jit_and_interpreter(b, [&](const skvm::Program& program){
         // ±NaN, ±0, ±1, ±inf
         const uint32_t bits[] = {0x7f80'0001, 0xff80'0001, 0x0000'0000, 0x8000'0000,
                                  0x3f80'0000, 0xbf80'0000, 0x7f80'0000, 0xff80'0000};
@@ -2347,7 +2347,7 @@
                   + b.loadF(E));
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+    test_jit_and_interpreter(b, [&](const skvm::Program& program){
         float dst[17],A[17],B[17],C[17],D[17],E[17];
         for (int i = 0; i < 17; i++) {
             A[i] = B[i] = C[i] = D[i] = E[i] = (float)i;
@@ -2376,7 +2376,7 @@
         store16(dst, _4444);
     }
 
-    test_jit_and_interpreter(p.done(), [&](const skvm::Program& program){
+    test_jit_and_interpreter(p, [&](const skvm::Program& program){
         const float uniforms[] = { 0.0f, 0.0f,
                                    1.0f, 0.0f, 0.0f, 1.0f };
 
@@ -2476,7 +2476,7 @@
         }
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+    test_jit_and_interpreter(b, [&](const skvm::Program& program){
         int buf[] = { 0,1,2,3,4 };
         program.eval(SK_ARRAY_COUNT(buf), buf);
         for (int i = 0; i < (int)SK_ARRAY_COUNT(buf); i++) {
@@ -2497,7 +2497,7 @@
         b.store32(buf, b.splat(4));   // If we dedup'd, we'd skip this store.
     }
 
-    test_jit_and_interpreter(b.done(), [&](const skvm::Program& program){
+    test_jit_and_interpreter(b, [&](const skvm::Program& program){
         int buf[42];
         program.eval(SK_ARRAY_COUNT(buf), buf);
         for (int x : buf) {