exact-nsw-nuw.ll 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. ; RUN: opt < %s -instsimplify -S | FileCheck %s
  2. ; PR8862
  3. ; CHECK-LABEL: @shift1(
  4. ; CHECK: ret i32 %A
  5. define i32 @shift1(i32 %A, i32 %B) {
  6. %C = lshr exact i32 %A, %B
  7. %D = shl nuw i32 %C, %B
  8. ret i32 %D
  9. }
  10. ; CHECK-LABEL: @shift2(
  11. ; CHECK: lshr
  12. ; CHECK: ret i32 %D
  13. define i32 @shift2(i32 %A, i32 %B) {
  14. %C = lshr i32 %A, %B
  15. %D = shl nuw i32 %C, %B
  16. ret i32 %D
  17. }
  18. ; CHECK-LABEL: @shift3(
  19. ; CHECK: ret i32 %A
  20. define i32 @shift3(i32 %A, i32 %B) {
  21. %C = ashr exact i32 %A, %B
  22. %D = shl nuw i32 %C, %B
  23. ret i32 %D
  24. }
  25. ; CHECK-LABEL: @shift4(
  26. ; CHECK: ret i32 %A
  27. define i32 @shift4(i32 %A, i32 %B) {
  28. %C = shl nuw i32 %A, %B
  29. %D = lshr i32 %C, %B
  30. ret i32 %D
  31. }
  32. ; CHECK-LABEL: @shift5(
  33. ; CHECK: ret i32 %A
  34. define i32 @shift5(i32 %A, i32 %B) {
  35. %C = shl nsw i32 %A, %B
  36. %D = ashr i32 %C, %B
  37. ret i32 %D
  38. }
  39. ; CHECK-LABEL: @div1(
  40. ; CHECK: ret i32 0
  41. define i32 @div1(i32 %V) {
  42. %A = udiv i32 %V, -2147483648
  43. %B = udiv i32 %A, -2147483648
  44. ret i32 %B
  45. }
  46. ; CHECK-LABEL: @div2(
  47. ; CHECK-NOT: ret i32 0
  48. define i32 @div2(i32 %V) {
  49. %A = sdiv i32 %V, -1
  50. %B = sdiv i32 %A, -2147483648
  51. ret i32 %B
  52. }