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
877efff10585122d484dc3adab14af9380b9b8f309Connor Abbottanalyze_boolean_resolves_block(nir_block *block)
88a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand{
89707e72f13bb78869ee95d3286980bf1709cba6cfJason Ekstrand   nir_foreach_instr(instr, block) {
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{
2577efff10585122d484dc3adab14af9380b9b8f309Connor Abbott   nir_foreach_block(block, impl) {
2587efff10585122d484dc3adab14af9380b9b8f309Connor Abbott      analyze_boolean_resolves_block(block);
2597efff10585122d484dc3adab14af9380b9b8f309Connor Abbott   }
260a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand}
261a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand
262a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandvoid
263a55af2699feb8f64d6f480b223204da071606721Jason Ekstrandbrw_nir_analyze_boolean_resolves(nir_shader *shader)
264a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand{
2659464d8c49813aba77285e7465b96e92a91ed327cJason Ekstrand   nir_foreach_function(function, shader) {
266237f2f2d8b45d9d956102eec6f9be63193e5269bJason Ekstrand      if (function->impl)
267237f2f2d8b45d9d956102eec6f9be63193e5269bJason Ekstrand         analyze_boolean_resolves_impl(function->impl);
268237f2f2d8b45d9d956102eec6f9be63193e5269bJason Ekstrand   }
269a55af2699feb8f64d6f480b223204da071606721Jason Ekstrand}
270