]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt_test.go
cmd/compile: initial function value devirtualization
[gostls13.git] / src / cmd / compile / internal / test / testdata / pgo / devirtualize / devirt_test.go
index ef637a876b0b69f63d2ed90d66718b64be6b5963..59b565d77fa7764a478a13cb4922751a52c9473a 100644 (file)
@@ -17,7 +17,7 @@ import (
        "example.com/pgo/devirtualize/mult.pkg"
 )
 
-func BenchmarkDevirt(b *testing.B) {
+func BenchmarkDevirtIface(b *testing.B) {
        var (
                a1 Add
                a2 Sub
@@ -25,5 +25,49 @@ func BenchmarkDevirt(b *testing.B) {
                m2 mult.NegMult
        )
 
-       Exercise(b.N, a1, a2, m1, m2)
+       ExerciseIface(b.N, a1, a2, m1, m2)
+}
+
+// Verify that devirtualization doesn't result in calls or side effects applying more than once.
+func TestDevirtIface(t *testing.T) {
+       var (
+               a1 Add
+               a2 Sub
+               m1 mult.Mult
+               m2 mult.NegMult
+       )
+
+       if v := ExerciseIface(10, a1, a2, m1, m2); v != 1176 {
+               t.Errorf("ExerciseIface(10) got %d want 1176", v)
+       }
+}
+
+func BenchmarkDevirtFuncConcrete(b *testing.B) {
+       ExerciseFuncConcrete(b.N, AddFn, SubFn, mult.MultFn, mult.NegMultFn)
+}
+
+func TestDevirtFuncConcrete(t *testing.T) {
+       if v := ExerciseFuncConcrete(10, AddFn, SubFn, mult.MultFn, mult.NegMultFn); v != 1176 {
+               t.Errorf("ExerciseFuncConcrete(10) got %d want 1176", v)
+       }
+}
+
+func BenchmarkDevirtFuncField(b *testing.B) {
+       ExerciseFuncField(b.N, AddFn, SubFn, mult.MultFn, mult.NegMultFn)
+}
+
+func TestDevirtFuncField(t *testing.T) {
+       if v := ExerciseFuncField(10, AddFn, SubFn, mult.MultFn, mult.NegMultFn); v != 1176 {
+               t.Errorf("ExerciseFuncField(10) got %d want 1176", v)
+       }
+}
+
+func BenchmarkDevirtFuncClosure(b *testing.B) {
+       ExerciseFuncClosure(b.N, AddClosure(), SubClosure(), mult.MultClosure(), mult.NegMultClosure())
+}
+
+func TestDevirtFuncClosure(t *testing.T) {
+       if v := ExerciseFuncClosure(10, AddClosure(), SubClosure(), mult.MultClosure(), mult.NegMultClosure()); v != 1176 {
+               t.Errorf("ExerciseFuncClosure(10) got %d want 1176", v)
+       }
 }