1 /* 2 * Copyright 2015 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 DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24 #include <gtest/gtest.h> 25 #include "brw_fs.h" 26 #include "brw_cfg.h" 27 #include "program/program.h" 28 29 using namespace brw; 30 31 class cmod_propagation_test : public ::testing::Test { 32 virtual void SetUp(); 33 34 public: 35 struct brw_compiler *compiler; 36 struct gen_device_info *devinfo; 37 struct gl_context *ctx; 38 struct brw_wm_prog_data *prog_data; 39 struct gl_shader_program *shader_prog; 40 fs_visitor *v; 41 }; 42 43 class cmod_propagation_fs_visitor : public fs_visitor 44 { 45 public: 46 cmod_propagation_fs_visitor(struct brw_compiler *compiler, 47 struct brw_wm_prog_data *prog_data, 48 nir_shader *shader) 49 : fs_visitor(compiler, NULL, NULL, NULL, 50 &prog_data->base, (struct gl_program *) NULL, 51 shader, 8, -1) {} 52 }; 53 54 55 void cmod_propagation_test::SetUp() 56 { 57 ctx = (struct gl_context *)calloc(1, sizeof(*ctx)); 58 compiler = (struct brw_compiler *)calloc(1, sizeof(*compiler)); 59 devinfo = (struct gen_device_info *)calloc(1, sizeof(*devinfo)); 60 compiler->devinfo = devinfo; 61 62 prog_data = ralloc(NULL, struct brw_wm_prog_data); 63 nir_shader *shader = 64 nir_shader_create(NULL, MESA_SHADER_FRAGMENT, NULL, NULL); 65 66 v = new cmod_propagation_fs_visitor(compiler, prog_data, shader); 67 68 devinfo->gen = 4; 69 } 70 71 static fs_inst * 72 instruction(bblock_t *block, int num) 73 { 74 fs_inst *inst = (fs_inst *)block->start(); 75 for (int i = 0; i < num; i++) { 76 inst = (fs_inst *)inst->next; 77 } 78 return inst; 79 } 80 81 static bool 82 cmod_propagation(fs_visitor *v) 83 { 84 const bool print = getenv("TEST_DEBUG"); 85 86 if (print) { 87 fprintf(stderr, "= Before =\n"); 88 v->cfg->dump(v); 89 } 90 91 bool ret = v->opt_cmod_propagation(); 92 93 if (print) { 94 fprintf(stderr, "\n= After =\n"); 95 v->cfg->dump(v); 96 } 97 98 return ret; 99 } 100 101 TEST_F(cmod_propagation_test, basic) 102 { 103 const fs_builder &bld = v->bld; 104 fs_reg dest = v->vgrf(glsl_type::float_type); 105 fs_reg src0 = v->vgrf(glsl_type::float_type); 106 fs_reg src1 = v->vgrf(glsl_type::float_type); 107 fs_reg zero(brw_imm_f(0.0f)); 108 bld.ADD(dest, src0, src1); 109 bld.CMP(bld.null_reg_f(), dest, zero, BRW_CONDITIONAL_GE); 110 111 /* = Before = 112 * 113 * 0: add(8) dest src0 src1 114 * 1: cmp.ge.f0(8) null dest 0.0f 115 * 116 * = After = 117 * 0: add.ge.f0(8) dest src0 src1 118 */ 119 120 v->calculate_cfg(); 121 bblock_t *block0 = v->cfg->blocks[0]; 122 123 EXPECT_EQ(0, block0->start_ip); 124 EXPECT_EQ(1, block0->end_ip); 125 126 EXPECT_TRUE(cmod_propagation(v)); 127 EXPECT_EQ(0, block0->start_ip); 128 EXPECT_EQ(0, block0->end_ip); 129 EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode); 130 EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 0)->conditional_mod); 131 } 132 133 TEST_F(cmod_propagation_test, cmp_nonzero) 134 { 135 const fs_builder &bld = v->bld; 136 fs_reg dest = v->vgrf(glsl_type::float_type); 137 fs_reg src0 = v->vgrf(glsl_type::float_type); 138 fs_reg src1 = v->vgrf(glsl_type::float_type); 139 fs_reg nonzero(brw_imm_f(1.0f)); 140 bld.ADD(dest, src0, src1); 141 bld.CMP(bld.null_reg_f(), dest, nonzero, BRW_CONDITIONAL_GE); 142 143 /* = Before = 144 * 145 * 0: add(8) dest src0 src1 146 * 1: cmp.ge.f0(8) null dest 1.0f 147 * 148 * = After = 149 * (no changes) 150 */ 151 152 v->calculate_cfg(); 153 bblock_t *block0 = v->cfg->blocks[0]; 154 155 EXPECT_EQ(0, block0->start_ip); 156 EXPECT_EQ(1, block0->end_ip); 157 158 EXPECT_FALSE(cmod_propagation(v)); 159 EXPECT_EQ(0, block0->start_ip); 160 EXPECT_EQ(1, block0->end_ip); 161 EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode); 162 EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 1)->opcode); 163 EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 1)->conditional_mod); 164 } 165 166 TEST_F(cmod_propagation_test, non_cmod_instruction) 167 { 168 const fs_builder &bld = v->bld; 169 fs_reg dest = v->vgrf(glsl_type::uint_type); 170 fs_reg src0 = v->vgrf(glsl_type::uint_type); 171 fs_reg zero(brw_imm_ud(0u)); 172 bld.FBL(dest, src0); 173 bld.CMP(bld.null_reg_ud(), dest, zero, BRW_CONDITIONAL_GE); 174 175 /* = Before = 176 * 177 * 0: fbl(8) dest src0 178 * 1: cmp.ge.f0(8) null dest 0u 179 * 180 * = After = 181 * (no changes) 182 */ 183 184 v->calculate_cfg(); 185 bblock_t *block0 = v->cfg->blocks[0]; 186 187 EXPECT_EQ(0, block0->start_ip); 188 EXPECT_EQ(1, block0->end_ip); 189 190 EXPECT_FALSE(cmod_propagation(v)); 191 EXPECT_EQ(0, block0->start_ip); 192 EXPECT_EQ(1, block0->end_ip); 193 EXPECT_EQ(BRW_OPCODE_FBL, instruction(block0, 0)->opcode); 194 EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 1)->opcode); 195 EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 1)->conditional_mod); 196 } 197 198 TEST_F(cmod_propagation_test, intervening_flag_write) 199 { 200 const fs_builder &bld = v->bld; 201 fs_reg dest = v->vgrf(glsl_type::float_type); 202 fs_reg src0 = v->vgrf(glsl_type::float_type); 203 fs_reg src1 = v->vgrf(glsl_type::float_type); 204 fs_reg src2 = v->vgrf(glsl_type::float_type); 205 fs_reg zero(brw_imm_f(0.0f)); 206 bld.ADD(dest, src0, src1); 207 bld.CMP(bld.null_reg_f(), src2, zero, BRW_CONDITIONAL_GE); 208 bld.CMP(bld.null_reg_f(), dest, zero, BRW_CONDITIONAL_GE); 209 210 /* = Before = 211 * 212 * 0: add(8) dest src0 src1 213 * 1: cmp.ge.f0(8) null src2 0.0f 214 * 2: cmp.ge.f0(8) null dest 0.0f 215 * 216 * = After = 217 * (no changes) 218 */ 219 220 v->calculate_cfg(); 221 bblock_t *block0 = v->cfg->blocks[0]; 222 223 EXPECT_EQ(0, block0->start_ip); 224 EXPECT_EQ(2, block0->end_ip); 225 226 EXPECT_FALSE(cmod_propagation(v)); 227 EXPECT_EQ(0, block0->start_ip); 228 EXPECT_EQ(2, block0->end_ip); 229 EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode); 230 EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 1)->opcode); 231 EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 1)->conditional_mod); 232 EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 2)->opcode); 233 EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 2)->conditional_mod); 234 } 235 236 TEST_F(cmod_propagation_test, intervening_flag_read) 237 { 238 const fs_builder &bld = v->bld; 239 fs_reg dest0 = v->vgrf(glsl_type::float_type); 240 fs_reg dest1 = v->vgrf(glsl_type::float_type); 241 fs_reg src0 = v->vgrf(glsl_type::float_type); 242 fs_reg src1 = v->vgrf(glsl_type::float_type); 243 fs_reg src2 = v->vgrf(glsl_type::float_type); 244 fs_reg zero(brw_imm_f(0.0f)); 245 bld.ADD(dest0, src0, src1); 246 set_predicate(BRW_PREDICATE_NORMAL, bld.SEL(dest1, src2, zero)); 247 bld.CMP(bld.null_reg_f(), dest0, zero, BRW_CONDITIONAL_GE); 248 249 /* = Before = 250 * 251 * 0: add(8) dest0 src0 src1 252 * 1: (+f0) sel(8) dest1 src2 0.0f 253 * 2: cmp.ge.f0(8) null dest0 0.0f 254 * 255 * = After = 256 * (no changes) 257 */ 258 259 v->calculate_cfg(); 260 bblock_t *block0 = v->cfg->blocks[0]; 261 262 EXPECT_EQ(0, block0->start_ip); 263 EXPECT_EQ(2, block0->end_ip); 264 265 EXPECT_FALSE(cmod_propagation(v)); 266 EXPECT_EQ(0, block0->start_ip); 267 EXPECT_EQ(2, block0->end_ip); 268 EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode); 269 EXPECT_EQ(BRW_OPCODE_SEL, instruction(block0, 1)->opcode); 270 EXPECT_EQ(BRW_PREDICATE_NORMAL, instruction(block0, 1)->predicate); 271 EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 2)->opcode); 272 EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 2)->conditional_mod); 273 } 274 275 TEST_F(cmod_propagation_test, intervening_dest_write) 276 { 277 const fs_builder &bld = v->bld; 278 fs_reg dest = v->vgrf(glsl_type::vec4_type); 279 fs_reg src0 = v->vgrf(glsl_type::float_type); 280 fs_reg src1 = v->vgrf(glsl_type::float_type); 281 fs_reg src2 = v->vgrf(glsl_type::vec2_type); 282 fs_reg zero(brw_imm_f(0.0f)); 283 bld.ADD(offset(dest, bld, 2), src0, src1); 284 bld.emit(SHADER_OPCODE_TEX, dest, src2) 285 ->size_written = 4 * REG_SIZE; 286 bld.CMP(bld.null_reg_f(), offset(dest, bld, 2), zero, BRW_CONDITIONAL_GE); 287 288 /* = Before = 289 * 290 * 0: add(8) dest+2 src0 src1 291 * 1: tex(8) rlen 4 dest+0 src2 292 * 2: cmp.ge.f0(8) null dest+2 0.0f 293 * 294 * = After = 295 * (no changes) 296 */ 297 298 v->calculate_cfg(); 299 bblock_t *block0 = v->cfg->blocks[0]; 300 301 EXPECT_EQ(0, block0->start_ip); 302 EXPECT_EQ(2, block0->end_ip); 303 304 EXPECT_FALSE(cmod_propagation(v)); 305 EXPECT_EQ(0, block0->start_ip); 306 EXPECT_EQ(2, block0->end_ip); 307 EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode); 308 EXPECT_EQ(BRW_CONDITIONAL_NONE, instruction(block0, 0)->conditional_mod); 309 EXPECT_EQ(SHADER_OPCODE_TEX, instruction(block0, 1)->opcode); 310 EXPECT_EQ(BRW_CONDITIONAL_NONE, instruction(block0, 0)->conditional_mod); 311 EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 2)->opcode); 312 EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 2)->conditional_mod); 313 } 314 315 TEST_F(cmod_propagation_test, intervening_flag_read_same_value) 316 { 317 const fs_builder &bld = v->bld; 318 fs_reg dest0 = v->vgrf(glsl_type::float_type); 319 fs_reg dest1 = v->vgrf(glsl_type::float_type); 320 fs_reg src0 = v->vgrf(glsl_type::float_type); 321 fs_reg src1 = v->vgrf(glsl_type::float_type); 322 fs_reg src2 = v->vgrf(glsl_type::float_type); 323 fs_reg zero(brw_imm_f(0.0f)); 324 set_condmod(BRW_CONDITIONAL_GE, bld.ADD(dest0, src0, src1)); 325 set_predicate(BRW_PREDICATE_NORMAL, bld.SEL(dest1, src2, zero)); 326 bld.CMP(bld.null_reg_f(), dest0, zero, BRW_CONDITIONAL_GE); 327 328 /* = Before = 329 * 330 * 0: add.ge.f0(8) dest0 src0 src1 331 * 1: (+f0) sel(8) dest1 src2 0.0f 332 * 2: cmp.ge.f0(8) null dest0 0.0f 333 * 334 * = After = 335 * 0: add.ge.f0(8) dest0 src0 src1 336 * 1: (+f0) sel(8) dest1 src2 0.0f 337 */ 338 339 v->calculate_cfg(); 340 bblock_t *block0 = v->cfg->blocks[0]; 341 342 EXPECT_EQ(0, block0->start_ip); 343 EXPECT_EQ(2, block0->end_ip); 344 345 EXPECT_TRUE(cmod_propagation(v)); 346 EXPECT_EQ(0, block0->start_ip); 347 EXPECT_EQ(1, block0->end_ip); 348 EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode); 349 EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 0)->conditional_mod); 350 EXPECT_EQ(BRW_OPCODE_SEL, instruction(block0, 1)->opcode); 351 EXPECT_EQ(BRW_PREDICATE_NORMAL, instruction(block0, 1)->predicate); 352 } 353 354 TEST_F(cmod_propagation_test, negate) 355 { 356 const fs_builder &bld = v->bld; 357 fs_reg dest = v->vgrf(glsl_type::float_type); 358 fs_reg src0 = v->vgrf(glsl_type::float_type); 359 fs_reg src1 = v->vgrf(glsl_type::float_type); 360 fs_reg zero(brw_imm_f(0.0f)); 361 bld.ADD(dest, src0, src1); 362 dest.negate = true; 363 bld.CMP(bld.null_reg_f(), dest, zero, BRW_CONDITIONAL_GE); 364 365 /* = Before = 366 * 367 * 0: add(8) dest src0 src1 368 * 1: cmp.ge.f0(8) null -dest 0.0f 369 * 370 * = After = 371 * 0: add.le.f0(8) dest src0 src1 372 */ 373 374 v->calculate_cfg(); 375 bblock_t *block0 = v->cfg->blocks[0]; 376 377 EXPECT_EQ(0, block0->start_ip); 378 EXPECT_EQ(1, block0->end_ip); 379 380 EXPECT_TRUE(cmod_propagation(v)); 381 EXPECT_EQ(0, block0->start_ip); 382 EXPECT_EQ(0, block0->end_ip); 383 EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode); 384 EXPECT_EQ(BRW_CONDITIONAL_LE, instruction(block0, 0)->conditional_mod); 385 } 386 387 TEST_F(cmod_propagation_test, movnz) 388 { 389 const fs_builder &bld = v->bld; 390 fs_reg dest = v->vgrf(glsl_type::float_type); 391 fs_reg src0 = v->vgrf(glsl_type::float_type); 392 fs_reg src1 = v->vgrf(glsl_type::float_type); 393 bld.CMP(dest, src0, src1, BRW_CONDITIONAL_GE); 394 set_condmod(BRW_CONDITIONAL_NZ, 395 bld.MOV(bld.null_reg_f(), dest)); 396 397 /* = Before = 398 * 399 * 0: cmp.ge.f0(8) dest src0 src1 400 * 1: mov.nz.f0(8) null dest 401 * 402 * = After = 403 * 0: cmp.ge.f0(8) dest src0 src1 404 */ 405 406 v->calculate_cfg(); 407 bblock_t *block0 = v->cfg->blocks[0]; 408 409 EXPECT_EQ(0, block0->start_ip); 410 EXPECT_EQ(1, block0->end_ip); 411 412 EXPECT_TRUE(cmod_propagation(v)); 413 EXPECT_EQ(0, block0->start_ip); 414 EXPECT_EQ(0, block0->end_ip); 415 EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 0)->opcode); 416 EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 0)->conditional_mod); 417 } 418 419 TEST_F(cmod_propagation_test, different_types_cmod_with_zero) 420 { 421 const fs_builder &bld = v->bld; 422 fs_reg dest = v->vgrf(glsl_type::int_type); 423 fs_reg src0 = v->vgrf(glsl_type::int_type); 424 fs_reg src1 = v->vgrf(glsl_type::int_type); 425 fs_reg zero(brw_imm_f(0.0f)); 426 bld.ADD(dest, src0, src1); 427 bld.CMP(bld.null_reg_f(), retype(dest, BRW_REGISTER_TYPE_F), zero, 428 BRW_CONDITIONAL_GE); 429 430 /* = Before = 431 * 432 * 0: add(8) dest:D src0:D src1:D 433 * 1: cmp.ge.f0(8) null:F dest:F 0.0f 434 * 435 * = After = 436 * (no changes) 437 */ 438 439 v->calculate_cfg(); 440 bblock_t *block0 = v->cfg->blocks[0]; 441 442 EXPECT_EQ(0, block0->start_ip); 443 EXPECT_EQ(1, block0->end_ip); 444 445 EXPECT_FALSE(cmod_propagation(v)); 446 EXPECT_EQ(0, block0->start_ip); 447 EXPECT_EQ(1, block0->end_ip); 448 EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode); 449 EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 1)->opcode); 450 EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 1)->conditional_mod); 451 } 452 453 TEST_F(cmod_propagation_test, andnz_one) 454 { 455 const fs_builder &bld = v->bld; 456 fs_reg dest = v->vgrf(glsl_type::int_type); 457 fs_reg src0 = v->vgrf(glsl_type::float_type); 458 fs_reg zero(brw_imm_f(0.0f)); 459 fs_reg one(brw_imm_d(1)); 460 461 bld.CMP(retype(dest, BRW_REGISTER_TYPE_F), src0, zero, BRW_CONDITIONAL_L); 462 set_condmod(BRW_CONDITIONAL_NZ, 463 bld.AND(bld.null_reg_d(), dest, one)); 464 465 /* = Before = 466 * 0: cmp.l.f0(8) dest:F src0:F 0F 467 * 1: and.nz.f0(8) null:D dest:D 1D 468 * 469 * = After = 470 * 0: cmp.l.f0(8) dest:F src0:F 0F 471 */ 472 473 v->calculate_cfg(); 474 bblock_t *block0 = v->cfg->blocks[0]; 475 476 EXPECT_EQ(0, block0->start_ip); 477 EXPECT_EQ(1, block0->end_ip); 478 479 EXPECT_TRUE(cmod_propagation(v)); 480 EXPECT_EQ(0, block0->start_ip); 481 EXPECT_EQ(0, block0->end_ip); 482 EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 0)->opcode); 483 EXPECT_EQ(BRW_CONDITIONAL_L, instruction(block0, 0)->conditional_mod); 484 EXPECT_TRUE(retype(dest, BRW_REGISTER_TYPE_F) 485 .equals(instruction(block0, 0)->dst)); 486 } 487 488 TEST_F(cmod_propagation_test, andnz_non_one) 489 { 490 const fs_builder &bld = v->bld; 491 fs_reg dest = v->vgrf(glsl_type::int_type); 492 fs_reg src0 = v->vgrf(glsl_type::float_type); 493 fs_reg zero(brw_imm_f(0.0f)); 494 fs_reg nonone(brw_imm_d(38)); 495 496 bld.CMP(retype(dest, BRW_REGISTER_TYPE_F), src0, zero, BRW_CONDITIONAL_L); 497 set_condmod(BRW_CONDITIONAL_NZ, 498 bld.AND(bld.null_reg_d(), dest, nonone)); 499 500 /* = Before = 501 * 0: cmp.l.f0(8) dest:F src0:F 0F 502 * 1: and.nz.f0(8) null:D dest:D 38D 503 * 504 * = After = 505 * (no changes) 506 */ 507 508 v->calculate_cfg(); 509 bblock_t *block0 = v->cfg->blocks[0]; 510 511 EXPECT_EQ(0, block0->start_ip); 512 EXPECT_EQ(1, block0->end_ip); 513 514 EXPECT_FALSE(cmod_propagation(v)); 515 EXPECT_EQ(0, block0->start_ip); 516 EXPECT_EQ(1, block0->end_ip); 517 EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 0)->opcode); 518 EXPECT_EQ(BRW_CONDITIONAL_L, instruction(block0, 0)->conditional_mod); 519 EXPECT_EQ(BRW_OPCODE_AND, instruction(block0, 1)->opcode); 520 EXPECT_EQ(BRW_CONDITIONAL_NZ, instruction(block0, 1)->conditional_mod); 521 } 522 523 TEST_F(cmod_propagation_test, andz_one) 524 { 525 const fs_builder &bld = v->bld; 526 fs_reg dest = v->vgrf(glsl_type::int_type); 527 fs_reg src0 = v->vgrf(glsl_type::float_type); 528 fs_reg zero(brw_imm_f(0.0f)); 529 fs_reg one(brw_imm_d(1)); 530 531 bld.CMP(retype(dest, BRW_REGISTER_TYPE_F), src0, zero, BRW_CONDITIONAL_L); 532 set_condmod(BRW_CONDITIONAL_Z, 533 bld.AND(bld.null_reg_d(), dest, one)); 534 535 /* = Before = 536 * 0: cmp.l.f0(8) dest:F src0:F 0F 537 * 1: and.z.f0(8) null:D dest:D 1D 538 * 539 * = After = 540 * (no changes) 541 */ 542 543 v->calculate_cfg(); 544 bblock_t *block0 = v->cfg->blocks[0]; 545 546 EXPECT_EQ(0, block0->start_ip); 547 EXPECT_EQ(1, block0->end_ip); 548 549 EXPECT_FALSE(cmod_propagation(v)); 550 EXPECT_EQ(0, block0->start_ip); 551 EXPECT_EQ(1, block0->end_ip); 552 EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 0)->opcode); 553 EXPECT_EQ(BRW_CONDITIONAL_L, instruction(block0, 0)->conditional_mod); 554 EXPECT_EQ(BRW_OPCODE_AND, instruction(block0, 1)->opcode); 555 EXPECT_EQ(BRW_CONDITIONAL_EQ, instruction(block0, 1)->conditional_mod); 556 } 557