[Mesa-dev] [PATCH 9/9] glsl: Add tests for minmax prune

Dylan Baker baker.dylan.c at gmail.com
Tue Aug 12 15:59:10 PDT 2014


On Tuesday, July 29, 2014 12:36:39 PM Petri Latvala wrote:
> tests/minmax/create_test_cases.py generates the following tests:
> 
> multiple_min*.opt_test:
>  Construct a tree of min expressions for all permutations of a var_ref
>  and three constants. They should all optimize to a single min with
>  the variable and the smallest constant.
> multiple_max*.opt_test:
>  Same as above, for max.
> mid3opt*.opt_test:
>  Test that code generated from a mid3() for two constants and a
>  var_ref optimizes to a single max and a single min.
> mixed_vectors*.opt_test:
>  Test that the optimization pass doesn't modify expression trees with
>  constant vectors where some components compare as less, some as
>  greater.
> 
> Signed-off-by: Petri Latvala <petri.latvala at intel.com>
> ---
>  src/glsl/tests/minmax/.gitignore           |   3 +
>  src/glsl/tests/minmax/create_test_cases.py | 151 +++++++++++++++++++++++++++++
>  2 files changed, 154 insertions(+)
>  create mode 100644 src/glsl/tests/minmax/.gitignore
>  create mode 100644 src/glsl/tests/minmax/create_test_cases.py
> 
> diff --git a/src/glsl/tests/minmax/.gitignore b/src/glsl/tests/minmax/.gitignore
> new file mode 100644
> index 0000000..e98df62
> --- /dev/null
> +++ b/src/glsl/tests/minmax/.gitignore
> @@ -0,0 +1,3 @@
> +*.opt_test
> +*.expected
> +*.out
> diff --git a/src/glsl/tests/minmax/create_test_cases.py b/src/glsl/tests/minmax/create_test_cases.py
> new file mode 100644
> index 0000000..4f78980
> --- /dev/null
> +++ b/src/glsl/tests/minmax/create_test_cases.py
> @@ -0,0 +1,151 @@
> +# coding=utf-8
> +#
> +# Copyright © 2014 Intel Corporation
> +#
> +# Permission is hereby granted, free of charge, to any person obtaining a
> +# copy of this software and associated documentation files (the "Software"),
> +# to deal in the Software without restriction, including without limitation
> +# the rights to use, copy, modify, merge, publish, distribute, sublicense,
> +# and/or sell copies of the Software, and to permit persons to whom the
> +# Software is furnished to do so, subject to the following conditions:
> +#
> +# The above copyright notice and this permission notice (including the next
> +# paragraph) shall be included in all copies or substantial portions of the
> +# Software.
> +#
> +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> +# DEALINGS IN THE SOFTWARE.
> +
> +import os
> +import os.path
> +import re
> +import subprocess
> +import sys
> +import itertools

This comment applies to all the patches.
You're importing a bunch of modules you're not using, you should remove
any that are not used.

In this file os.path, re, and subprocess are not used.

> +
> +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
> +from sexps import *
> +from test_case_generator import *
> +
> +def test_multiple_max():
> +    doc_string = """Test that multiple constants in multiple max expressions are reduced to a single max."""

What is this? If it's a docstring it's not assigned, it's just a triple
quoted string at the start of the function or class. Fix this for the
other functions as well

