noreturn.ll 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. ; Test the static branch probability heuristics for no-return functions.
  2. ; RUN: opt < %s -analyze -branch-prob | FileCheck %s
  3. declare void @abort() noreturn
  4. define i32 @test1(i32 %a, i32 %b) {
  5. ; CHECK: Printing analysis {{.*}} for function 'test1'
  6. entry:
  7. %cond = icmp eq i32 %a, 42
  8. br i1 %cond, label %exit, label %abort
  9. ; CHECK: edge entry -> exit probability is 1048575 / 1048576
  10. ; CHECK: edge entry -> abort probability is 1 / 1048576
  11. abort:
  12. call void @abort() noreturn
  13. unreachable
  14. exit:
  15. ret i32 %b
  16. }
  17. define i32 @test2(i32 %a, i32 %b) {
  18. ; CHECK: Printing analysis {{.*}} for function 'test2'
  19. entry:
  20. switch i32 %a, label %exit [i32 1, label %case_a
  21. i32 2, label %case_b
  22. i32 3, label %case_c
  23. i32 4, label %case_d]
  24. ; CHECK: edge entry -> exit probability is 1048575 / 1048579
  25. ; CHECK: edge entry -> case_a probability is 1 / 1048579
  26. ; CHECK: edge entry -> case_b probability is 1 / 1048579
  27. ; CHECK: edge entry -> case_c probability is 1 / 1048579
  28. ; CHECK: edge entry -> case_d probability is 1 / 1048579
  29. case_a:
  30. br label %case_b
  31. case_b:
  32. br label %case_c
  33. case_c:
  34. br label %case_d
  35. case_d:
  36. call void @abort() noreturn
  37. unreachable
  38. exit:
  39. ret i32 %b
  40. }
  41. define i32 @test3(i32 %a, i32 %b) {
  42. ; CHECK: Printing analysis {{.*}} for function 'test3'
  43. ; Make sure we unify across multiple conditional branches.
  44. entry:
  45. %cond1 = icmp eq i32 %a, 42
  46. br i1 %cond1, label %exit, label %dom
  47. ; CHECK: edge entry -> exit probability is 1048575 / 1048576
  48. ; CHECK: edge entry -> dom probability is 1 / 1048576
  49. dom:
  50. %cond2 = icmp ult i32 %a, 42
  51. br i1 %cond2, label %idom1, label %idom2
  52. ; CHECK: edge dom -> idom1 probability is 1 / 2
  53. ; CHECK: edge dom -> idom2 probability is 1 / 2
  54. idom1:
  55. br label %abort
  56. idom2:
  57. br label %abort
  58. abort:
  59. call void @abort() noreturn
  60. unreachable
  61. exit:
  62. ret i32 %b
  63. }