nir/algebraic: optimize iand/ior of (n)eq zero when umax/umin not available
Before8e1b75b330
("nir/algebraic: optimize iand/ior of (n)eq zero") this optimization didn't need the use of umax/umin. VC4 HW supports only signed integer max/min operations. lower_umin and lower_umax are added to allow enabling previous optimizations behaviour for this cases. Fixes:8e1b75b330
("nir/algebraic: optimize iand/ior of (n)eq zero") Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7083>
This commit is contained in:
@@ -3160,6 +3160,12 @@ typedef struct nir_shader_compiler_options {
|
||||
/** enables rules to lower iabs to ineg+imax */
|
||||
bool lower_iabs;
|
||||
|
||||
/** enable rules that avoid generating umax from signed integer ops */
|
||||
bool lower_umax;
|
||||
|
||||
/** enable rules that avoid generating umin from signed integer ops */
|
||||
bool lower_umin;
|
||||
|
||||
/* lower fdph to fdot4 */
|
||||
bool lower_fdph;
|
||||
|
||||
|
@@ -738,10 +738,12 @@ optimizations.extend([
|
||||
# Integer sizes
|
||||
for s in [8, 16, 32, 64]:
|
||||
optimizations.extend([
|
||||
(('iand', ('ieq', 'a@{}'.format(s), 0), ('ieq', 'b@{}'.format(s), 0)), ('ieq', ('umax', a, b), 0)),
|
||||
(('ior', ('ieq', 'a@{}'.format(s), 0), ('ieq', 'b@{}'.format(s), 0)), ('ieq', ('umin', a, b), 0)),
|
||||
(('iand', ('ine', 'a@{}'.format(s), 0), ('ine', 'b@{}'.format(s), 0)), ('ine', ('umin', a, b), 0)),
|
||||
(('ior', ('ine', 'a@{}'.format(s), 0), ('ine', 'b@{}'.format(s), 0)), ('ine', ('umax', a, b), 0)),
|
||||
(('iand', ('ieq', 'a@{}'.format(s), 0), ('ieq', 'b@{}'.format(s), 0)), ('ieq', ('ior', a, b), 0), 'options->lower_umax'),
|
||||
(('ior', ('ine', 'a@{}'.format(s), 0), ('ine', 'b@{}'.format(s), 0)), ('ine', ('ior', a, b), 0), 'options->lower_umin'),
|
||||
(('iand', ('ieq', 'a@{}'.format(s), 0), ('ieq', 'b@{}'.format(s), 0)), ('ieq', ('umax', a, b), 0), '!options->lower_umax'),
|
||||
(('ior', ('ieq', 'a@{}'.format(s), 0), ('ieq', 'b@{}'.format(s), 0)), ('ieq', ('umin', a, b), 0), '!options->lower_umin'),
|
||||
(('iand', ('ine', 'a@{}'.format(s), 0), ('ine', 'b@{}'.format(s), 0)), ('ine', ('umin', a, b), 0), '!options->lower_umin'),
|
||||
(('ior', ('ine', 'a@{}'.format(s), 0), ('ine', 'b@{}'.format(s), 0)), ('ine', ('umax', a, b), 0), '!options->lower_umax'),
|
||||
|
||||
# True/False are ~0 and 0 in NIR. b2i of True is 1, and -1 is ~0 (True).
|
||||
(('ineg', ('b2i{}'.format(s), 'a@{}'.format(s))), a),
|
||||
|
Reference in New Issue
Block a user