> +
> +    operands = [const_float(1),
> +                const_float(2),
> +                const_float(3),
> +                ['var_ref', 'a']]
> +
> +    c = 1
> +    for ops in itertools.permutations(operands):
> +        maxtree1 = reduce(lambda a, b: max_(a, b, 'float'), ops)
> +        maxtree2 = reduce(lambda a, b: max_(b, a, 'float'), ops)
> +
> +        expected = max_(const_float(3), ['var_ref', 'a'], 'float')
> +
> +        input_sexp = make_test_case('main', 'void', (
> +                assign_x('b', maxtree1) +
> +                assign_x('c', maxtree2)
> +                ))
> +        expected_sexp = make_test_case('main', 'void', (
> +                assign_x('b', expected) +
> +                assign_x('c', expected)
> +                ))
> +
> +        create_test_case(doc_string, input_sexp, expected_sexp, 'multiple_max{0}'.format(c), 'do_minmax_prune')
> +        c += 1
> +
> +def test_multiple_min():
> +    doc_string = """Test that multiple constants in multiple min expressions are reduced to a single min."""
> +
> +    operands = [const_float(1),
> +                const_float(2),
> +                const_float(3),
> +                ['var_ref', 'a']]
> +
> +    c = 1
> +    for ops in itertools.permutations(operands):
> +        mintree1 = reduce(lambda a, b: min_(a, b, 'float'), ops)
> +        mintree2 = reduce(lambda a, b: min_(b, a, 'float'), ops)
> +
> +        expected = min_(const_float(1), ['var_ref', 'a'], 'float')
> +
> +        input_sexp = make_test_case('main', 'void', (
> +                assign_x('b', mintree1) +
> +                assign_x('c', mintree2)
> +                ))
> +        expected_sexp = make_test_case('main', 'void', (
> +                assign_x('b', expected) +
> +                assign_x('c', expected)
> +                ))
> +
> +        create_test_case(doc_string, input_sexp, expected_sexp, 'multiple_min{0}'.format(c), 'do_minmax_prune')
> +        c += 1
		have a look at enumerate for a more pythonic way to handle the
		incrementing of c.
> +
> +def test_two_constant_mid3():
> +    doc_string = """Test that code generated from a mid3() call with two parameters as constants
> +are reduced to a single min and max"""
> +
> +    operands = [const_float(1),
> +                const_float(3),
> +                ['var_ref', 'a']]
> +
> +    # The builtin function call mid3(x, y, z) generates max(min(x, y), max(min(x, z), min(y, z))).
> +    # All permutations of these parameters should optimize to max(min(var_ref a, 3), 1)
> +
> +    c = 1
> +    for ops in itertools.permutations(operands):
> +        x = ops[0]
> +        y = ops[1]
> +        z = ops[2]
> +
> +        exprtree = maxf(minf(x, y), maxf(minf(x, z), minf(y, z)))
> +        expected = maxf(minf(['var_ref', 'a'], const_float(3)), const_float(1))
> +
> +        input_sexp = make_test_case('main', 'void', (
> +                assign_x('b', exprtree)
> +                ))
> +        expect_sexp = make_test_case('main', 'void', (
> +                assign_x('b', expected)
> +                ))
> +
> +        create_test_case(doc_string, input_sexp, expect_sexp, 'mid3opt{0}'.format(c), 'do_minmax_prune')
> +        c += 1
> +
> +def test_mixed_vectors():
> +    doc_string = """Test that a min/max tree of vectors is kept unchanged when constant vectors
> +have some components less, some greater than another constant vector."""
> +
> +    operands = [const_vec4(1, 3, 1, 3),
> +                const_vec4(3, 1, 3, 1),
> +                const_vec4(2, 2, 2, 2),
> +                ['var_ref', 'a']]
> +
> +    c = 1
> +    for ops in itertools.permutations(operands):
> +        mintree1 = reduce(lambda a, b: min_(a, b, 'vec4'), ops)
> +        mintree2 = reduce(lambda a, b: min_(b, a, 'vec4'), ops)
> +
> +        expected = min_(const_float(1), ['var_ref', 'a'], 'float')
> +
> +        input_sexp = make_test_case('main', 'void', (
> +                declare('vec4', 'a', 'in') +
> +                declare('vec4', 'b', 'out') +
> +                declare('vec4', 'c', 'out') +
> +                assign('b', 'xyzw', reduce(lambda a, b: min_(a, b, 'vec4'), ops)) +
> +                assign('c', 'xyzw', reduce(lambda a, b: min_(b, a, 'vec4'), ops))
> +                ))
> +        expected_sexp = input_sexp
> +
> +        create_test_case(doc_string, input_sexp, expected_sexp, 'mixed_vectors{0}'.format(c), 'do_minmax_prune')
> +        c += 1
> +
> +if __name__ == '__main__':
> +    test_multiple_max()
> +    test_multiple_min()
> +    test_two_constant_mid3()
> +    test_mixed_vectors()
> -- 
> 2.0.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140812/7d84b8a0/attachment.sig>


More information about the mesa-dev mailing list