From 9e8466a866cbfb4c6745d85e9371b43827d16c8d Mon Sep 17 00:00:00 2001 From: Hyunjun Ko Date: Mon, 5 Aug 2019 06:36:38 +0000 Subject: [PATCH] nir: Add optimization for doing removing f16/f32 conversions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This eliminates conversions between f16 and f32 where possible. We can always remove an upcast followed by a down cast, that is: f2f16 ( f2f32 (a) ) -> a f2fmp ( f2f32 (a) ) -> a In the other direction, f2f16 loses precision and can't be undone by a f2f32. However, by definition it's always safe to elminate f2fmp: f2f32 ( f2fmp (a) ) -> a v2. [Neil Roberts (nroberts@igalia.com)] Reviewed-by: Eric Anholt Reviewed-by: Marek Olšák Part-of: --- src/compiler/nir/nir_opt_algebraic.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 281b3a6..5e586a30 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -831,6 +831,13 @@ optimizations.extend([ (('~f2u32', ('i2f', 'a@32')), a), (('~f2u32', ('u2f', 'a@32')), a), + # Conversions from float16 to float32 and back can always be removed + (('f2f16', ('f2f32', 'a@16')), a), + (('f2fmp', ('f2f32', 'a@16')), a), + # Conversions to float16 would be lossy so they should only be removed if + # the instruction was generated by the precision lowering pass. + (('f2f32', ('f2fmp', 'a@32')), a), + (('ffloor', 'a(is_integral)'), a), (('fceil', 'a(is_integral)'), a), (('ftrunc', 'a(is_integral)'), a), -- 2.7.4