1 // Copyright (c) 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "source/reduce/remove_block_reduction_opportunity.h"
16
17 #include "source/opt/ir_context.h"
18
19 namespace spvtools {
20 namespace reduce {
21
22 using opt::BasicBlock;
23 using opt::Function;
24
RemoveBlockReductionOpportunity(Function * function,BasicBlock * block)25 RemoveBlockReductionOpportunity::RemoveBlockReductionOpportunity(
26 Function* function, BasicBlock* block)
27 : function_(function), block_(block) {
28 // precondition:
29 assert(block_->begin() != block_->end() &&
30 block_->begin()->context()->get_def_use_mgr()->NumUsers(
31 block_->id()) == 0 &&
32 "RemoveBlockReductionOpportunity block must have 0 references");
33 }
34
PreconditionHolds()35 bool RemoveBlockReductionOpportunity::PreconditionHolds() {
36 // Removing other blocks cannot disable this opportunity.
37 return true;
38 }
39
Apply()40 void RemoveBlockReductionOpportunity::Apply() {
41 // We need an iterator pointing to the block, hence the loop.
42 for (auto bi = function_->begin(); bi != function_->end(); ++bi) {
43 if (bi->id() == block_->id()) {
44 bi->KillAllInsts(true);
45 bi.Erase();
46 // Block removal changes the function, but we don't use analyses, so no
47 // need to invalidate them.
48 return;
49 }
50 }
51
52 assert(false &&
53 "Unreachable: we should have found a block with the desired id.");
54 }
55
56 } // namespace reduce
57 } // namespace spvtools
58