set.ll 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. ; This test makes sure that these instructions are properly eliminated.
  2. ;
  3. ; RUN: opt < %s -instcombine -S | not grep icmp
  4. ; END.
  5. @X = external global i32 ; <i32*> [#uses=2]
  6. define i1 @test1(i32 %A) {
  7. %B = icmp eq i32 %A, %A ; <i1> [#uses=1]
  8. ; Never true
  9. %C = icmp eq i32* @X, null ; <i1> [#uses=1]
  10. %D = and i1 %B, %C ; <i1> [#uses=1]
  11. ret i1 %D
  12. }
  13. define i1 @test2(i32 %A) {
  14. %B = icmp ne i32 %A, %A ; <i1> [#uses=1]
  15. ; Never false
  16. %C = icmp ne i32* @X, null ; <i1> [#uses=1]
  17. %D = or i1 %B, %C ; <i1> [#uses=1]
  18. ret i1 %D
  19. }
  20. define i1 @test3(i32 %A) {
  21. %B = icmp slt i32 %A, %A ; <i1> [#uses=1]
  22. ret i1 %B
  23. }
  24. define i1 @test4(i32 %A) {
  25. %B = icmp sgt i32 %A, %A ; <i1> [#uses=1]
  26. ret i1 %B
  27. }
  28. define i1 @test5(i32 %A) {
  29. %B = icmp sle i32 %A, %A ; <i1> [#uses=1]
  30. ret i1 %B
  31. }
  32. define i1 @test6(i32 %A) {
  33. %B = icmp sge i32 %A, %A ; <i1> [#uses=1]
  34. ret i1 %B
  35. }
  36. define i1 @test7(i32 %A) {
  37. ; true
  38. %B = icmp uge i32 %A, 0 ; <i1> [#uses=1]
  39. ret i1 %B
  40. }
  41. define i1 @test8(i32 %A) {
  42. ; false
  43. %B = icmp ult i32 %A, 0 ; <i1> [#uses=1]
  44. ret i1 %B
  45. }
  46. ;; test operations on boolean values these should all be eliminated$a
  47. define i1 @test9(i1 %A) {
  48. ; false
  49. %B = icmp ult i1 %A, false ; <i1> [#uses=1]
  50. ret i1 %B
  51. }
  52. define i1 @test10(i1 %A) {
  53. ; false
  54. %B = icmp ugt i1 %A, true ; <i1> [#uses=1]
  55. ret i1 %B
  56. }
  57. define i1 @test11(i1 %A) {
  58. ; true
  59. %B = icmp ule i1 %A, true ; <i1> [#uses=1]
  60. ret i1 %B
  61. }
  62. define i1 @test12(i1 %A) {
  63. ; true
  64. %B = icmp uge i1 %A, false ; <i1> [#uses=1]
  65. ret i1 %B
  66. }
  67. define i1 @test13(i1 %A, i1 %B) {
  68. ; A | ~B
  69. %C = icmp uge i1 %A, %B ; <i1> [#uses=1]
  70. ret i1 %C
  71. }
  72. define i1 @test14(i1 %A, i1 %B) {
  73. ; ~(A ^ B)
  74. %C = icmp eq i1 %A, %B ; <i1> [#uses=1]
  75. ret i1 %C
  76. }
  77. define i1 @test16(i32 %A) {
  78. %B = and i32 %A, 5 ; <i32> [#uses=1]
  79. ; Is never true
  80. %C = icmp eq i32 %B, 8 ; <i1> [#uses=1]
  81. ret i1 %C
  82. }
  83. define i1 @test17(i8 %A) {
  84. %B = or i8 %A, 1 ; <i8> [#uses=1]
  85. ; Always false
  86. %C = icmp eq i8 %B, 2 ; <i1> [#uses=1]
  87. ret i1 %C
  88. }
  89. define i1 @test18(i1 %C, i32 %a) {
  90. entry:
  91. br i1 %C, label %endif, label %else
  92. else: ; preds = %entry
  93. br label %endif
  94. endif: ; preds = %else, %entry
  95. %b.0 = phi i32 [ 0, %entry ], [ 1, %else ] ; <i32> [#uses=1]
  96. %tmp.4 = icmp slt i32 %b.0, 123 ; <i1> [#uses=1]
  97. ret i1 %tmp.4
  98. }
  99. define i1 @test19(i1 %A, i1 %B) {
  100. %a = zext i1 %A to i32 ; <i32> [#uses=1]
  101. %b = zext i1 %B to i32 ; <i32> [#uses=1]
  102. %C = icmp eq i32 %a, %b ; <i1> [#uses=1]
  103. ret i1 %C
  104. }
  105. define i32 @test20(i32 %A) {
  106. %B = and i32 %A, 1 ; <i32> [#uses=1]
  107. %C = icmp ne i32 %B, 0 ; <i1> [#uses=1]
  108. %D = zext i1 %C to i32 ; <i32> [#uses=1]
  109. ret i32 %D
  110. }
  111. define i32 @test21(i32 %a) {
  112. %tmp.6 = and i32 %a, 4 ; <i32> [#uses=1]
  113. %not.tmp.7 = icmp ne i32 %tmp.6, 0 ; <i1> [#uses=1]
  114. %retval = zext i1 %not.tmp.7 to i32 ; <i32> [#uses=1]
  115. ret i32 %retval
  116. }
  117. define i1 @test22(i32 %A, i32 %X) {
  118. %B = and i32 %A, 100663295 ; <i32> [#uses=1]
  119. %C = icmp ult i32 %B, 268435456 ; <i1> [#uses=1]
  120. %Y = and i32 %X, 7 ; <i32> [#uses=1]
  121. %Z = icmp sgt i32 %Y, -1 ; <i1> [#uses=1]
  122. %R = or i1 %C, %Z ; <i1> [#uses=1]
  123. ret i1 %R
  124. }
  125. define i32 @test23(i32 %a) {
  126. %tmp.1 = and i32 %a, 1 ; <i32> [#uses=1]
  127. %tmp.2 = icmp eq i32 %tmp.1, 0 ; <i1> [#uses=1]
  128. %tmp.3 = zext i1 %tmp.2 to i32 ; <i32> [#uses=1]
  129. ret i32 %tmp.3
  130. }
  131. define i32 @test24(i32 %a) {
  132. %tmp1 = and i32 %a, 4 ; <i32> [#uses=1]
  133. %tmp.1 = lshr i32 %tmp1, 2 ; <i32> [#uses=1]
  134. %tmp.2 = icmp eq i32 %tmp.1, 0 ; <i1> [#uses=1]
  135. %tmp.3 = zext i1 %tmp.2 to i32 ; <i32> [#uses=1]
  136. ret i32 %tmp.3
  137. }
  138. define i1 @test25(i32 %A) {
  139. %B = and i32 %A, 2 ; <i32> [#uses=1]
  140. %C = icmp ugt i32 %B, 2 ; <i1> [#uses=1]
  141. ret i1 %C
  142. }