select-cmp-br.ll 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. ; Replace a 'select' with 'or' in 'select - cmp [eq|ne] - br' sequence
  2. ; RUN: opt -instcombine -S < %s | FileCheck %s
  3. %C = type <{ %struct.S }>
  4. %struct.S = type { i64*, i32, i32 }
  5. declare void @bar(%struct.S *) #1
  6. declare void @foobar()
  7. define void @test1(%C*) {
  8. entry:
  9. %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
  10. %m = load i64*, i64** %1, align 8
  11. %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
  12. %n = load i64*, i64** %2, align 8
  13. %3 = getelementptr inbounds i64, i64* %m, i64 9
  14. %4 = bitcast i64* %3 to i64 (%C*)**
  15. %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
  16. %6 = icmp eq i64* %m, %n
  17. %7 = select i1 %6, %C* %0, %C* null
  18. %8 = icmp eq %C* %7, null
  19. br i1 %8, label %12, label %10
  20. ; <label>:9 ; preds = %10, %12
  21. ret void
  22. ; <label>:10 ; preds = %entry
  23. %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
  24. tail call void @bar(%struct.S* %11)
  25. br label %9
  26. ; <label>:12 ; preds = %entry
  27. %13 = tail call i64 %5(%C* %0)
  28. br label %9
  29. ; CHECK-LABEL: @test1(
  30. ; CHECK-NOT: select
  31. ; CHECK: or
  32. ; CHECK-NOT: select
  33. }
  34. define void @test2(%C*) {
  35. entry:
  36. %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
  37. %m = load i64*, i64** %1, align 8
  38. %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
  39. %n = load i64*, i64** %2, align 8
  40. %3 = getelementptr inbounds i64, i64* %m, i64 9
  41. %4 = bitcast i64* %3 to i64 (%C*)**
  42. %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
  43. %6 = icmp eq i64* %m, %n
  44. %7 = select i1 %6, %C* null, %C* %0
  45. %8 = icmp eq %C* %7, null
  46. br i1 %8, label %12, label %10
  47. ; <label>:9 ; preds = %10, %12
  48. ret void
  49. ; <label>:10 ; preds = %entry
  50. %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
  51. tail call void @bar(%struct.S* %11)
  52. br label %9
  53. ; <label>:12 ; preds = %entry
  54. %13 = tail call i64 %5(%C* %0)
  55. br label %9
  56. ; CHECK-LABEL: @test2(
  57. ; CHECK-NOT: select
  58. ; CHECK: or
  59. ; CHECK-NOT: select
  60. }
  61. define void @test3(%C*) {
  62. entry:
  63. %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
  64. %m = load i64*, i64** %1, align 8
  65. %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
  66. %n = load i64*, i64** %2, align 8
  67. %3 = getelementptr inbounds i64, i64* %m, i64 9
  68. %4 = bitcast i64* %3 to i64 (%C*)**
  69. %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
  70. %6 = icmp eq i64* %m, %n
  71. %7 = select i1 %6, %C* %0, %C* null
  72. %8 = icmp ne %C* %7, null
  73. br i1 %8, label %10, label %12
  74. ; <label>:9 ; preds = %10, %12
  75. ret void
  76. ; <label>:10 ; preds = %entry
  77. %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
  78. tail call void @bar(%struct.S* %11)
  79. br label %9
  80. ; <label>:12 ; preds = %entry
  81. %13 = tail call i64 %5(%C* %0)
  82. br label %9
  83. ; CHECK-LABEL: @test3(
  84. ; CHECK-NOT: select
  85. ; CHECK: or
  86. ; CHECK-NOT: select
  87. }
  88. define void @test4(%C*) {
  89. entry:
  90. %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
  91. %m = load i64*, i64** %1, align 8
  92. %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
  93. %n = load i64*, i64** %2, align 8
  94. %3 = getelementptr inbounds i64, i64* %m, i64 9
  95. %4 = bitcast i64* %3 to i64 (%C*)**
  96. %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
  97. %6 = icmp eq i64* %m, %n
  98. %7 = select i1 %6, %C* null, %C* %0
  99. %8 = icmp ne %C* %7, null
  100. br i1 %8, label %10, label %12
  101. ; <label>:9 ; preds = %10, %12
  102. ret void
  103. ; <label>:10 ; preds = %entry
  104. %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
  105. tail call void @bar(%struct.S* %11)
  106. br label %9
  107. ; <label>:12 ; preds = %entry
  108. %13 = tail call i64 %5(%C* %0)
  109. br label %9
  110. ; CHECK-LABEL: @test4(
  111. ; CHECK-NOT: select
  112. ; CHECK: or
  113. ; CHECK-NOT: select
  114. }
  115. define void @test5(%C*, i1) {
  116. entry:
  117. %2 = select i1 %1, %C* null, %C* %0
  118. %3 = icmp ne %C* %2, null
  119. br i1 %3, label %5, label %7
  120. ; <label>:4 ; preds = %10, %12
  121. ret void
  122. ; <label>:5 ; preds = %entry
  123. %6 = getelementptr inbounds %C, %C* %2, i64 0, i32 0
  124. tail call void @bar(%struct.S* %6)
  125. br label %4
  126. ; <label>:7 ; preds = %entry
  127. tail call void @foobar()
  128. br label %4
  129. ; CHECK-LABEL: @test5(
  130. ; CHECK-NOT: select
  131. ; CHECK: or
  132. ; CHECK-NOT: select
  133. }