preheader-safe.ll 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. ; RUN: opt -S -licm < %s | FileCheck %s
  2. declare void @use_nothrow(i64 %a) nounwind
  3. declare void @use(i64 %a)
  4. define void @nothrow(i64 %x, i64 %y, i1* %cond) {
  5. ; CHECK-LABEL: nothrow
  6. ; CHECK-LABEL: entry
  7. ; CHECK: %div = udiv i64 %x, %y
  8. ; CHECK-LABEL: loop
  9. ; CHECK: call void @use_nothrow(i64 %div)
  10. entry:
  11. br label %loop
  12. loop: ; preds = %entry, %for.inc
  13. %div = udiv i64 %x, %y
  14. call void @use_nothrow(i64 %div)
  15. br label %loop
  16. }
  17. ; Negative test
  18. define void @throw_header(i64 %x, i64 %y, i1* %cond) {
  19. ; CHECK-LABEL: throw_header
  20. ; CHECK-LABEL: loop
  21. ; CHECK: %div = udiv i64 %x, %y
  22. ; CHECK: call void @use(i64 %div)
  23. entry:
  24. br label %loop
  25. loop: ; preds = %entry, %for.inc
  26. %div = udiv i64 %x, %y
  27. call void @use(i64 %div)
  28. br label %loop
  29. }
  30. ; The header is known no throw, but the loop is not. We can
  31. ; still lift out of the header.
  32. define void @nothrow_header(i64 %x, i64 %y, i1 %cond) {
  33. ; CHECK-LABEL: nothrow_header
  34. ; CHECK-LABEL: entry
  35. ; CHECK: %div = udiv i64 %x, %y
  36. ; CHECK-LABEL: loop
  37. ; CHECK: call void @use(i64 %div)
  38. entry:
  39. br label %loop
  40. loop: ; preds = %entry, %for.inc
  41. %div = udiv i64 %x, %y
  42. br i1 %cond, label %loop-if, label %exit
  43. loop-if:
  44. call void @use(i64 %div)
  45. br label %loop
  46. exit:
  47. ret void
  48. }
  49. ; Negative test - can't move out of throwing block
  50. define void @nothrow_header_neg(i64 %x, i64 %y, i1 %cond) {
  51. ; CHECK-LABEL: nothrow_header_neg
  52. ; CHECK-LABEL: entry
  53. ; CHECK-LABEL: loop
  54. ; CHECK: %div = udiv i64 %x, %y
  55. ; CHECK: call void @use(i64 %div)
  56. entry:
  57. br label %loop
  58. loop: ; preds = %entry, %for.inc
  59. br label %loop-if
  60. loop-if:
  61. %div = udiv i64 %x, %y
  62. call void @use(i64 %div)
  63. br label %loop
  64. }