nir_opt_algebraic: Don't shrink 64-bit bitwise ops if pack_split is going to be lowered

Otherwise this can cause optimizations to fight resulting in infinite
optimization loops with opt_algebraic, constant_folding, and copy_prop.

Fixes: 368be872 ("nir/algebraic: shrink 64-bit bitwise operations with 0/-1 constant half")
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23192>
This commit is contained in:
Jesse Natalie 2023-05-23 13:22:42 -07:00 committed by Marge Bot
parent 44b960a645
commit 6c62eaf22d

View file

@ -1317,36 +1317,46 @@ optimizations.extend([
(('iand@64', a, '#b(is_lower_half_zero)'),
('pack_64_2x32_split', 0,
('iand', ('unpack_64_2x32_split_y', a), ('unpack_64_2x32_split_y', b)))),
('iand', ('unpack_64_2x32_split_y', a), ('unpack_64_2x32_split_y', b))),
'!options->lower_pack_64_2x32_split'),
(('iand@64', a, '#b(is_upper_half_zero)'),
('pack_64_2x32_split', ('iand', ('unpack_64_2x32_split_x', a), ('unpack_64_2x32_split_x', b)),
0)),
0),
'!options->lower_pack_64_2x32_split'),
(('iand@64', a, '#b(is_lower_half_negative_one)'),
('pack_64_2x32_split', ('unpack_64_2x32_split_x', a),
('iand', ('unpack_64_2x32_split_y', a), ('unpack_64_2x32_split_y', b)))),
('iand', ('unpack_64_2x32_split_y', a), ('unpack_64_2x32_split_y', b))),
'!options->lower_pack_64_2x32_split'),
(('iand@64', a, '#b(is_upper_half_negative_one)'),
('pack_64_2x32_split', ('iand', ('unpack_64_2x32_split_x', a), ('unpack_64_2x32_split_x', b)),
('unpack_64_2x32_split_y', a))),
('unpack_64_2x32_split_y', a)),
'!options->lower_pack_64_2x32_split'),
(('ior@64', a, '#b(is_lower_half_zero)'),
('pack_64_2x32_split', ('unpack_64_2x32_split_x', a),
('ior', ('unpack_64_2x32_split_y', a), ('unpack_64_2x32_split_y', b)))),
('ior', ('unpack_64_2x32_split_y', a), ('unpack_64_2x32_split_y', b))),
'!options->lower_pack_64_2x32_split'),
(('ior@64', a, '#b(is_upper_half_zero)'),
('pack_64_2x32_split', ('ior', ('unpack_64_2x32_split_x', a), ('unpack_64_2x32_split_x', b)),
('unpack_64_2x32_split_y', a))),
('unpack_64_2x32_split_y', a)),
'!options->lower_pack_64_2x32_split'),
(('ior@64', a, '#b(is_lower_half_negative_one)'),
('pack_64_2x32_split', -1,
('ior', ('unpack_64_2x32_split_y', a), ('unpack_64_2x32_split_y', b)))),
('ior', ('unpack_64_2x32_split_y', a), ('unpack_64_2x32_split_y', b))),
'!options->lower_pack_64_2x32_split'),
(('ior@64', a, '#b(is_upper_half_negative_one)'),
('pack_64_2x32_split', ('ior', ('unpack_64_2x32_split_x', a), ('unpack_64_2x32_split_x', b)),
-1)),
-1),
'!options->lower_pack_64_2x32_split'),
(('ixor@64', a, '#b(is_lower_half_zero)'),
('pack_64_2x32_split', ('unpack_64_2x32_split_x', a),
('ixor', ('unpack_64_2x32_split_y', a), ('unpack_64_2x32_split_y', b)))),
('ixor', ('unpack_64_2x32_split_y', a), ('unpack_64_2x32_split_y', b))),
'!options->lower_pack_64_2x32_split'),
(('ixor@64', a, '#b(is_upper_half_zero)'),
('pack_64_2x32_split', ('ixor', ('unpack_64_2x32_split_x', a), ('unpack_64_2x32_split_x', b)),
('unpack_64_2x32_split_y', a))),
('unpack_64_2x32_split_y', a)),
'!options->lower_pack_64_2x32_split'),
# DeMorgan's Laws
(('iand', ('inot', a), ('inot', b)), ('inot', ('ior', a, b))),