1/* 2 * Copyright © 2019 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 */ 23#include <gtest/gtest.h> 24#include "nir.h" 25#include "nir_builder.h" 26 27class comparison_pre_test : public ::testing::Test { 28protected: 29 comparison_pre_test() 30 { 31 static const nir_shader_compiler_options options = { }; 32 nir_builder_init_simple_shader(&bld, NULL, MESA_SHADER_VERTEX, &options); 33 34 v1 = nir_imm_vec4(&bld, -2.0, -1.0, 1.0, 2.0); 35 v2 = nir_imm_vec4(&bld, 2.0, 1.0, -1.0, -2.0); 36 v3 = nir_imm_vec4(&bld, 3.0, 4.0, 5.0, 6.0); 37 } 38 39 ~comparison_pre_test() 40 { 41 ralloc_free(bld.shader); 42 } 43 44 struct nir_builder bld; 45 46 nir_ssa_def *v1; 47 nir_ssa_def *v2; 48 nir_ssa_def *v3; 49 50 const uint8_t xxxx[4] = { 0, 0, 0, 0 }; 51 const uint8_t wwww[4] = { 3, 3, 3, 3 }; 52}; 53 54TEST_F(comparison_pre_test, a_lt_b_vs_neg_a_plus_b) 55{ 56 /* Before: 57 * 58 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 59 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 60 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 61 * vec1 32 ssa_3 = load_const ( 1.0) 62 * vec4 32 ssa_4 = fadd ssa_0, ssa_2 63 * vec1 32 ssa_5 = mov ssa_4.x 64 * vec1 1 ssa_6 = flt ssa_5, ssa_3 65 * 66 * if ssa_6 { 67 * vec1 32 ssa_7 = fneg ssa_5 68 * vec1 32 ssa_8 = fadd ssa_7, ssa_3 69 * } else { 70 * } 71 * 72 * After: 73 * 74 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 75 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 76 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 77 * vec1 32 ssa_3 = load_const ( 1.0) 78 * vec4 32 ssa_4 = fadd ssa_0, ssa_2 79 * vec1 32 ssa_5 = mov ssa_4.x 80 * vec1 32 ssa_9 = fneg ssa_5 81 * vec1 32 ssa_10 = fadd ssa_3, ssa_9 82 * vec1 32 ssa_11 = load_const (0.0) 83 * vec1 1 ssa_12 = flt ssa_11, ssa_10 84 * vec1 32 ssa_13 = mov ssa_10 85 * vec1 1 ssa_14 = mov ssa_12 86 * 87 * if ssa_14 { 88 * vec1 32 ssa_7 = fneg ssa_5 89 * } else { 90 * } 91 */ 92 nir_ssa_def *one = nir_imm_float(&bld, 1.0f); 93 nir_ssa_def *a = nir_channel(&bld, nir_fadd(&bld, v1, v3), 0); 94 95 nir_ssa_def *flt = nir_flt(&bld, a, one); 96 97 nir_if *nif = nir_push_if(&bld, flt); 98 99 nir_fadd(&bld, nir_fneg(&bld, a), one); 100 101 nir_pop_if(&bld, nif); 102 103 EXPECT_TRUE(nir_opt_comparison_pre_impl(bld.impl)); 104} 105 106TEST_F(comparison_pre_test, a_lt_b_vs_a_minus_b) 107{ 108 /* Before: 109 * 110 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 111 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 112 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 113 * vec1 32 ssa_3 = load_const ( 1.0) 114 * vec4 32 ssa_4 = fadd ssa_0, ssa_2 115 * vec1 32 ssa_5 = mov ssa_4.x 116 * vec1 1 ssa_6 = flt ssa_3, ssa_5 117 * 118 * if ssa_6 { 119 * vec1 32 ssa_7 = fneg ssa_5 120 * vec1 32 ssa_8 = fadd ssa_3, ssa_7 121 * } else { 122 * } 123 * 124 * After: 125 * 126 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 127 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 128 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 129 * vec1 32 ssa_3 = load_const ( 1.0) 130 * vec4 32 ssa_4 = fadd ssa_0, ssa_2 131 * vec1 32 ssa_5 = mov ssa_4.x 132 * vec1 32 ssa_9 = fneg ssa_5 133 * vec1 32 ssa_10 = fadd ssa_3, ssa_9 134 * vec1 32 ssa_11 = load_const (0.0) 135 * vec1 1 ssa_12 = flt ssa_10, ssa_11 136 * vec1 32 ssa_13 = mov ssa_10 137 * vec1 1 ssa_14 = mov ssa_12 138 * 139 * if ssa_14 { 140 * vec1 32 ssa_7 = fneg ssa_5 141 * } else { 142 * } 143 */ 144 nir_ssa_def *one = nir_imm_float(&bld, 1.0f); 145 nir_ssa_def *b = nir_channel(&bld, nir_fadd(&bld, v1, v3), 0); 146 147 nir_ssa_def *flt = nir_flt(&bld, one, b); 148 149 nir_if *nif = nir_push_if(&bld, flt); 150 151 nir_fadd(&bld, one, nir_fneg(&bld, b)); 152 153 nir_pop_if(&bld, nif); 154 155 EXPECT_TRUE(nir_opt_comparison_pre_impl(bld.impl)); 156} 157 158TEST_F(comparison_pre_test, neg_a_lt_b_vs_a_plus_b) 159{ 160 /* Before: 161 * 162 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 163 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 164 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 165 * vec1 32 ssa_3 = load_const ( 1.0) 166 * vec4 32 ssa_4 = fadd ssa_0, ssa_2 167 * vec1 32 ssa_5 = mov ssa_4.x 168 * vec1 32 ssa_6 = fneg ssa_5 169 * vec1 1 ssa_7 = flt ssa_6, ssa_3 170 * 171 * if ssa_7 { 172 * vec1 32 ssa_8 = fadd ssa_5, ssa_3 173 * } else { 174 * } 175 * 176 * After: 177 * 178 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 179 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 180 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 181 * vec1 32 ssa_3 = load_const ( 1.0) 182 * vec4 32 ssa_4 = fadd ssa_0, ssa_2 183 * vec1 32 ssa_5 = mov ssa_4.x 184 * vec1 32 ssa_9 = fneg ssa_5 185 * vec1 32 ssa_9 = fneg ssa_6 186 * vec1 32 ssa_10 = fadd ssa_3, ssa_9 187 * vec1 32 ssa_11 = load_const ( 0.0) 188 * vec1 1 ssa_12 = flt ssa_11, ssa_10 189 * vec1 32 ssa_13 = mov ssa_10 190 * vec1 1 ssa_14 = mov ssa_12 191 * 192 * if ssa_14 { 193 * } else { 194 * } 195 */ 196 197 nir_ssa_def *one = nir_imm_float(&bld, 1.0f); 198 nir_ssa_def *a = nir_channel(&bld, nir_fadd(&bld, v1, v3), 0); 199 200 nir_ssa_def *flt = nir_flt(&bld, nir_fneg(&bld, a), one); 201 202 nir_if *nif = nir_push_if(&bld, flt); 203 204 nir_fadd(&bld, a, one); 205 206 nir_pop_if(&bld, nif); 207 208 EXPECT_TRUE(nir_opt_comparison_pre_impl(bld.impl)); 209} 210 211TEST_F(comparison_pre_test, a_lt_neg_b_vs_a_plus_b) 212{ 213 /* Before: 214 * 215 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 216 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 217 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 218 * vec1 32 ssa_3 = load_const ( 1.0) 219 * vec4 32 ssa_4 = fadd ssa_0, ssa_2 220 * vec1 32 ssa_5 = mov ssa_4.x 221 * vec1 32 ssa_6 = fneg ssa_5 222 * vec1 1 ssa_7 = flt ssa_3, ssa_6 223 * 224 * if ssa_7 { 225 * vec1 32 ssa_8 = fadd ssa_3, ssa_5 226 * } else { 227 * } 228 * 229 * After: 230 * 231 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 232 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 233 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 234 * vec1 32 ssa_3 = load_const ( 1.0) 235 * vec4 32 ssa_4 = fadd ssa_0, ssa_2 236 * vec1 32 ssa_5 = mov ssa_4.x 237 * vec1 32 ssa_9 = fneg ssa_5 238 * vec1 32 ssa_9 = fneg ssa_6 239 * vec1 32 ssa_10 = fadd ssa_3, ssa_9 240 * vec1 32 ssa_11 = load_const ( 0.0) 241 * vec1 1 ssa_12 = flt ssa_10, ssa_11 242 * vec1 32 ssa_13 = mov ssa_10 243 * vec1 1 ssa_14 = mov ssa_12 244 * 245 * if ssa_14 { 246 * } else { 247 * } 248 */ 249 nir_ssa_def *one = nir_imm_float(&bld, 1.0f); 250 nir_ssa_def *b = nir_channel(&bld, nir_fadd(&bld, v1, v3), 0); 251 252 nir_ssa_def *flt = nir_flt(&bld, one, nir_fneg(&bld, b)); 253 254 nir_if *nif = nir_push_if(&bld, flt); 255 256 nir_fadd(&bld, one, b); 257 258 nir_pop_if(&bld, nif); 259 260 EXPECT_TRUE(nir_opt_comparison_pre_impl(bld.impl)); 261} 262 263TEST_F(comparison_pre_test, imm_lt_b_vs_neg_imm_plus_b) 264{ 265 /* Before: 266 * 267 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 268 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 269 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 270 * vec1 32 ssa_3 = load_const ( 1.0) 271 * vec1 32 ssa_4 = load_const (-1.0) 272 * vec4 32 ssa_5 = fadd ssa_0, ssa_2 273 * vec1 32 ssa_6 = mov ssa_5.x 274 * vec1 1 ssa_7 = flt ssa_3, ssa_6 275 * 276 * if ssa_7 { 277 * vec1 32 ssa_8 = fadd ssa_4, ssa_6 278 * } else { 279 * } 280 * 281 * After: 282 * 283 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 284 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 285 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 286 * vec1 32 ssa_3 = load_const ( 1.0) 287 * vec1 32 ssa_4 = load_const (-1.0) 288 * vec4 32 ssa_5 = fadd ssa_0, ssa_2 289 * vec1 32 ssa_6 = mov ssa_5.x 290 * vec1 32 ssa_9 = fneg ssa_3 291 * vec1 32 ssa_10 = fadd ssa_6, ssa_9 292 * vec1 32 ssa_11 = load_const ( 0.0) 293 * vec1 1 ssa_12 = flt ssa_11, ssa_10 294 * vec1 32 ssa_13 = mov ssa_10 295 * vec1 1 ssa_14 = mov ssa_12 296 * 297 * if ssa_14 { 298 * } else { 299 * } 300 */ 301 nir_ssa_def *one = nir_imm_float(&bld, 1.0f); 302 nir_ssa_def *neg_one = nir_imm_float(&bld, -1.0f); 303 nir_ssa_def *a = nir_channel(&bld, nir_fadd(&bld, v1, v3), 0); 304 305 nir_ssa_def *flt = nir_flt(&bld, one, a); 306 307 nir_if *nif = nir_push_if(&bld, flt); 308 309 nir_fadd(&bld, neg_one, a); 310 311 nir_pop_if(&bld, nif); 312 313 EXPECT_TRUE(nir_opt_comparison_pre_impl(bld.impl)); 314} 315 316TEST_F(comparison_pre_test, a_lt_imm_vs_a_minus_imm) 317{ 318 /* Before: 319 * 320 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 321 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 322 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 323 * vec1 32 ssa_3 = load_const ( 1.0) 324 * vec1 32 ssa_4 = load_const (-1.0) 325 * vec4 32 ssa_5 = fadd ssa_0, ssa_2 326 * vec1 32 ssa_6 = mov ssa_5.x 327 * vec1 1 ssa_7 = flt ssa_6, ssa_3 328 * 329 * if ssa_6 { 330 * vec1 32 ssa_8 = fadd ssa_6, ssa_4 331 * } else { 332 * } 333 * 334 * After: 335 * 336 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 337 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 338 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 339 * vec1 32 ssa_3 = load_const ( 1.0) 340 * vec1 32 ssa_4 = load_const (-1.0) 341 * vec4 32 ssa_5 = fadd ssa_0, ssa_2 342 * vec1 32 ssa_6 = mov ssa_5.x 343 * vec1 32 ssa_9 = fneg ssa_3 344 * vec1 32 ssa_10 = fadd ssa_6, ssa_9 345 * vec1 32 ssa_11 = load_const ( 0.0) 346 * vec1 1 ssa_12 = flt ssa_10, ssa_11 347 * vec1 32 ssa_13 = mov ssa_10 348 * vec1 1 ssa_14 = mov ssa_12 349 * 350 * if ssa_14 { 351 * } else { 352 * } 353 */ 354 nir_ssa_def *one = nir_imm_float(&bld, 1.0f); 355 nir_ssa_def *neg_one = nir_imm_float(&bld, -1.0f); 356 nir_ssa_def *a = nir_channel(&bld, nir_fadd(&bld, v1, v3), 0); 357 358 nir_ssa_def *flt = nir_flt(&bld, a, one); 359 360 nir_if *nif = nir_push_if(&bld, flt); 361 362 nir_fadd(&bld, a, neg_one); 363 364 nir_pop_if(&bld, nif); 365 366 EXPECT_TRUE(nir_opt_comparison_pre_impl(bld.impl)); 367} 368 369TEST_F(comparison_pre_test, neg_imm_lt_a_vs_a_plus_imm) 370{ 371 /* Before: 372 * 373 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 374 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 375 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 376 * vec1 32 ssa_3 = load_const ( 1.0) 377 * vec1 32 ssa_4 = load_const (-1.0) 378 * vec4 32 ssa_5 = fadd ssa_0, ssa_2 379 * vec1 32 ssa_6 = mov ssa_5.x 380 * vec1 1 ssa_7 = flt ssa_4, ssa_6 381 * 382 * if ssa_7 { 383 * vec1 32 ssa_8 = fadd ssa_6, ssa_3 384 * } else { 385 * } 386 * 387 * After: 388 * 389 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 390 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 391 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 392 * vec1 32 ssa_3 = load_const ( 1.0) 393 * vec1 32 ssa_4 = load_const (-1.0) 394 * vec4 32 ssa_5 = fadd ssa_0, ssa_2 395 * vec1 32 ssa_6 = mov ssa_5.x 396 * vec1 32 ssa_9 = fneg ssa_4 397 * vec1 32 ssa_10 = fadd ssa_6, ssa_9 398 * vec1 32 ssa_11 = load_const ( 0.0) 399 * vec1 1 ssa_12 = flt ssa_11, ssa_10 400 * vec1 32 ssa_13 = mov ssa_10 401 * vec1 1 ssa_14 = mov ssa_12 402 * 403 * if ssa_14 { 404 * } else { 405 * } 406 */ 407 408 nir_ssa_def *one = nir_imm_float(&bld, 1.0f); 409 nir_ssa_def *neg_one = nir_imm_float(&bld, -1.0f); 410 nir_ssa_def *a = nir_channel(&bld, nir_fadd(&bld, v1, v3), 0); 411 412 nir_ssa_def *flt = nir_flt(&bld, neg_one, a); 413 414 nir_if *nif = nir_push_if(&bld, flt); 415 416 nir_fadd(&bld, a, one); 417 418 nir_pop_if(&bld, nif); 419 420 EXPECT_TRUE(nir_opt_comparison_pre_impl(bld.impl)); 421} 422 423TEST_F(comparison_pre_test, a_lt_neg_imm_vs_a_plus_imm) 424{ 425 /* Before: 426 * 427 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 428 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 429 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 430 * vec1 32 ssa_3 = load_const ( 1.0) 431 * vec1 32 ssa_4 = load_const (-1.0) 432 * vec4 32 ssa_5 = fadd ssa_0, ssa_2 433 * vec1 32 ssa_6 = mov ssa_5.x 434 * vec1 1 ssa_7 = flt ssa_6, ssa_4 435 * 436 * if ssa_7 { 437 * vec1 32 ssa_8 = fadd ssa_6, ssa_3 438 * } else { 439 * } 440 * 441 * After: 442 * 443 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 444 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 445 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 446 * vec1 32 ssa_3 = load_const ( 1.0) 447 * vec1 32 ssa_4 = load_const (-1.0) 448 * vec4 32 ssa_5 = fadd ssa_0, ssa_2 449 * vec1 32 ssa_6 = mov ssa_5.x 450 * vec1 32 ssa_9 = fneg ssa_4 451 * vec1 32 ssa_10 = fadd ssa_6, ssa_9 452 * vec1 32 ssa_11 = load_const ( 0.0) 453 * vec1 1 ssa_12 = flt ssa_10, ssa_11 454 * vec1 32 ssa_13 = mov ssa_10 455 * vec1 1 ssa_14 = mov ssa_12 456 * 457 * if ssa_14 { 458 * } else { 459 * } 460 */ 461 nir_ssa_def *one = nir_imm_float(&bld, 1.0f); 462 nir_ssa_def *neg_one = nir_imm_float(&bld, -1.0f); 463 nir_ssa_def *a = nir_channel(&bld, nir_fadd(&bld, v1, v3), 0); 464 465 nir_ssa_def *flt = nir_flt(&bld, a, neg_one); 466 467 nir_if *nif = nir_push_if(&bld, flt); 468 469 nir_fadd(&bld, a, one); 470 471 nir_pop_if(&bld, nif); 472 473 EXPECT_TRUE(nir_opt_comparison_pre_impl(bld.impl)); 474} 475 476TEST_F(comparison_pre_test, non_scalar_add_result) 477{ 478 /* The optimization pass should not do anything because the result of the 479 * fadd is not a scalar. 480 * 481 * Before: 482 * 483 * vec4 32 ssa_0 = load_const (-2.0, -1.0, 1.0, 2.0) 484 * vec4 32 ssa_1 = load_const ( 2.0, 1.0, -1.0, -2.0) 485 * vec4 32 ssa_2 = load_const ( 3.0, 4.0, 5.0, 6.0) 486 * vec4 32 ssa_3 = fadd ssa_0, ssa_2 487 * vec1 1 ssa_4 = flt ssa_0.x, ssa_3.x 488 * 489 * if ssa_4 { 490 * vec2 32 ssa_5 = fadd ssa_1.xx, ssa_3.xx 491 * } else { 492 * } 493 * 494 * After: 495 * 496 * No change. 497 */ 498 nir_ssa_def *a = nir_fadd(&bld, v1, v3); 499 500 nir_alu_instr *flt = nir_alu_instr_create(bld.shader, nir_op_flt); 501 502 flt->src[0].src = nir_src_for_ssa(v1); 503 flt->src[1].src = nir_src_for_ssa(a); 504 505 memcpy(&flt->src[0].swizzle, xxxx, sizeof(xxxx)); 506 memcpy(&flt->src[1].swizzle, xxxx, sizeof(xxxx)); 507 508 nir_builder_alu_instr_finish_and_insert(&bld, flt); 509 510 flt->dest.dest.ssa.num_components = 1; 511 flt->dest.write_mask = 1; 512 513 nir_if *nif = nir_push_if(&bld, &flt->dest.dest.ssa); 514 515 nir_alu_instr *fadd = nir_alu_instr_create(bld.shader, nir_op_fadd); 516 517 fadd->src[0].src = nir_src_for_ssa(v2); 518 fadd->src[1].src = nir_src_for_ssa(a); 519 520 memcpy(&fadd->src[0].swizzle, xxxx, sizeof(xxxx)); 521 memcpy(&fadd->src[1].swizzle, xxxx, sizeof(xxxx)); 522 523 nir_builder_alu_instr_finish_and_insert(&bld, fadd); 524 525 fadd->dest.dest.ssa.num_components = 2; 526 fadd->dest.write_mask = 3; 527 528 nir_pop_if(&bld, nif); 529 530 EXPECT_FALSE(nir_opt_comparison_pre_impl(bld.impl)); 531} 532