loop_unswitch_pass.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // Copyright (c) 2018 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. #ifndef SOURCE_OPT_LOOP_UNSWITCH_PASS_H_
  15. #define SOURCE_OPT_LOOP_UNSWITCH_PASS_H_
  16. #include "source/opt/loop_descriptor.h"
  17. #include "source/opt/pass.h"
  18. namespace spvtools {
  19. namespace opt {
  20. // Implements the loop unswitch optimization.
  21. // The loop unswitch hoists invariant "if" statements if the conditions are
  22. // constant within the loop and clones the loop for each branch.
  23. class LoopUnswitchPass : public Pass {
  24. public:
  25. const char* name() const override { return "loop-unswitch"; }
  26. // Processes the given |module|. Returns Status::Failure if errors occur when
  27. // processing. Returns the corresponding Status::Success if processing is
  28. // successful to indicate whether changes have been made to the module.
  29. Pass::Status Process() override;
  30. private:
  31. bool ProcessFunction(Function* f);
  32. };
  33. } // namespace opt
  34. } // namespace spvtools
  35. #endif // SOURCE_OPT_LOOP_UNSWITCH_PASS_H_