From 6c62eaf22d72de4979fa6e9f90f71e6938e06560 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Tue, 23 May 2023 13:22:42 -0700 Subject: [PATCH] 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 Part-of: --- src/compiler/nir/nir_opt_algebraic.py | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 1c553c4..4445420 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -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))), -- 2.7.4