conditional.ll 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. ; RUN: opt -early-cse -S < %s | FileCheck %s
  2. ; Can we CSE a known condition to a constant?
  3. define i1 @test(i8* %p) {
  4. ; CHECK-LABEL: @test
  5. entry:
  6. %cnd1 = icmp eq i8* %p, null
  7. br i1 %cnd1, label %taken, label %untaken
  8. taken:
  9. ; CHECK-LABEL: taken:
  10. ; CHECK-NEXT: ret i1 true
  11. %cnd2 = icmp eq i8* %p, null
  12. ret i1 %cnd2
  13. untaken:
  14. ; CHECK-LABEL: untaken:
  15. ; CHECK-NEXT: ret i1 false
  16. %cnd3 = icmp eq i8* %p, null
  17. ret i1 %cnd3
  18. }
  19. ; We can CSE the condition, but we *don't* know it's value after the merge
  20. define i1 @test_neg1(i8* %p) {
  21. ; CHECK-LABEL: @test_neg1
  22. entry:
  23. %cnd1 = icmp eq i8* %p, null
  24. br i1 %cnd1, label %taken, label %untaken
  25. taken:
  26. br label %merge
  27. untaken:
  28. br label %merge
  29. merge:
  30. ; CHECK-LABEL: merge:
  31. ; CHECK-NEXT: ret i1 %cnd1
  32. %cnd3 = icmp eq i8* %p, null
  33. ret i1 %cnd3
  34. }
  35. ; Check specifically for a case where we have a unique predecessor, but
  36. ; not a single predecessor. We can not know the value of the condition here.
  37. define i1 @test_neg2(i8* %p) {
  38. ; CHECK-LABEL: @test_neg2
  39. entry:
  40. %cnd1 = icmp eq i8* %p, null
  41. br i1 %cnd1, label %merge, label %merge
  42. merge:
  43. ; CHECK-LABEL: merge:
  44. ; CHECK-NEXT: ret i1 %cnd1
  45. %cnd3 = icmp eq i8* %p, null
  46. ret i1 %cnd3
  47. }
  48. ; Replace a use rather than CSE
  49. define i1 @test2(i8* %p) {
  50. ; CHECK-LABEL: @test2
  51. entry:
  52. %cnd = icmp eq i8* %p, null
  53. br i1 %cnd, label %taken, label %untaken
  54. taken:
  55. ; CHECK-LABEL: taken:
  56. ; CHECK-NEXT: ret i1 true
  57. ret i1 %cnd
  58. untaken:
  59. ; CHECK-LABEL: untaken:
  60. ; CHECK-NEXT: ret i1 false
  61. ret i1 %cnd
  62. }
  63. ; Not legal to replace use given it's not dominated by edge
  64. define i1 @test2_neg1(i8* %p) {
  65. ; CHECK-LABEL: @test2_neg1
  66. entry:
  67. %cnd1 = icmp eq i8* %p, null
  68. br i1 %cnd1, label %taken, label %untaken
  69. taken:
  70. br label %merge
  71. untaken:
  72. br label %merge
  73. merge:
  74. ; CHECK-LABEL: merge:
  75. ; CHECK-NEXT: ret i1 %cnd1
  76. ret i1 %cnd1
  77. }
  78. ; Another single predecessor test, but for dominated use
  79. define i1 @test2_neg2(i8* %p) {
  80. ; CHECK-LABEL: @test2_neg2
  81. entry:
  82. %cnd1 = icmp eq i8* %p, null
  83. br i1 %cnd1, label %merge, label %merge
  84. merge:
  85. ; CHECK-LABEL: merge:
  86. ; CHECK-NEXT: ret i1 %cnd1
  87. ret i1 %cnd1
  88. }