summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/nir/nir_opt_algebraic.py5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py
index ae1261f8744..3267e93a583 100644
--- a/src/compiler/nir/nir_opt_algebraic.py
+++ b/src/compiler/nir/nir_opt_algebraic.py
@@ -105,6 +105,11 @@ optimizations = [
(('imul', a, 1), a),
(('fmul', a, -1.0), ('fneg', a)),
(('imul', a, -1), ('ineg', a)),
+ # If a < 0: fsign(a)*a*a => -1*a*a => -a*a => abs(a)*a
+ # If a > 0: fsign(a)*a*a => 1*a*a => a*a => abs(a)*a
+ # If a == 0: fsign(a)*a*a => 0*0*0 => abs(0)*0
+ (('fmul', ('fsign', a), ('fmul', a, a)), ('fmul', ('fabs', a), a)),
+ (('fmul', ('fmul', ('fsign', a), a), a), ('fmul', ('fabs', a), a)),
(('~ffma', 0.0, a, b), b),
(('~ffma', a, 0.0, b), b),
(('~ffma', a, b, 0.0), ('fmul', a, b)),