X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglsl%2Fopt_if_simplification.cpp;h=7e88208f7c141b19dffbc0c23faa7fcecf335c88;hb=6a829a1b724ca0d960decee217d260b4de8a5463;hp=021615ebd126f686dc111cfe293ad1d856bade81;hpb=32aaf89823de11e98cb59d5ec78c66cd3e74bcd4;p=mesa.git diff --git a/src/glsl/opt_if_simplification.cpp b/src/glsl/opt_if_simplification.cpp index 021615ebd12..7e88208f7c1 100644 --- a/src/glsl/opt_if_simplification.cpp +++ b/src/glsl/opt_if_simplification.cpp @@ -22,7 +22,7 @@ */ /** - * \file ir_if_simplification.cpp + * \file opt_if_simplification.cpp * * Moves constant branches of if statements out to the surrounding * instruction stream. @@ -38,10 +38,21 @@ public: } ir_visitor_status visit_leave(ir_if *); + ir_visitor_status visit_enter(ir_assignment *); bool made_progress; }; +/* We only care about the top level "if" instructions, so don't + * descend into expressions. + */ +ir_visitor_status +ir_if_simplification_visitor::visit_enter(ir_assignment *ir) +{ + (void) ir; + return visit_continue_with_parent; +} + bool do_if_simplification(exec_list *instructions) { @@ -55,6 +66,14 @@ do_if_simplification(exec_list *instructions) ir_visitor_status ir_if_simplification_visitor::visit_leave(ir_if *ir) { + /* If the if statement has nothing on either side, remove it. */ + if (ir->then_instructions.is_empty() && + ir->else_instructions.is_empty()) { + ir->remove(); + this->made_progress = true; + return visit_continue; + } + /* FINISHME: Ideally there would be a way to note that the condition results * FINISHME: in a constant before processing both of the other subtrees. * FINISHME: This can probably be done with some flags, but it would take