logical-select.ll 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. define i32 @foo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
  3. %e = icmp slt i32 %a, %b
  4. %f = sext i1 %e to i32
  5. %g = and i32 %c, %f
  6. %h = xor i32 %f, -1
  7. %i = and i32 %d, %h
  8. %j = or i32 %g, %i
  9. ret i32 %j
  10. ; CHECK: %e = icmp slt i32 %a, %b
  11. ; CHECK-NEXT: [[result:%.*]] = select i1 %e, i32 %c, i32 %d
  12. ; CHECK-NEXT: ret i32 [[result]]
  13. }
  14. define i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
  15. %e = icmp slt i32 %a, %b
  16. %f = sext i1 %e to i32
  17. %g = and i32 %c, %f
  18. %h = xor i32 %f, -1
  19. %i = and i32 %d, %h
  20. %j = or i32 %i, %g
  21. ret i32 %j
  22. ; CHECK: %e = icmp slt i32 %a, %b
  23. ; CHECK-NEXT: [[result:%.*]] = select i1 %e, i32 %c, i32 %d
  24. ; CHECK-NEXT: ret i32 [[result]]
  25. }
  26. define i32 @goo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
  27. entry:
  28. %0 = icmp slt i32 %a, %b
  29. %iftmp.0.0 = select i1 %0, i32 -1, i32 0
  30. %1 = and i32 %iftmp.0.0, %c
  31. %not = xor i32 %iftmp.0.0, -1
  32. %2 = and i32 %not, %d
  33. %3 = or i32 %1, %2
  34. ret i32 %3
  35. ; CHECK: %0 = icmp slt i32 %a, %b
  36. ; CHECK-NEXT: [[result:%.*]] = select i1 %0, i32 %c, i32 %d
  37. ; CHECK-NEXT: ret i32 [[result]]
  38. }
  39. define i32 @poo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
  40. entry:
  41. %0 = icmp slt i32 %a, %b
  42. %iftmp.0.0 = select i1 %0, i32 -1, i32 0
  43. %1 = and i32 %iftmp.0.0, %c
  44. %iftmp = select i1 %0, i32 0, i32 -1
  45. %2 = and i32 %iftmp, %d
  46. %3 = or i32 %1, %2
  47. ret i32 %3
  48. ; CHECK: %0 = icmp slt i32 %a, %b
  49. ; CHECK-NEXT: [[result:%.*]] = select i1 %0, i32 %c, i32 %d
  50. ; CHECK-NEXT: ret i32 [[result]]
  51. }
  52. define i32 @par(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
  53. entry:
  54. %0 = icmp slt i32 %a, %b
  55. %iftmp.1.0 = select i1 %0, i32 -1, i32 0
  56. %1 = and i32 %iftmp.1.0, %c
  57. %not = xor i32 %iftmp.1.0, -1
  58. %2 = and i32 %not, %d
  59. %3 = or i32 %1, %2
  60. ret i32 %3
  61. ; CHECK: %0 = icmp slt i32 %a, %b
  62. ; CHECK-NEXT: [[result:%.*]] = select i1 %0, i32 %c, i32 %d
  63. ; CHECK-NEXT: ret i32 [[result]]
  64. }