trunc.ll 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
  3. ; Instcombine should be able to eliminate all of these ext casts.
  4. declare void @use(i32)
  5. define i64 @test1(i64 %a) {
  6. %b = trunc i64 %a to i32
  7. %c = and i32 %b, 15
  8. %d = zext i32 %c to i64
  9. call void @use(i32 %b)
  10. ret i64 %d
  11. ; CHECK-LABEL: @test1(
  12. ; CHECK-NOT: ext
  13. ; CHECK: ret
  14. }
  15. define i64 @test2(i64 %a) {
  16. %b = trunc i64 %a to i32
  17. %c = shl i32 %b, 4
  18. %q = ashr i32 %c, 4
  19. %d = sext i32 %q to i64
  20. call void @use(i32 %b)
  21. ret i64 %d
  22. ; CHECK-LABEL: @test2(
  23. ; CHECK: shl i64 %a, 36
  24. ; CHECK: %d = ashr exact i64 {{.*}}, 36
  25. ; CHECK: ret i64 %d
  26. }
  27. define i64 @test3(i64 %a) {
  28. %b = trunc i64 %a to i32
  29. %c = and i32 %b, 8
  30. %d = zext i32 %c to i64
  31. call void @use(i32 %b)
  32. ret i64 %d
  33. ; CHECK-LABEL: @test3(
  34. ; CHECK-NOT: ext
  35. ; CHECK: ret
  36. }
  37. define i64 @test4(i64 %a) {
  38. %b = trunc i64 %a to i32
  39. %c = and i32 %b, 8
  40. %x = xor i32 %c, 8
  41. %d = zext i32 %x to i64
  42. call void @use(i32 %b)
  43. ret i64 %d
  44. ; CHECK-LABEL: @test4(
  45. ; CHECK: = and i64 %a, 8
  46. ; CHECK: = xor i64 {{.*}}, 8
  47. ; CHECK-NOT: ext
  48. ; CHECK: ret
  49. }
  50. define i32 @test5(i32 %A) {
  51. %B = zext i32 %A to i128
  52. %C = lshr i128 %B, 16
  53. %D = trunc i128 %C to i32
  54. ret i32 %D
  55. ; CHECK-LABEL: @test5(
  56. ; CHECK: %C = lshr i32 %A, 16
  57. ; CHECK: ret i32 %C
  58. }
  59. define i32 @test6(i64 %A) {
  60. %B = zext i64 %A to i128
  61. %C = lshr i128 %B, 32
  62. %D = trunc i128 %C to i32
  63. ret i32 %D
  64. ; CHECK-LABEL: @test6(
  65. ; CHECK: %C = lshr i64 %A, 32
  66. ; CHECK: %D = trunc i64 %C to i32
  67. ; CHECK: ret i32 %D
  68. }
  69. define i92 @test7(i64 %A) {
  70. %B = zext i64 %A to i128
  71. %C = lshr i128 %B, 32
  72. %D = trunc i128 %C to i92
  73. ret i92 %D
  74. ; CHECK-LABEL: @test7(
  75. ; CHECK: %B = zext i64 %A to i92
  76. ; CHECK: %C = lshr i92 %B, 32
  77. ; CHECK: ret i92 %C
  78. }
  79. define i64 @test8(i32 %A, i32 %B) {
  80. %tmp38 = zext i32 %A to i128
  81. %tmp32 = zext i32 %B to i128
  82. %tmp33 = shl i128 %tmp32, 32
  83. %ins35 = or i128 %tmp33, %tmp38
  84. %tmp42 = trunc i128 %ins35 to i64
  85. ret i64 %tmp42
  86. ; CHECK-LABEL: @test8(
  87. ; CHECK: %tmp38 = zext i32 %A to i64
  88. ; CHECK: %tmp32 = zext i32 %B to i64
  89. ; CHECK: %tmp33 = shl nuw i64 %tmp32, 32
  90. ; CHECK: %ins35 = or i64 %tmp33, %tmp38
  91. ; CHECK: ret i64 %ins35
  92. }
  93. define i8 @test9(i32 %X) {
  94. %Y = and i32 %X, 42
  95. %Z = trunc i32 %Y to i8
  96. ret i8 %Z
  97. ; CHECK-LABEL: @test9(
  98. ; CHECK: trunc
  99. ; CHECK: and
  100. ; CHECK: ret
  101. }
  102. ; rdar://8808586
  103. define i8 @test10(i32 %X) {
  104. %Y = trunc i32 %X to i8
  105. %Z = and i8 %Y, 42
  106. ret i8 %Z
  107. ; CHECK-LABEL: @test10(
  108. ; CHECK: trunc
  109. ; CHECK: and
  110. ; CHECK: ret
  111. }