brw_nir_analyze_boolean_resolves.c revision 084b24f5582567ebf5aa94b7f40ae3bdcb71316b
1a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand/* 2a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * Copyright © 2015 Intel Corporation 3a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 4a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * Permission is hereby granted, free of charge, to any person obtaining a 5a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * copy of this software and associated documentation files (the "Software"), 6a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * to deal in the Software without restriction, including without limitation 7a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * and/or sell copies of the Software, and to permit persons to whom the 9a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * Software is furnished to do so, subject to the following conditions: 10a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 11a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * The above copyright notice and this permission notice (including the next 12a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * paragraph) shall be included in all copies or substantial portions of the 13a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * Software. 14a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 15a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * IN THE SOFTWARE. 22a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 23a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * Authors: 24a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * Jason Ekstrand <jason@jlekstrand.net> 25a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 26a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 27a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand#include "brw_nir.h" 28a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 29a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand/* 30a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * This file implements an analysis pass that determines when we have to do 31a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * a boolean resolve on Gen <= 5. Instructions that need a boolean resolve 32a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * will have the booleans portion of the instr->pass_flags field set to 33a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * BRW_NIR_BOOLEAN_NEEDS_RESOLVE. 34a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 35a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 36a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 37a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand/** Returns the resolve status for the given source 38a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 39a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * If the source has a parent instruction then the resolve status is the 40a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * status of the parent instruction. If the source does not have a parent 41a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * instruction then we don't know so we return NON_BOOLEAN. 42a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 43a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandstatic uint8_t 44a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandget_resolve_status_for_src(nir_src *src) 45a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand{ 46864907e2f14523c130e6ff24c081789bb079bae1Connor Abbott if (src->is_ssa) { 47864907e2f14523c130e6ff24c081789bb079bae1Connor Abbott nir_instr *src_instr = src->ssa->parent_instr; 48a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand uint8_t resolve_status = src_instr->pass_flags & BRW_NIR_BOOLEAN_MASK; 49a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 50a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand /* If the source instruction needs resolve, then from the perspective 51a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * of the user, it's a true boolean. 52a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 53a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand if (resolve_status == BRW_NIR_BOOLEAN_NEEDS_RESOLVE) 54a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand resolve_status = BRW_NIR_BOOLEAN_NO_RESOLVE; 55a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand return resolve_status; 56a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } else { 57a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand return BRW_NIR_NON_BOOLEAN; 58a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 59a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand} 60a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 61a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand/** Marks the given source as needing a resolve 62a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 63a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * If the given source corresponds to an unresolved boolean it marks it as 64a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * needing a resolve. Otherwise, we leave it alone. 65a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 66a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandstatic bool 67a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandsrc_mark_needs_resolve(nir_src *src, void *void_state) 68a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand{ 69864907e2f14523c130e6ff24c081789bb079bae1Connor Abbott if (src->is_ssa) { 70864907e2f14523c130e6ff24c081789bb079bae1Connor Abbott nir_instr *src_instr = src->ssa->parent_instr; 71a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand uint8_t resolve_status = src_instr->pass_flags & BRW_NIR_BOOLEAN_MASK; 72a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 73a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand /* If the source instruction is unresolved, then mark it as needing 74a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * to be resolved. 75a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 76a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand if (resolve_status == BRW_NIR_BOOLEAN_UNRESOLVED) { 77a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand src_instr->pass_flags &= ~BRW_NIR_BOOLEAN_MASK; 78a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand src_instr->pass_flags |= BRW_NIR_BOOLEAN_NEEDS_RESOLVE; 79a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 80a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 81a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 82a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 83a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand return true; 84a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand} 85a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 86a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandstatic bool 87a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandanalyze_boolean_resolves_block(nir_block *block, void *void_state) 88a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand{ 89a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand nir_foreach_instr(block, instr) { 90a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand switch (instr->type) { 91a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand case nir_instr_type_alu: { 92a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand /* For ALU instructions, the resolve status is handled in a 93a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * three-step process. 94a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 95a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 1) Look at the instruction type and sources and determine if it 96a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * can be left unresolved. 97a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 98a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 2) Look at the destination and see if we have to resolve 99a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * anyway. (This is the case if this instruction is not the 100a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * only instruction writing to a given register.) 101a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 102a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 3) If the instruction has a resolve status other than 103a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * BOOL_UNRESOLVED or BOOL_NEEDS_RESOLVE then we walk through 104a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * the sources and ensure that they are also resolved. This 105a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * ensures that we don't end up with any stray unresolved 106a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * booleans going into ADDs or something like that. 107a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 108a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 109a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand uint8_t resolve_status; 110a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand nir_alu_instr *alu = nir_instr_as_alu(instr); 111a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand switch (alu->op) { 1121d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_ball_fequal2: 1131d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_ball_iequal2: 1141d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_ball_fequal3: 1151d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_ball_iequal3: 1161d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_ball_fequal4: 1171d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_ball_iequal4: 1181d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_bany_fnequal2: 1191d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_bany_inequal2: 1201d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_bany_fnequal3: 1211d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_bany_inequal3: 1221d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_bany_fnequal4: 1231d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand case nir_op_bany_inequal4: 1241d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand /* These are only implemented by the vec4 backend and its 1251d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand * implementation emits resolved booleans. At some point in the 1261d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand * future, this may change and we'll have to remove some of the 1271d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand * above cases. 1281d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand */ 1291d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand resolve_status = BRW_NIR_BOOLEAN_NO_RESOLVE; 1301d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand break; 1311d4e698466bdea735c5f06c2658322bdc527efceJason Ekstrand 132a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand case nir_op_imov: 133a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand case nir_op_inot: 134a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand /* This is a single-source instruction. Just copy the resolve 135a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * status from the source. 136a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 137a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand resolve_status = get_resolve_status_for_src(&alu->src[0].src); 138a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand break; 139a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 140a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand case nir_op_iand: 141a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand case nir_op_ior: 142a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand case nir_op_ixor: { 143a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand uint8_t src0_status = get_resolve_status_for_src(&alu->src[0].src); 144a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand uint8_t src1_status = get_resolve_status_for_src(&alu->src[1].src); 145a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 146a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand if (src0_status == src1_status) { 147a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand resolve_status = src0_status; 148a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } else if (src0_status == BRW_NIR_NON_BOOLEAN || 149a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand src1_status == BRW_NIR_NON_BOOLEAN) { 150a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand /* If one of the sources is a non-boolean then the whole 151a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * thing is a non-boolean. 152a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 153a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand resolve_status = BRW_NIR_NON_BOOLEAN; 154a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } else { 155a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand /* At this point one of them is a true boolean and one is a 156a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * boolean that needs a resolve. We could either resolve the 157a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * unresolved source or we could resolve here. If we resolve 158a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * the unresolved source then we get two resolves for the price 159a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * of one. Just set this one to BOOLEAN_NO_RESOLVE and we'll 160a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * let the code below force a resolve on the unresolved source. 161a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 162a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand resolve_status = BRW_NIR_BOOLEAN_NO_RESOLVE; 163a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 164a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand break; 165a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 166a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 167a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand default: 168c38a25af2f47c6de093c9b0ac0ccdfa9fe48007eSamuel Iglesias Gonsálvez if (nir_alu_type_get_base_type(nir_op_infos[alu->op].output_type) == nir_type_bool) { 16917c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand /* This instructions will turn into a CMP when we actually emit 17017c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand * them so the result will have to be resolved before it can be 17117c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand * used. 17217c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand */ 17317c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand resolve_status = BRW_NIR_BOOLEAN_UNRESOLVED; 17417c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand 17517c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand /* Even though the destination is allowed to be left 17617c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand * unresolved, the sources are treated as regular integers or 17717c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand * floats so they need to be resolved. 17817c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand */ 17917c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand nir_foreach_src(instr, src_mark_needs_resolve, NULL); 18017c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand } else { 18117c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand resolve_status = BRW_NIR_NON_BOOLEAN; 18217c978166185a7d3a9759f828a4370c1f2169776Jason Ekstrand } 183a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 184a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 185864907e2f14523c130e6ff24c081789bb079bae1Connor Abbott /* If the destination is SSA, go ahead allow unresolved booleans. 186a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * If the destination register doesn't have a well-defined parent_instr 187a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * we need to resolve immediately. 188a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 189864907e2f14523c130e6ff24c081789bb079bae1Connor Abbott if (!alu->dest.dest.is_ssa && 190a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand resolve_status == BRW_NIR_BOOLEAN_UNRESOLVED) { 191a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand resolve_status = BRW_NIR_BOOLEAN_NEEDS_RESOLVE; 192a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 193a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 194a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand instr->pass_flags = (instr->pass_flags & ~BRW_NIR_BOOLEAN_MASK) | 195a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand resolve_status; 196a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 197a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand /* Finally, resolve sources if it's needed */ 198a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand switch (resolve_status) { 199a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand case BRW_NIR_BOOLEAN_NEEDS_RESOLVE: 200a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand case BRW_NIR_BOOLEAN_UNRESOLVED: 201a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand /* This instruction is either unresolved or we're doing the 202a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * resolve here; leave the sources alone. 203a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 204a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand break; 205a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 206a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand case BRW_NIR_BOOLEAN_NO_RESOLVE: 207a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand case BRW_NIR_NON_BOOLEAN: 208a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand nir_foreach_src(instr, src_mark_needs_resolve, NULL); 209a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand break; 210a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 211a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand default: 212a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand unreachable("Invalid boolean flag"); 213a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 214a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 215a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand break; 216a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 217a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 218a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand case nir_instr_type_load_const: { 219a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand nir_load_const_instr *load = nir_instr_as_load_const(instr); 220a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 221a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand /* For load_const instructions, it's a boolean exactly when it holds 222a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * one of the values NIR_TRUE or NIR_FALSE. 223a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * 224a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * Since load_const instructions don't have any sources, we don't 225a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * have to worry about resolving them. 226a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 227a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand instr->pass_flags &= ~BRW_NIR_BOOLEAN_MASK; 228084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga if (load->value.u32[0] == NIR_TRUE || load->value.u32[0] == NIR_FALSE) { 229a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand instr->pass_flags |= BRW_NIR_BOOLEAN_NO_RESOLVE; 230a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } else { 231a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand instr->pass_flags |= BRW_NIR_NON_BOOLEAN; 232a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 233a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand continue; 234a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 235a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 236a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand default: 237a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand /* Everything else is an unknown non-boolean value and needs to 238a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand * have all sources resolved. 239a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand */ 240a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand instr->pass_flags = (instr->pass_flags & ~BRW_NIR_BOOLEAN_MASK) | 241a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand BRW_NIR_NON_BOOLEAN; 242a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand nir_foreach_src(instr, src_mark_needs_resolve, NULL); 243a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand continue; 244a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 245a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand } 246a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 247a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand nir_if *following_if = nir_block_get_following_if(block); 248a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand if (following_if) 249a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand src_mark_needs_resolve(&following_if->condition, NULL); 250a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 251a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand return true; 252a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand} 253a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 254a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandstatic void 255a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandanalyze_boolean_resolves_impl(nir_function_impl *impl) 256a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand{ 257a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand nir_foreach_block(impl, analyze_boolean_resolves_block, NULL); 258a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand} 259a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand 260a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandvoid 261a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandbrw_nir_analyze_boolean_resolves(nir_shader *shader) 262a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand{ 263237f2f2d8b45d9d956102eec6f9be63193e5269bJason Ekstrand nir_foreach_function(shader, function) { 264237f2f2d8b45d9d956102eec6f9be63193e5269bJason Ekstrand if (function->impl) 265237f2f2d8b45d9d956102eec6f9be63193e5269bJason Ekstrand analyze_boolean_resolves_impl(function->impl); 266237f2f2d8b45d9d956102eec6f9be63193e5269bJason Ekstrand } 267a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand} 268