nir: Add a lower_fdiv option, turn fdiv into fmul/frcp.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 5 Jan 2016 13:09:46 +0000 (05:09 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 6 Jan 2016 03:22:11 +0000 (19:22 -0800)
The nir_opt_algebraic rule

(('fadd', ('flog2', a), ('fneg', ('flog2', b))), ('flog2', ('fdiv', a, b))),

can produce new fdiv operations, which need to be lowered on i965,
as we don't actually implement fdiv.  (Normally, we handle this in
GLSL IR's lower_instructions pass, but in the above case we introduce
an fdiv after that point.  So, make NIR do it for us.)

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Cc: mesa-stable@lists.freedesktop.org
src/glsl/nir/nir.h
src/glsl/nir/nir_opt_algebraic.py
src/mesa/drivers/dri/i965/brw_shader.cpp

index 42867382544a8c0a0b9c7030f82424c65cacfc44..fed8a97341630ad472cc95d1ff4a5e197e16a27f 100644 (file)
@@ -1440,6 +1440,7 @@ typedef struct nir_function {
 } nir_function;
 
 typedef struct nir_shader_compiler_options {
+   bool lower_fdiv;
    bool lower_ffma;
    bool lower_flrp;
    bool lower_fpow;
index 1fdad3d78a6a6bf8c1a16a659b4627e8eb9a9e0f..c553de577ee5b795502ba725d217c2bd29d1a0ec 100644 (file)
@@ -183,6 +183,7 @@ optimizations = [
    (('fmul', ('fexp2', a), ('fexp2', b)), ('fexp2', ('fadd', a, b))),
    # Division and reciprocal
    (('fdiv', 1.0, a), ('frcp', a)),
+   (('fdiv', a, b), ('fmul', a, ('frcp', b)), 'options->lower_fdiv'),
    (('frcp', ('frcp', a)), a),
    (('frcp', ('fsqrt', a)), ('frsq', a)),
    (('fsqrt', a), ('frcp', ('frsq', a)), 'options->lower_fsqrt'),
index d4b6410815e98ba18a960f9f518afc68c234c879..4bd24a70b55d996a7d0c6866bbe223c6dd22ea2d 100644 (file)
@@ -97,6 +97,7 @@ brw_compiler_create(void *mem_ctx, const struct brw_device_info *devinfo)
    nir_shader_compiler_options *nir_options =
       rzalloc(compiler, nir_shader_compiler_options);
    nir_options->native_integers = true;
+   nir_options->lower_fdiv = true;
    /* In order to help allow for better CSE at the NIR level we tell NIR
     * to split all ffma instructions during opt_algebraic and we then
     * re-combine them as a later step.