Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===-- MakeGuardsExplicit.h - Turn guard intrinsics into guard branches --===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This pass lowers the @llvm.experimental.guard intrinsic to the new form of
  10. // guard represented as widenable explicit branch to the deopt block. The
  11. // difference between this pass and LowerGuardIntrinsic is that after this pass
  12. // the guard represented as intrinsic:
  13. //
  14. //   call void(i1, ...) @llvm.experimental.guard(i1 %old_cond) [ "deopt"() ]
  15. //
  16. // transforms to a guard represented as widenable explicit branch:
  17. //
  18. //   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
  19. //   br i1 (%old_cond & %widenable_cond), label %guarded, label %deopt
  20. //
  21. // Here:
  22. //   - The semantics of @llvm.experimental.widenable.condition allows to replace
  23. //     %widenable_cond with the construction (%widenable_cond & %any_other_cond)
  24. //     without loss of correctness;
  25. //   - %guarded is the lower part of old guard intrinsic's parent block split by
  26. //     the intrinsic call;
  27. //   - %deopt is a block containing a sole call to @llvm.experimental.deoptimize
  28. //     intrinsic.
  29. //
  30. // Therefore, this branch preserves the property of widenability.
  31. //
  32. //===----------------------------------------------------------------------===//
  33. #ifndef LLVM_TRANSFORMS_SCALAR_MAKEGUARDSEXPLICIT_H
  34. #define LLVM_TRANSFORMS_SCALAR_MAKEGUARDSEXPLICIT_H
  35.  
  36. #include "llvm/IR/PassManager.h"
  37.  
  38. namespace llvm {
  39.  
  40. struct MakeGuardsExplicitPass : public PassInfoMixin<MakeGuardsExplicitPass> {
  41.   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
  42. };
  43.  
  44. } // namespace llvm
  45.  
  46. #endif // LLVM_TRANSFORMS_SCALAR_MAKEGUARDSEXPLICIT_H
  47.